wu-framework 2.1.1 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +6 -1
  2. package/dist/adapters/alpine/index.d.ts +1 -1
  3. package/dist/adapters/angular/index.d.ts +1 -1
  4. package/dist/adapters/htmx/index.d.ts +1 -1
  5. package/dist/adapters/lit/index.d.ts +1 -1
  6. package/dist/adapters/lit/index.js +2 -2
  7. package/dist/adapters/lit/index.js.map +1 -1
  8. package/dist/adapters/preact/index.d.ts +1 -1
  9. package/dist/adapters/preact/index.js +1 -1
  10. package/dist/adapters/preact/index.js.map +1 -1
  11. package/dist/adapters/qwik/index.d.ts +3 -10
  12. package/dist/adapters/qwik/index.js +1 -1
  13. package/dist/adapters/qwik/index.js.map +1 -1
  14. package/dist/adapters/react/index.js +1 -1
  15. package/dist/adapters/react/index.js.map +1 -1
  16. package/dist/adapters/shared.d.ts +44 -0
  17. package/dist/adapters/shared.js +1 -1
  18. package/dist/adapters/shared.js.map +1 -1
  19. package/dist/adapters/solid/index.d.ts +1 -1
  20. package/dist/adapters/solid/index.js +1 -1
  21. package/dist/adapters/solid/index.js.map +1 -1
  22. package/dist/adapters/stencil/index.d.ts +1 -1
  23. package/dist/adapters/stimulus/index.d.ts +1 -1
  24. package/dist/adapters/svelte/index.d.ts +1 -1
  25. package/dist/adapters/svelte/index.js +1 -1
  26. package/dist/adapters/svelte/index.js.map +1 -1
  27. package/dist/adapters/vanilla/index.d.ts +1 -1
  28. package/dist/adapters/vanilla/index.js +1 -1
  29. package/dist/adapters/vanilla/index.js.map +1 -1
  30. package/dist/adapters/vue/index.js +1 -1
  31. package/dist/adapters/vue/index.js.map +1 -1
  32. package/dist/ai/wu-ai.js +1 -1
  33. package/dist/ai/wu-ai.js.map +1 -1
  34. package/dist/core/wu-devtools.js +2 -0
  35. package/dist/core/wu-devtools.js.map +1 -0
  36. package/dist/core/wu-html-parser.js +1 -1
  37. package/dist/core/wu-html-parser.js.map +1 -1
  38. package/dist/core/wu-iframe-sandbox.js +1 -1
  39. package/dist/core/wu-iframe-sandbox.js.map +1 -1
  40. package/dist/core/wu-loader.js +1 -1
  41. package/dist/core/wu-loader.js.map +1 -1
  42. package/dist/core/wu-logger.js +2 -0
  43. package/dist/core/wu-logger.js.map +1 -0
  44. package/dist/core/wu-mcp-bridge.js +1 -1
  45. package/dist/core/wu-mcp-bridge.js.map +1 -1
  46. package/dist/core/wu-script-executor.js +1 -1
  47. package/dist/core/wu-script-executor.js.map +1 -1
  48. package/dist/core/wu-store-sync.js +2 -0
  49. package/dist/core/wu-store-sync.js.map +1 -0
  50. package/dist/core/wu-timeline.js +2 -0
  51. package/dist/core/wu-timeline.js.map +1 -0
  52. package/dist/index.d.cts +739 -0
  53. package/dist/index.d.ts +295 -1
  54. package/dist/wu-ai-browser-primitives-CaUCk1Xl.js +2 -0
  55. package/dist/wu-ai-browser-primitives-CaUCk1Xl.js.map +1 -0
  56. package/dist/wu-framework.cjs +3 -0
  57. package/dist/wu-framework.cjs.map +1 -0
  58. package/dist/wu-framework.dev.js +1207 -275
  59. package/dist/wu-framework.dev.js.map +1 -1
  60. package/dist/wu-framework.esm.js +2 -2
  61. package/dist/wu-framework.esm.js.map +1 -1
  62. package/dist/wu-framework.umd.js +2 -2
  63. package/dist/wu-framework.umd.js.map +1 -1
  64. package/integrations/astro/WuApp.astro +16 -11
  65. package/integrations/astro/WuShell.astro +11 -3
  66. package/package.json +14 -6
  67. package/dist/wu-ai-browser-primitives-BDKXJlwc.js +0 -2
  68. package/dist/wu-ai-browser-primitives-BDKXJlwc.js.map +0 -1
  69. package/dist/wu-framework.cjs.js +0 -3
  70. package/dist/wu-framework.cjs.js.map +0 -1
  71. package/dist/wu-logger-fJfUHBGA.js +0 -2
  72. package/dist/wu-logger-fJfUHBGA.js.map +0 -1
@@ -1,2 +1,2 @@
1
- const e={roots:new Map,React:null,ReactDOM:null,createRoot:null,initialized:!1};function t(){return"undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null}function n(e=5e3){return new Promise((n,o)=>{const r=t();if(r)return void n(r);const a=Date.now(),c=e=>{u(),n(t())};window.addEventListener("wu:ready",c),window.addEventListener("wu:app:ready",c);const s=setInterval(()=>{const r=t();if(r)return u(),void n(r);Date.now()-a>e&&(u(),o(new Error(`Wu Framework not found after ${e}ms`)))},200);function u(){clearInterval(s),window.removeEventListener("wu:ready",c),window.removeEventListener("wu:app:ready",c)}})}async function o(t,o,r={}){const{strictMode:a=!0,props:c={},onMount:s=null,onUnmount:u=null,standalone:i=!0,standaloneContainer:l="#root"}=r,d=await async function(){if(e.initialized)return!0;try{if("undefined"!=typeof window&&window.React&&window.ReactDOM){if(e.React=window.React,e.ReactDOM=window.ReactDOM,window.ReactDOM.createRoot)e.createRoot=window.ReactDOM.createRoot;else try{const t=await import("react-dom/client");e.createRoot=(t.default||t).createRoot}catch{return console.error('[WuReact] createRoot not found. Expose window.ReactDOM from "react-dom/client", not "react-dom".'),!1}return e.initialized=!0,!0}const[t,n]=await Promise.all([import("react"),import("react-dom/client")]);return e.React=t.default||t,e.ReactDOM=n.default||n,e.createRoot=(n.default||n).createRoot,e.initialized=!0,!0}catch(e){return console.error("[WuReact] Failed to load React:",e),!1}}();if(!d)return console.error(`[WuReact] Cannot register ${t}: React not available`),!1;const{React:f,createRoot:w}=e,m=n=>{if(!n)return void console.error(`[WuReact] Mount failed for ${t}: container is null`);const r=e.roots.get(t);if(r){if(r.container===n)return;R()}try{n.innerHTML="";const r=w(n);let u=f.createElement(o,c);a&&f.StrictMode&&(u=f.createElement(f.StrictMode,null,u)),r.render(u),e.roots.set(t,{root:r,container:n}),s&&s(n)}catch(e){throw console.error(`[WuReact] Mount error for ${t}:`,e),e}},R=n=>{const o=e.roots.get(t);if(o)try{u&&u(o.container),o.root.unmount(),e.roots.delete(t)}catch(e){console.error(`[WuReact] Unmount error for ${t}:`,e)}const r=n||o?.container;r&&(r.innerHTML="")};try{return(await n(3e3)).define(t,{mount:m,unmount:R}),console.log(`[WuReact] ✅ ${t} registered with Wu Framework`),!0}catch(e){if(console.warn(`[WuReact] Wu Framework not available for ${t}`),i){const e=document.querySelector(l);if(e)return console.log(`[WuReact] Running ${t} in standalone mode`),m(e),!0;console.warn(`[WuReact] Standalone container ${l} not found`)}return!1}}function r(e){const{useState:n,useEffect:o,useRef:r}=e;return function({name:a,url:c,appName:s=null,fallback:u=null,onLoad:i=null,onError:l=null,onMount:d=null,onUnmount:f=null,className:w="",style:m={},...R}){const p=s||a,v=`wu-slot-${p}`,y=r(!1),[g,E]=n(!0),[W,$]=n(null);if(o(()=>{let e=!1;const n=setTimeout(async()=>{if(!e)try{E(!0),$(null);const n=t();if(!n)throw new Error("Wu Framework not initialized");if(await n.mount(p,`#${v}`),!e){y.current=!0,E(!1);const e=document.getElementById(v);i&&i({name:p,url:c}),d&&d({name:p,container:e})}}catch(t){e||(console.error(`[WuSlot] Error loading ${p}:`,t),$(t.message||"Failed to load microfrontend"),E(!1),l&&l(t))}},50);return()=>{if(e=!0,clearTimeout(n),y.current){f&&f({name:p});const e=t();e&&e.unmount(p).catch(()=>{}),y.current=!1}}},[p,c,i,l,d,f]),W)return e.createElement("div",{className:`wu-slot wu-slot-error ${w}`,style:{padding:"1rem",border:"1px solid #f5c6cb",borderRadius:"4px",backgroundColor:"#f8d7da",color:"#721c24",...m},...R},[e.createElement("strong",{key:"title"},`Error loading ${a}`),e.createElement("p",{key:"message",style:{margin:"0.5rem 0 0 0"}},W)]);const b=e.createElement("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"2rem",color:"#666"}},`Loading ${a}...`);return e.createElement(e.Fragment,null,g?e.createElement("div",{className:`wu-slot-fallback ${w}`},u||b):null,e.createElement("div",Object.assign({id:v,className:"wu-slot "+(g?"wu-slot-loading":"wu-slot-loaded"),"data-wu-app":p,"data-wu-url":c,style:Object.assign({width:"100%",minHeight:g?0:"200px"},m)},R)))}}function a(e){const{useCallback:n,useEffect:o,useRef:r}=e;return function(){const e=r([]),a=n((e,n,o)=>{const r=t();r?.eventBus?r.eventBus.emit(e,n,o):console.warn("[useWuEvents] Wu Framework not available")},[]),c=n((n,o)=>{const r=t();if(r?.eventBus){const t=r.eventBus.on(n,o);return e.current.push(t),t}return console.warn("[useWuEvents] Wu Framework not available"),()=>{}},[]),s=n((e,n)=>{const o=t();return o?.eventBus?o.eventBus.once(e,n):(console.warn("[useWuEvents] Wu Framework not available"),()=>{})},[]);return o(()=>()=>{e.current.forEach(e=>e()),e.current=[]},[]),{emit:a,on:c,once:s}}}function c(e){const{useState:n,useCallback:o,useEffect:r}=e;return function(e=""){const[a,c]=n(()=>{const n=t();return n?.store?.get(e)||null}),s=o((n,o)=>{const r=t();if(r?.store){const t=e?`${e}.${n}`:n;r.store.set(t,o)}},[e]),u=o((n="")=>{const o=t();if(o?.store){const t=e?n?`${e}.${n}`:e:n;return o.store.get(t)}return null},[e]);return r(()=>{const n=t();if(!n?.store)return;const o=e?`${e}.*`:"*";return n.store.on(o,()=>{c(n.store.get(e))})},[e]),{state:a,setState:s,getState:u}}}function s(e){const{useState:n,useCallback:o,useRef:r,useEffect:a}=e;return function(e={}){const{namespace:c="default",onActionExecuted:s=null}=e,[u,i]=n([]),[l,d]=n(!1),[f,w]=n(null);r(null);const m=r(null);a(()=>{const e=t();if(!e?.eventBus)return;const n=e.eventBus.on("ai:action:executed",e=>{const t={id:`action-${Date.now()}`,role:"action",content:e.data?.action||"action",result:e.data?.result,timestamp:Date.now()};i(e=>[...e,t]),s&&s(e.data)});return m.current=n,()=>{n&&n()}},[s]);return{messages:u,isStreaming:l,error:f,send:o(async e=>{if(!e?.trim())return;const n=t();if(!n?.ai)return void w("Wu AI not available");const o={id:`user-${Date.now()}`,role:"user",content:e,timestamp:Date.now()};i(e=>[...e,o]),w(null),d(!0);const r=`assistant-${Date.now()}`;i(e=>[...e,{id:r,role:"assistant",content:"",timestamp:Date.now()}]);try{let t="";for await(const o of n.ai.stream(e,{namespace:c})){if("text"===o.type){t+=o.content;const e=t;i(t=>t.map(t=>t.id===r?{...t,content:e}:t))}o.type,"error"===o.type&&w(o.error?.message||"AI request failed")}}catch(e){w(e.message||"AI request failed"),i(e=>e.filter(e=>e.id!==r||e.content))}finally{d(!1)}},[c]),sendSync:o(async e=>{if(!e?.trim())return null;const n=t();if(!n?.ai)return w("Wu AI not available"),null;const o={id:`user-${Date.now()}`,role:"user",content:e,timestamp:Date.now()};i(e=>[...e,o]),w(null),d(!0);try{const t=await n.ai.send(e,{namespace:c}),o={id:`assistant-${Date.now()}`,role:"assistant",content:t.content,timestamp:Date.now()};return i(e=>[...e,o]),t}catch(e){return w(e.message||"AI request failed"),null}finally{d(!1)}},[c]),abort:o(()=>{const e=t();e?.ai&&e.ai.abort(c),d(!1)},[c]),clear:o(()=>{i([]),w(null);const e=t();e?.ai&&e.ai.conversation.clear(c)},[c])}}}const u={register:o,createWuSlot:r,createUseWuEvents:a,createUseWuStore:c,createUseWuAI:s,getWuInstance:t,waitForWu:n};export{s as createUseWuAI,a as createUseWuEvents,c as createUseWuStore,r as createWuSlot,u as default,t as getWuInstance,o as register,n as waitForWu,u as wuReact};
1
+ const t={roots:new Map,React:null,ReactDOM:null,createRoot:null,initialized:!1};function e(){if("undefined"==typeof window)return null;if(window.wu)return window.wu;try{if(window.parent?.wu)return window.parent.wu}catch{}try{if(window.top?.wu)return window.top.wu}catch{}return null}function n(t=5e3){return new Promise((n,o)=>{const r=e();if(r)return void n(r);const a=Date.now(),c=t=>{s(),n(e())};window.addEventListener("wu:ready",c),window.addEventListener("wu:app:ready",c);const u=setInterval(()=>{const r=e();if(r)return s(),void n(r);Date.now()-a>t&&(s(),o(new Error(`Wu Framework not found after ${t}ms`)))},200);function s(){clearInterval(u),window.removeEventListener("wu:ready",c),window.removeEventListener("wu:app:ready",c)}})}async function o(e,o,r={}){const{strictMode:a=!0,props:c={},onMount:u=null,onUnmount:s=null,standalone:i=!0,standaloneContainer:l="#root"}=r,d=await async function(){if(t.initialized)return!0;try{if("undefined"!=typeof window&&window.React&&window.ReactDOM){if(t.React=window.React,t.ReactDOM=window.ReactDOM,window.ReactDOM.createRoot)t.createRoot=window.ReactDOM.createRoot;else try{const e=await import("react-dom/client");t.createRoot=(e.default||e).createRoot}catch{return console.error('[WuReact] createRoot not found. Expose window.ReactDOM from "react-dom/client", not "react-dom".'),!1}return t.initialized=!0,!0}const[e,n]=await Promise.all([import("react"),import("react-dom/client")]);return t.React=e.default||e,t.ReactDOM=n.default||n,t.createRoot=(n.default||n).createRoot,t.initialized=!0,!0}catch(t){return console.error("[WuReact] Failed to load React:",t),!1}}();if(!d)return console.error(`[WuReact] Cannot register ${e}: React not available`),!1;const{React:w,createRoot:f}=t,m={...c};let p={...c};const R=t=>{let e=w.createElement(o,p);a&&w.StrictMode&&(e=w.createElement(w.StrictMode,null,e)),t.render(e)},y=n=>{if(!n)return void console.error(`[WuReact] Mount failed for ${e}: container is null`);const o=t.roots.get(e);if(o){if(o.container===n)return;v()}try{n.innerHTML="";const o=f(n);R(o),t.roots.set(e,{root:o,container:n}),u&&u(n)}catch(t){throw console.error(`[WuReact] Mount error for ${e}:`,t),t}},g=(n,o)=>{p={...p,...o||{}};const r=t.roots.get(e);r&&R(r.root)},v=n=>{const o=t.roots.get(e);if(o)try{s&&s(o.container),o.root.unmount(),t.roots.delete(e)}catch(t){console.error(`[WuReact] Unmount error for ${e}:`,t)}const r=n||o?.container;r&&(r.innerHTML=""),p={...m}};try{return(await n(3e3)).define(e,{mount:y,unmount:v,update:g}),console.log(`[WuReact] ✅ ${e} registered with Wu Framework`),!0}catch(t){if(console.warn(`[WuReact] Wu Framework not available for ${e}`),i){const t=document.querySelector(l);if(t)return console.log(`[WuReact] Running ${e} in standalone mode`),y(t),!0;console.warn(`[WuReact] Standalone container ${l} not found`)}return!1}}function r(t){const{useState:n,useEffect:o,useRef:r}=t;return function({name:a,url:c,appName:u=null,fallback:s=null,onLoad:i=null,onError:l=null,onMount:d=null,onUnmount:w=null,className:f="",style:m={},...p}){const R=u||a,y=`wu-slot-${R}`,g=r(!1),v=r({onLoad:i,onError:l,onMount:d,onUnmount:w});v.current={onLoad:i,onError:l,onMount:d,onUnmount:w};const[E,W]=n(!0),[$,M]=n(null);if(o(()=>{let t=!1;const n=setTimeout(async()=>{if(!t)try{W(!0),M(null);const n=e();if(!n)throw new Error("Wu Framework not initialized");if(await n.mount(R,`#${y}`),!t){g.current=!0,W(!1);const t=document.getElementById(y),{onLoad:e,onMount:n}=v.current;e&&e({name:R,url:c}),n&&n({name:R,container:t})}}catch(e){if(!t){console.error(`[WuSlot] Error loading ${R}:`,e),M(e.message||"Failed to load microfrontend"),W(!1);const{onError:t}=v.current;t&&t(e)}}},50);return()=>{if(t=!0,clearTimeout(n),g.current){const{onUnmount:t}=v.current;t&&t({name:R});const n=e();n&&n.unmount(R).catch(()=>{}),g.current=!1}}},[R,c]),$)return t.createElement("div",{className:`wu-slot wu-slot-error ${f}`,style:{padding:"1rem",border:"1px solid #f5c6cb",borderRadius:"4px",backgroundColor:"#f8d7da",color:"#721c24",...m},...p},[t.createElement("strong",{key:"title"},`Error loading ${a}`),t.createElement("p",{key:"message",style:{margin:"0.5rem 0 0 0"}},$)]);const b=t.createElement("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"2rem",color:"#666"}},`Loading ${a}...`);return t.createElement(t.Fragment,null,E?t.createElement("div",{className:`wu-slot-fallback ${f}`},s||b):null,t.createElement("div",Object.assign({id:y,className:"wu-slot "+(E?"wu-slot-loading":"wu-slot-loaded"),"data-wu-app":R,"data-wu-url":c,style:Object.assign({width:"100%",minHeight:E?0:"200px"},m)},p)))}}function a(t){const{useCallback:n,useEffect:o,useRef:r}=t;return function(){const t=r([]),a=n((t,n,o)=>{const r=e();r?.eventBus?r.eventBus.emit(t,n,o):console.warn("[useWuEvents] Wu Framework not available")},[]),c=n((n,o)=>{const r=e();if(r?.eventBus){const e=r.eventBus.on(n,o);return t.current.push(e),e}return console.warn("[useWuEvents] Wu Framework not available"),()=>{}},[]),u=n((t,n)=>{const o=e();return o?.eventBus?o.eventBus.once(t,n):(console.warn("[useWuEvents] Wu Framework not available"),()=>{})},[]);return o(()=>()=>{t.current.forEach(t=>t()),t.current=[]},[]),{emit:a,on:c,once:u}}}function c(t){const{useState:n,useCallback:o,useEffect:r}=t;return function(t=""){const[a,c]=n(()=>{const n=e();return n?.store?.get(t)||null}),u=o((n,o)=>{const r=e();if(r?.store){const e=t?`${t}.${n}`:n;r.store.set(e,o)}},[t]),s=o((n="")=>{const o=e();if(o?.store){const e=t?n?`${t}.${n}`:t:n;return o.store.get(e)}return null},[t]);return r(()=>{const n=e();if(!n?.store)return;return n.store.on(t||"*",()=>{c(n.store.get(t))})},[t]),{state:a,setState:u,getState:s}}}function u(t){const{useState:n,useCallback:o,useRef:r,useEffect:a}=t;return function(t={}){const{namespace:c="default",onActionExecuted:u=null}=t,[s,i]=n([]),[l,d]=n(!1),[w,f]=n(null);r(null);const m=r(null);a(()=>{const t=e();if(!t?.eventBus)return;const n=t.eventBus.on("ai:action:executed",t=>{const e={id:`action-${Date.now()}`,role:"action",content:t.data?.action||"action",result:t.data?.result,timestamp:Date.now()};i(t=>[...t,e]),u&&u(t.data)});return m.current=n,()=>{n&&n()}},[u]);return{messages:s,isStreaming:l,error:w,send:o(async t=>{if(!t?.trim())return;const n=e();if(!n?.ai)return void f("Wu AI not available");const o={id:`user-${Date.now()}`,role:"user",content:t,timestamp:Date.now()};i(t=>[...t,o]),f(null),d(!0);const r=`assistant-${Date.now()}`;i(t=>[...t,{id:r,role:"assistant",content:"",timestamp:Date.now()}]);try{let e="";for await(const o of n.ai.stream(t,{namespace:c})){if("text"===o.type){e+=o.content;const t=e;i(e=>e.map(e=>e.id===r?{...e,content:t}:e))}o.type,"error"===o.type&&f(o.error?.message||"AI request failed")}}catch(t){f(t.message||"AI request failed"),i(t=>t.filter(t=>t.id!==r||t.content))}finally{d(!1)}},[c]),sendSync:o(async t=>{if(!t?.trim())return null;const n=e();if(!n?.ai)return f("Wu AI not available"),null;const o={id:`user-${Date.now()}`,role:"user",content:t,timestamp:Date.now()};i(t=>[...t,o]),f(null),d(!0);try{const e=await n.ai.send(t,{namespace:c}),o={id:`assistant-${Date.now()}`,role:"assistant",content:e.content,timestamp:Date.now()};return i(t=>[...t,o]),e}catch(t){return f(t.message||"AI request failed"),null}finally{d(!1)}},[c]),abort:o(()=>{const t=e();t?.ai&&t.ai.abort(c),d(!1)},[c]),clear:o(()=>{i([]),f(null);const t=e();t?.ai&&t.ai.conversation.clear(c)},[c])}}}const s={register:o,createWuSlot:r,createUseWuEvents:a,createUseWuStore:c,createUseWuAI:u,getWuInstance:e,waitForWu:n};export{u as createUseWuAI,a as createUseWuEvents,c as createUseWuStore,r as createWuSlot,s as default,e as getWuInstance,o as register,n as waitForWu,s as wuReact};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/adapters/react/index.js"],"sourcesContent":["/**\n * 🚀 WU-FRAMEWORK REACT ADAPTER\n *\n * Simplifica la integración de React con Wu Framework.\n * Convierte componentes React en microfrontends con UNA línea de código.\n *\n * @example\n * // Microfrontend (main.tsx)\n * import { wuReact } from 'wu-framework/adapters/react';\n * import App from './App';\n *\n * wuReact.register('my-app', App);\n *\n * @example\n * // Shell (cargar microfrontend)\n * import { WuSlot } from 'wu-framework/adapters/react';\n *\n * <WuSlot name=\"my-app\" url=\"http://localhost:3001\" />\n */\n\n// Estado global del adapter\nconst adapterState = {\n roots: new Map(),\n React: null,\n ReactDOM: null,\n createRoot: null,\n initialized: false\n};\n\n/**\n * Detecta y obtiene React del contexto global o lo importa\n */\nasync function ensureReact() {\n if (adapterState.initialized) return true;\n\n try {\n // Intentar obtener de window (común en microfrontends)\n if (typeof window !== 'undefined' && window.React && window.ReactDOM) {\n adapterState.React = window.React;\n adapterState.ReactDOM = window.ReactDOM;\n\n // createRoot puede estar en window.ReactDOM (si importaron de react-dom/client)\n // o no existir (si importaron de react-dom). Intentar ambos caminos.\n if (window.ReactDOM.createRoot) {\n adapterState.createRoot = window.ReactDOM.createRoot;\n } else {\n // Fallback: importar react-dom/client para obtener createRoot\n try {\n const clientModule = await import('react-dom/client');\n adapterState.createRoot = (clientModule.default || clientModule).createRoot;\n } catch {\n console.error('[WuReact] createRoot not found. Expose window.ReactDOM from \"react-dom/client\", not \"react-dom\".');\n return false;\n }\n }\n\n adapterState.initialized = true;\n return true;\n }\n\n // Intentar import dinámico\n const [React, ReactDOMClient] = await Promise.all([\n import('react'),\n import('react-dom/client')\n ]);\n\n adapterState.React = React.default || React;\n adapterState.ReactDOM = ReactDOMClient.default || ReactDOMClient;\n adapterState.createRoot = (ReactDOMClient.default || ReactDOMClient).createRoot;\n adapterState.initialized = true;\n return true;\n\n } catch (error) {\n console.error('[WuReact] Failed to load React:', error);\n return false;\n }\n}\n\n/**\n * Obtiene la instancia de Wu Framework\n */\nfunction getWuInstance() {\n if (typeof window === 'undefined') return null;\n\n return window.wu\n || window.parent?.wu\n || window.top?.wu\n || null;\n}\n\n/**\n * Espera a que Wu Framework esté disponible (sin polling agresivo)\n */\nfunction waitForWu(timeout = 5000) {\n return new Promise((resolve, reject) => {\n // Check inmediato\n const wu = getWuInstance();\n if (wu) {\n resolve(wu);\n return;\n }\n\n // Usar MutationObserver + evento en lugar de polling\n const startTime = Date.now();\n\n // Escuchar evento de Wu Framework\n const handleWuReady = (event) => {\n cleanup();\n resolve(getWuInstance());\n };\n\n window.addEventListener('wu:ready', handleWuReady);\n window.addEventListener('wu:app:ready', handleWuReady);\n\n // Fallback con polling conservador (cada 200ms, no 100ms)\n const checkInterval = setInterval(() => {\n const wu = getWuInstance();\n if (wu) {\n cleanup();\n resolve(wu);\n return;\n }\n\n if (Date.now() - startTime > timeout) {\n cleanup();\n reject(new Error(`Wu Framework not found after ${timeout}ms`));\n }\n }, 200);\n\n function cleanup() {\n clearInterval(checkInterval);\n window.removeEventListener('wu:ready', handleWuReady);\n window.removeEventListener('wu:app:ready', handleWuReady);\n }\n });\n}\n\n/**\n * Registra un componente React como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend (debe coincidir con wu.json)\n * @param {React.ComponentType} Component - Componente React principal\n * @param {Object} options - Opciones adicionales\n * @param {boolean} options.strictMode - Envolver en StrictMode (default: true)\n * @param {Object} options.props - Props iniciales para el componente\n * @param {Function} options.onMount - Callback después de montar\n * @param {Function} options.onUnmount - Callback antes de desmontar\n * @param {boolean} options.standalone - Permitir ejecución standalone (default: true)\n * @param {string} options.standaloneContainer - Selector para modo standalone (default: '#root')\n */\nasync function register(appName, Component, options = {}) {\n const {\n strictMode = true,\n props = {},\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#root'\n } = options;\n\n // Asegurar que React está disponible\n const hasReact = await ensureReact();\n if (!hasReact) {\n console.error(`[WuReact] Cannot register ${appName}: React not available`);\n return false;\n }\n\n const { React, createRoot } = adapterState;\n\n // Función de mount interna\n const mountApp = (container) => {\n if (!container) {\n console.error(`[WuReact] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Si ya está montado en el MISMO container, ignorar\n const existing = adapterState.roots.get(appName);\n if (existing) {\n if (existing.container === container) {\n return; // Ya montado aquí, nada que hacer\n }\n // Diferente container → desmontar primero\n unmountApp();\n }\n\n try {\n container.innerHTML = '';\n const root = createRoot(container);\n\n let element = React.createElement(Component, props);\n if (strictMode && React.StrictMode) {\n element = React.createElement(React.StrictMode, null, element);\n }\n\n root.render(element);\n adapterState.roots.set(appName, { root, container });\n\n if (onMount) {\n onMount(container);\n }\n } catch (error) {\n console.error(`[WuReact] Mount error for ${appName}:`, error);\n throw error;\n }\n };\n\n // Unmount inmediato — la protección contra StrictMode (deferred unmount)\n // se maneja en wu-core.js, no aquí en el adapter.\n const unmountApp = (container) => {\n const instance = adapterState.roots.get(appName);\n if (instance) {\n try {\n if (onUnmount) onUnmount(instance.container);\n instance.root.unmount();\n adapterState.roots.delete(appName);\n } catch (error) {\n console.error(`[WuReact] Unmount error for ${appName}:`, error);\n }\n }\n const target = container || instance?.container;\n if (target) target.innerHTML = '';\n };\n\n // Intentar registrar con Wu Framework\n try {\n const wu = await waitForWu(3000);\n\n wu.define(appName, {\n mount: mountApp,\n unmount: unmountApp\n });\n\n console.log(`[WuReact] ✅ ${appName} registered with Wu Framework`);\n return true;\n\n } catch (error) {\n // Wu no disponible\n console.warn(`[WuReact] Wu Framework not available for ${appName}`);\n\n // Modo standalone si está habilitado\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n\n if (containerElement) {\n console.log(`[WuReact] Running ${appName} in standalone mode`);\n mountApp(containerElement);\n return true;\n } else {\n console.warn(`[WuReact] Standalone container ${standaloneContainer} not found`);\n }\n }\n\n return false;\n }\n}\n\n/**\n * Crea un componente React para cargar microfrontends (para el Shell)\n *\n * @example\n * import { createWuSlot } from 'wu-framework/adapters/react';\n * const WuSlot = createWuSlot(React);\n *\n * <WuSlot name=\"my-app\" url=\"http://localhost:3001\" />\n */\nfunction createWuSlot(React) {\n const { useState, useEffect, useRef } = React;\n\n return function WuSlot({\n name,\n url,\n appName = null,\n fallback = null,\n onLoad = null,\n onError = null,\n onMount = null,\n onUnmount = null,\n className = '',\n style = {},\n ...props\n }) {\n const actualAppName = appName || name;\n\n // ID estable derivado del nombre: el div ya tiene este id desde el primer render.\n // wu.mount(name, '#id') lo encuentra sin necesidad de innerHTML ni appendChild.\n const containerId = `wu-slot-${actualAppName}`;\n const mountedRef = useRef(false);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n\n useEffect(() => {\n let cancelled = false;\n\n // Delay 50ms + flag cancelled: patrón StrictMode-safe.\n // En StrictMode React monta → desmonta → monta; el primer ciclo cancela\n // el timeout antes de ejecutarse; solo el segundo ciclo monta el MF.\n const timer = setTimeout(async () => {\n if (cancelled) return;\n\n try {\n setLoading(true);\n setError(null);\n\n const wu = getWuInstance();\n if (!wu) throw new Error('Wu Framework not initialized');\n\n // El div#containerId ya está en el DOM (renderizado abajo).\n // wu.mount lo usa como target; no tocamos su DOM desde JS imperativo.\n await wu.mount(actualAppName, `#${containerId}`);\n\n if (!cancelled) {\n mountedRef.current = true;\n setLoading(false);\n\n const container = document.getElementById(containerId);\n if (onLoad) onLoad({ name: actualAppName, url });\n if (onMount) onMount({ name: actualAppName, container });\n }\n } catch (err) {\n if (!cancelled) {\n console.error(`[WuSlot] Error loading ${actualAppName}:`, err);\n setError(err.message || 'Failed to load microfrontend');\n setLoading(false);\n if (onError) onError(err);\n }\n }\n }, 50);\n\n return () => {\n cancelled = true;\n clearTimeout(timer);\n\n if (mountedRef.current) {\n if (onUnmount) onUnmount({ name: actualAppName });\n const wu = getWuInstance();\n if (wu) wu.unmount(actualAppName).catch(() => {});\n mountedRef.current = false;\n }\n };\n }, [actualAppName, url, onLoad, onError, onMount, onUnmount]);\n\n // Estado de error\n if (error) {\n return React.createElement('div', {\n className: `wu-slot wu-slot-error ${className}`,\n style: {\n padding: '1rem',\n border: '1px solid #f5c6cb',\n borderRadius: '4px',\n backgroundColor: '#f8d7da',\n color: '#721c24',\n ...style\n },\n ...props\n }, [\n React.createElement('strong', { key: 'title' }, `Error loading ${name}`),\n React.createElement('p', { key: 'message', style: { margin: '0.5rem 0 0 0' } }, error)\n ]);\n }\n\n // Render principal: Fragment con fallback y div de montaje como HERMANOS.\n //\n // REGLA CRÍTICA: el div#containerId NO debe tener hijos React.\n // wu.mount inyecta el MF (otro createRoot) dentro de ese div. Si React también\n // administra hijos ahí, al desmontar el fallback llama removeChild sobre nodos\n // que el MF ya reemplazó → \"The node to be removed is not a child of this node\".\n //\n // Solución: fallback y mount-target como hermanos en un Fragment pasados como\n // argumentos separados a createElement (NO como array; el array rompe la\n // reconciliación). React solo gestiona el fallback; el interior del mount-target\n // lo controla exclusivamente el MF.\n const defaultFallback = React.createElement('div', {\n style: { display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '2rem', color: '#666' }\n }, `Loading ${name}...`);\n\n return React.createElement(React.Fragment, null,\n loading\n ? React.createElement('div', { className: `wu-slot-fallback ${className}` }, fallback || defaultFallback)\n : null,\n React.createElement('div', Object.assign({\n id: containerId,\n className: `wu-slot ${loading ? 'wu-slot-loading' : 'wu-slot-loaded'}`,\n 'data-wu-app': actualAppName,\n 'data-wu-url': url,\n style: Object.assign({ width: '100%', minHeight: loading ? 0 : '200px' }, style)\n }, props))\n );\n };\n}\n\n/**\n * Hook para usar el EventBus de Wu Framework en React\n *\n * @example\n * const { emit, on } = useWuEvents();\n *\n * useEffect(() => {\n * const unsub = on('user:login', (data) => console.log(data));\n * return unsub;\n * }, [on]);\n */\nfunction createUseWuEvents(React) {\n const { useCallback, useEffect, useRef } = React;\n\n return function useWuEvents() {\n const subscriptionsRef = useRef([]);\n\n const emit = useCallback((event, data, options) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n wu.eventBus.emit(event, data, options);\n } else {\n console.warn('[useWuEvents] Wu Framework not available');\n }\n }, []);\n\n const on = useCallback((event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n const unsubscribe = wu.eventBus.on(event, callback);\n subscriptionsRef.current.push(unsubscribe);\n return unsubscribe;\n }\n console.warn('[useWuEvents] Wu Framework not available');\n return () => {};\n }, []);\n\n const once = useCallback((event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n return wu.eventBus.once(event, callback);\n }\n console.warn('[useWuEvents] Wu Framework not available');\n return () => {};\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n subscriptionsRef.current.forEach(unsub => unsub());\n subscriptionsRef.current = [];\n };\n }, []);\n\n return { emit, on, once };\n };\n}\n\n/**\n * Hook para usar el Store de Wu Framework en React\n *\n * @example\n * const { state, setState, subscribe } = useWuStore('user');\n */\nfunction createUseWuStore(React) {\n const { useState, useCallback, useEffect } = React;\n\n return function useWuStore(namespace = '') {\n const [state, setLocalState] = useState(() => {\n const wu = getWuInstance();\n return wu?.store?.get(namespace) || null;\n });\n\n const setState = useCallback((path, value) => {\n const wu = getWuInstance();\n if (wu?.store) {\n const fullPath = namespace ? `${namespace}.${path}` : path;\n wu.store.set(fullPath, value);\n }\n }, [namespace]);\n\n const getState = useCallback((path = '') => {\n const wu = getWuInstance();\n if (wu?.store) {\n const fullPath = namespace ? (path ? `${namespace}.${path}` : namespace) : path;\n return wu.store.get(fullPath);\n }\n return null;\n }, [namespace]);\n\n // Subscribe to changes\n useEffect(() => {\n const wu = getWuInstance();\n if (!wu?.store) return;\n\n const pattern = namespace ? `${namespace}.*` : '*';\n const unsubscribe = wu.store.on(pattern, () => {\n setLocalState(wu.store.get(namespace));\n });\n\n return unsubscribe;\n }, [namespace]);\n\n return { state, setState, getState };\n };\n}\n\n/**\n * Hook para integrar wu.ai con React (Paradigma C: IA como Director de Orquesta)\n *\n * Manages messages, streaming state, and AI interaction lifecycle.\n * The AI calls business-level actions that orchestrate the UI via wu.emit/wu.store.\n *\n * @example\n * const { messages, send, isStreaming } = useWuAI();\n *\n * await send('Navigate to users page');\n * // AI calls 'navigate' action → wu.emit('shell:navigate') → UI reacts\n */\nfunction createUseWuAI(React) {\n const { useState, useCallback, useRef, useEffect } = React;\n\n return function useWuAI(options = {}) {\n const { namespace = 'default', onActionExecuted = null } = options;\n\n const [messages, setMessages] = useState([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState(null);\n const abortRef = useRef(null);\n const actionListenerRef = useRef(null);\n\n // Listen for action execution events to provide visual feedback\n useEffect(() => {\n const wu = getWuInstance();\n if (!wu?.eventBus) return;\n\n const unsub = wu.eventBus.on('ai:action:executed', (event) => {\n const actionMsg = {\n id: `action-${Date.now()}`,\n role: 'action',\n content: event.data?.action || 'action',\n result: event.data?.result,\n timestamp: Date.now(),\n };\n setMessages((prev) => [...prev, actionMsg]);\n if (onActionExecuted) onActionExecuted(event.data);\n });\n\n actionListenerRef.current = unsub;\n return () => { if (unsub) unsub(); };\n }, [onActionExecuted]);\n\n /**\n * Send a message and stream the response in real-time.\n */\n const send = useCallback(async (text) => {\n if (!text?.trim()) return;\n\n const wu = getWuInstance();\n if (!wu?.ai) {\n setError('Wu AI not available');\n return;\n }\n\n // Add user message\n const userMsg = {\n id: `user-${Date.now()}`,\n role: 'user',\n content: text,\n timestamp: Date.now(),\n };\n setMessages((prev) => [...prev, userMsg]);\n setError(null);\n setIsStreaming(true);\n\n // Create assistant placeholder\n const assistantId = `assistant-${Date.now()}`;\n setMessages((prev) => [...prev, {\n id: assistantId,\n role: 'assistant',\n content: '',\n timestamp: Date.now(),\n }]);\n\n try {\n let fullContent = '';\n\n for await (const chunk of wu.ai.stream(text, { namespace })) {\n if (chunk.type === 'text') {\n fullContent += chunk.content;\n const captured = fullContent;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId ? { ...m, content: captured } : m,\n ),\n );\n }\n\n if (chunk.type === 'tool_result') {\n // Tool results are handled by the ai:action:executed listener\n }\n\n if (chunk.type === 'error') {\n setError(chunk.error?.message || 'AI request failed');\n }\n }\n } catch (err) {\n setError(err.message || 'AI request failed');\n // Remove empty assistant message on error\n setMessages((prev) => prev.filter((m) => m.id !== assistantId || m.content));\n } finally {\n setIsStreaming(false);\n }\n }, [namespace]);\n\n /**\n * Send without streaming (simpler, waits for full response).\n */\n const sendSync = useCallback(async (text) => {\n if (!text?.trim()) return null;\n\n const wu = getWuInstance();\n if (!wu?.ai) {\n setError('Wu AI not available');\n return null;\n }\n\n const userMsg = {\n id: `user-${Date.now()}`,\n role: 'user',\n content: text,\n timestamp: Date.now(),\n };\n setMessages((prev) => [...prev, userMsg]);\n setError(null);\n setIsStreaming(true);\n\n try {\n const response = await wu.ai.send(text, { namespace });\n\n const assistantMsg = {\n id: `assistant-${Date.now()}`,\n role: 'assistant',\n content: response.content,\n timestamp: Date.now(),\n };\n setMessages((prev) => [...prev, assistantMsg]);\n return response;\n } catch (err) {\n setError(err.message || 'AI request failed');\n return null;\n } finally {\n setIsStreaming(false);\n }\n }, [namespace]);\n\n const abort = useCallback(() => {\n const wu = getWuInstance();\n if (wu?.ai) wu.ai.abort(namespace);\n setIsStreaming(false);\n }, [namespace]);\n\n const clear = useCallback(() => {\n setMessages([]);\n setError(null);\n const wu = getWuInstance();\n if (wu?.ai) wu.ai.conversation.clear(namespace);\n }, [namespace]);\n\n return {\n messages,\n isStreaming,\n error,\n send,\n sendSync,\n abort,\n clear,\n };\n };\n}\n\n// API pública del adapter\nexport const wuReact = {\n register,\n createWuSlot,\n createUseWuEvents,\n createUseWuStore,\n createUseWuAI,\n getWuInstance,\n waitForWu\n};\n\n// Named exports para conveniencia\nexport {\n register,\n createWuSlot,\n createUseWuEvents,\n createUseWuStore,\n createUseWuAI,\n getWuInstance,\n waitForWu\n};\n\nexport default wuReact;\n"],"names":["adapterState","roots","Map","React","ReactDOM","createRoot","initialized","getWuInstance","window","wu","parent","top","waitForWu","timeout","Promise","resolve","reject","startTime","Date","now","handleWuReady","event","cleanup","addEventListener","checkInterval","setInterval","Error","clearInterval","removeEventListener","async","register","appName","Component","options","strictMode","props","onMount","onUnmount","standalone","standaloneContainer","hasReact","clientModule","import","default","console","error","ReactDOMClient","all","ensureReact","mountApp","container","existing","get","unmountApp","innerHTML","root","element","createElement","StrictMode","render","set","instance","unmount","delete","target","define","mount","log","warn","containerElement","document","querySelector","createWuSlot","useState","useEffect","useRef","name","url","fallback","onLoad","onError","className","style","actualAppName","containerId","mountedRef","loading","setLoading","setError","cancelled","timer","setTimeout","current","getElementById","err","message","clearTimeout","catch","padding","border","borderRadius","backgroundColor","color","key","margin","defaultFallback","display","alignItems","justifyContent","Fragment","Object","assign","id","width","minHeight","createUseWuEvents","useCallback","subscriptionsRef","emit","data","eventBus","on","callback","unsubscribe","push","once","forEach","unsub","createUseWuStore","namespace","state","setLocalState","store","setState","path","value","fullPath","getState","pattern","createUseWuAI","onActionExecuted","messages","setMessages","isStreaming","setIsStreaming","actionListenerRef","actionMsg","role","content","action","result","timestamp","prev","send","text","trim","ai","userMsg","assistantId","fullContent","chunk","stream","type","captured","map","m","filter","sendSync","response","assistantMsg","abort","clear","conversation","wuReact"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/adapters/react/index.js"],"sourcesContent":["/**\n * 🚀 WU-FRAMEWORK REACT ADAPTER\n *\n * Simplifica la integración de React con Wu Framework.\n * Convierte componentes React en microfrontends con UNA línea de código.\n *\n * @example\n * // Microfrontend (main.tsx)\n * import { wuReact } from 'wu-framework/adapters/react';\n * import App from './App';\n *\n * wuReact.register('my-app', App);\n *\n * @example\n * // Shell (cargar microfrontend)\n * import { WuSlot } from 'wu-framework/adapters/react';\n *\n * <WuSlot name=\"my-app\" url=\"http://localhost:3001\" />\n */\n\n// Estado global del adapter\nconst adapterState = {\n roots: new Map(),\n React: null,\n ReactDOM: null,\n createRoot: null,\n initialized: false\n};\n\n/**\n * Detecta y obtiene React del contexto global o lo importa\n */\nasync function ensureReact() {\n if (adapterState.initialized) return true;\n\n try {\n // Intentar obtener de window (común en microfrontends)\n if (typeof window !== 'undefined' && window.React && window.ReactDOM) {\n adapterState.React = window.React;\n adapterState.ReactDOM = window.ReactDOM;\n\n // createRoot puede estar en window.ReactDOM (si importaron de react-dom/client)\n // o no existir (si importaron de react-dom). Intentar ambos caminos.\n if (window.ReactDOM.createRoot) {\n adapterState.createRoot = window.ReactDOM.createRoot;\n } else {\n // Fallback: importar react-dom/client para obtener createRoot\n try {\n const clientModule = await import('react-dom/client');\n adapterState.createRoot = (clientModule.default || clientModule).createRoot;\n } catch {\n console.error('[WuReact] createRoot not found. Expose window.ReactDOM from \"react-dom/client\", not \"react-dom\".');\n return false;\n }\n }\n\n adapterState.initialized = true;\n return true;\n }\n\n // Intentar import dinámico\n const [React, ReactDOMClient] = await Promise.all([\n import('react'),\n import('react-dom/client')\n ]);\n\n adapterState.React = React.default || React;\n adapterState.ReactDOM = ReactDOMClient.default || ReactDOMClient;\n adapterState.createRoot = (ReactDOMClient.default || ReactDOMClient).createRoot;\n adapterState.initialized = true;\n return true;\n\n } catch (error) {\n console.error('[WuReact] Failed to load React:', error);\n return false;\n }\n}\n\n/**\n * Obtiene la instancia de Wu Framework\n */\nfunction getWuInstance() {\n if (typeof window === 'undefined') return null;\n\n if (window.wu) return window.wu;\n\n // Leer .wu en un Window cross-origin lanza SecurityError síncrono\n // (optional chaining no protege: window.parent siempre es un Window).\n try {\n if (window.parent?.wu) return window.parent.wu;\n } catch { /* cross-origin parent */ }\n\n try {\n if (window.top?.wu) return window.top.wu;\n } catch { /* cross-origin top */ }\n\n return null;\n}\n\n/**\n * Espera a que Wu Framework esté disponible (sin polling agresivo)\n */\nfunction waitForWu(timeout = 5000) {\n return new Promise((resolve, reject) => {\n // Check inmediato\n const wu = getWuInstance();\n if (wu) {\n resolve(wu);\n return;\n }\n\n // Usar MutationObserver + evento en lugar de polling\n const startTime = Date.now();\n\n // Escuchar evento de Wu Framework\n const handleWuReady = (event) => {\n cleanup();\n resolve(getWuInstance());\n };\n\n window.addEventListener('wu:ready', handleWuReady);\n window.addEventListener('wu:app:ready', handleWuReady);\n\n // Fallback con polling conservador (cada 200ms, no 100ms)\n const checkInterval = setInterval(() => {\n const wu = getWuInstance();\n if (wu) {\n cleanup();\n resolve(wu);\n return;\n }\n\n if (Date.now() - startTime > timeout) {\n cleanup();\n reject(new Error(`Wu Framework not found after ${timeout}ms`));\n }\n }, 200);\n\n function cleanup() {\n clearInterval(checkInterval);\n window.removeEventListener('wu:ready', handleWuReady);\n window.removeEventListener('wu:app:ready', handleWuReady);\n }\n });\n}\n\n/**\n * Registra un componente React como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend (debe coincidir con wu.json)\n * @param {React.ComponentType} Component - Componente React principal\n * @param {Object} options - Opciones adicionales\n * @param {boolean} options.strictMode - Envolver en StrictMode (default: true)\n * @param {Object} options.props - Props iniciales para el componente\n * @param {Function} options.onMount - Callback después de montar\n * @param {Function} options.onUnmount - Callback antes de desmontar\n * @param {boolean} options.standalone - Permitir ejecución standalone (default: true)\n * @param {string} options.standaloneContainer - Selector para modo standalone (default: '#root')\n */\nasync function register(appName, Component, options = {}) {\n const {\n strictMode = true,\n props = {},\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#root'\n } = options;\n\n // Asegurar que React está disponible\n const hasReact = await ensureReact();\n if (!hasReact) {\n console.error(`[WuReact] Cannot register ${appName}: React not available`);\n return false;\n }\n\n const { React, createRoot } = adapterState;\n\n // Props vivas: el shell puede empujar nuevas vía wu.update(app, props).\n const initialProps = { ...props };\n let currentProps = { ...props };\n\n const renderElement = (root) => {\n let element = React.createElement(Component, currentProps);\n if (strictMode && React.StrictMode) {\n element = React.createElement(React.StrictMode, null, element);\n }\n root.render(element);\n };\n\n // Función de mount interna\n const mountApp = (container) => {\n if (!container) {\n console.error(`[WuReact] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Si ya está montado en el MISMO container, ignorar\n const existing = adapterState.roots.get(appName);\n if (existing) {\n if (existing.container === container) {\n return; // Ya montado aquí, nada que hacer\n }\n // Diferente container → desmontar primero\n unmountApp();\n }\n\n try {\n container.innerHTML = '';\n const root = createRoot(container);\n\n renderElement(root);\n adapterState.roots.set(appName, { root, container });\n\n if (onMount) {\n onMount(container);\n }\n } catch (error) {\n console.error(`[WuReact] Mount error for ${appName}:`, error);\n throw error;\n }\n };\n\n // Canal de props vivo: re-render del root existente con props fusionadas.\n // React reconcilia in-place — sin desmontar, sin perder estado del árbol.\n const updateApp = (_container, nextProps) => {\n currentProps = { ...currentProps, ...(nextProps || {}) };\n const instance = adapterState.roots.get(appName);\n if (instance) renderElement(instance.root);\n };\n\n // Unmount inmediato — la protección contra StrictMode (deferred unmount)\n // se maneja en wu-core.js, no aquí en el adapter.\n const unmountApp = (container) => {\n const instance = adapterState.roots.get(appName);\n if (instance) {\n try {\n if (onUnmount) onUnmount(instance.container);\n instance.root.unmount();\n adapterState.roots.delete(appName);\n } catch (error) {\n console.error(`[WuReact] Unmount error for ${appName}:`, error);\n }\n }\n const target = container || instance?.container;\n if (target) target.innerHTML = '';\n // Reset live-pushed props: un remount (p. ej. reubicación de wu-core a\n // otro contenedor) debe partir de las props de registro, no de las\n // últimas empujadas por wu.update().\n currentProps = { ...initialProps };\n };\n\n // Intentar registrar con Wu Framework\n try {\n const wu = await waitForWu(3000);\n\n wu.define(appName, {\n mount: mountApp,\n unmount: unmountApp,\n update: updateApp\n });\n\n console.log(`[WuReact] ✅ ${appName} registered with Wu Framework`);\n return true;\n\n } catch (error) {\n // Wu no disponible\n console.warn(`[WuReact] Wu Framework not available for ${appName}`);\n\n // Modo standalone si está habilitado\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n\n if (containerElement) {\n console.log(`[WuReact] Running ${appName} in standalone mode`);\n mountApp(containerElement);\n return true;\n } else {\n console.warn(`[WuReact] Standalone container ${standaloneContainer} not found`);\n }\n }\n\n return false;\n }\n}\n\n/**\n * Crea un componente React para cargar microfrontends (para el Shell)\n *\n * @example\n * import { createWuSlot } from 'wu-framework/adapters/react';\n * const WuSlot = createWuSlot(React);\n *\n * <WuSlot name=\"my-app\" url=\"http://localhost:3001\" />\n */\nfunction createWuSlot(React) {\n const { useState, useEffect, useRef } = React;\n\n return function WuSlot({\n name,\n url,\n appName = null,\n fallback = null,\n onLoad = null,\n onError = null,\n onMount = null,\n onUnmount = null,\n className = '',\n style = {},\n ...props\n }) {\n const actualAppName = appName || name;\n\n // ID estable derivado del nombre: el div ya tiene este id desde el primer render.\n // wu.mount(name, '#id') lo encuentra sin necesidad de innerHTML ni appendChild.\n const containerId = `wu-slot-${actualAppName}`;\n const mountedRef = useRef(false);\n\n // Callbacks en ref: identidades inline nuevas en cada render del padre\n // no deben re-ejecutar el effect de montaje (evita flash del fallback\n // y onMount/onUnmount espurios).\n const callbacksRef = useRef({ onLoad, onError, onMount, onUnmount });\n callbacksRef.current = { onLoad, onError, onMount, onUnmount };\n\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n\n useEffect(() => {\n let cancelled = false;\n\n // Delay 50ms + flag cancelled: patrón StrictMode-safe.\n // En StrictMode React monta → desmonta → monta; el primer ciclo cancela\n // el timeout antes de ejecutarse; solo el segundo ciclo monta el MF.\n const timer = setTimeout(async () => {\n if (cancelled) return;\n\n try {\n setLoading(true);\n setError(null);\n\n const wu = getWuInstance();\n if (!wu) throw new Error('Wu Framework not initialized');\n\n // El div#containerId ya está en el DOM (renderizado abajo).\n // wu.mount lo usa como target; no tocamos su DOM desde JS imperativo.\n await wu.mount(actualAppName, `#${containerId}`);\n\n if (!cancelled) {\n mountedRef.current = true;\n setLoading(false);\n\n const container = document.getElementById(containerId);\n const { onLoad, onMount } = callbacksRef.current;\n if (onLoad) onLoad({ name: actualAppName, url });\n if (onMount) onMount({ name: actualAppName, container });\n }\n } catch (err) {\n if (!cancelled) {\n console.error(`[WuSlot] Error loading ${actualAppName}:`, err);\n setError(err.message || 'Failed to load microfrontend');\n setLoading(false);\n const { onError } = callbacksRef.current;\n if (onError) onError(err);\n }\n }\n }, 50);\n\n return () => {\n cancelled = true;\n clearTimeout(timer);\n\n if (mountedRef.current) {\n const { onUnmount } = callbacksRef.current;\n if (onUnmount) onUnmount({ name: actualAppName });\n const wu = getWuInstance();\n if (wu) wu.unmount(actualAppName).catch(() => {});\n mountedRef.current = false;\n }\n };\n }, [actualAppName, url]);\n\n // Estado de error\n if (error) {\n return React.createElement('div', {\n className: `wu-slot wu-slot-error ${className}`,\n style: {\n padding: '1rem',\n border: '1px solid #f5c6cb',\n borderRadius: '4px',\n backgroundColor: '#f8d7da',\n color: '#721c24',\n ...style\n },\n ...props\n }, [\n React.createElement('strong', { key: 'title' }, `Error loading ${name}`),\n React.createElement('p', { key: 'message', style: { margin: '0.5rem 0 0 0' } }, error)\n ]);\n }\n\n // Render principal: Fragment con fallback y div de montaje como HERMANOS.\n //\n // REGLA CRÍTICA: el div#containerId NO debe tener hijos React.\n // wu.mount inyecta el MF (otro createRoot) dentro de ese div. Si React también\n // administra hijos ahí, al desmontar el fallback llama removeChild sobre nodos\n // que el MF ya reemplazó → \"The node to be removed is not a child of this node\".\n //\n // Solución: fallback y mount-target como hermanos en un Fragment pasados como\n // argumentos separados a createElement (NO como array; el array rompe la\n // reconciliación). React solo gestiona el fallback; el interior del mount-target\n // lo controla exclusivamente el MF.\n const defaultFallback = React.createElement('div', {\n style: { display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '2rem', color: '#666' }\n }, `Loading ${name}...`);\n\n return React.createElement(React.Fragment, null,\n loading\n ? React.createElement('div', { className: `wu-slot-fallback ${className}` }, fallback || defaultFallback)\n : null,\n React.createElement('div', Object.assign({\n id: containerId,\n className: `wu-slot ${loading ? 'wu-slot-loading' : 'wu-slot-loaded'}`,\n 'data-wu-app': actualAppName,\n 'data-wu-url': url,\n style: Object.assign({ width: '100%', minHeight: loading ? 0 : '200px' }, style)\n }, props))\n );\n };\n}\n\n/**\n * Hook para usar el EventBus de Wu Framework en React\n *\n * @example\n * const { emit, on } = useWuEvents();\n *\n * useEffect(() => {\n * const unsub = on('user:login', (data) => console.log(data));\n * return unsub;\n * }, [on]);\n */\nfunction createUseWuEvents(React) {\n const { useCallback, useEffect, useRef } = React;\n\n return function useWuEvents() {\n const subscriptionsRef = useRef([]);\n\n const emit = useCallback((event, data, options) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n wu.eventBus.emit(event, data, options);\n } else {\n console.warn('[useWuEvents] Wu Framework not available');\n }\n }, []);\n\n const on = useCallback((event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n const unsubscribe = wu.eventBus.on(event, callback);\n subscriptionsRef.current.push(unsubscribe);\n return unsubscribe;\n }\n console.warn('[useWuEvents] Wu Framework not available');\n return () => {};\n }, []);\n\n const once = useCallback((event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n return wu.eventBus.once(event, callback);\n }\n console.warn('[useWuEvents] Wu Framework not available');\n return () => {};\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n subscriptionsRef.current.forEach(unsub => unsub());\n subscriptionsRef.current = [];\n };\n }, []);\n\n return { emit, on, once };\n };\n}\n\n/**\n * Hook para usar el Store de Wu Framework en React\n *\n * @example\n * const { state, setState, subscribe } = useWuStore('user');\n */\nfunction createUseWuStore(React) {\n const { useState, useCallback, useEffect } = React;\n\n return function useWuStore(namespace = '') {\n const [state, setLocalState] = useState(() => {\n const wu = getWuInstance();\n return wu?.store?.get(namespace) || null;\n });\n\n const setState = useCallback((path, value) => {\n const wu = getWuInstance();\n if (wu?.store) {\n const fullPath = namespace ? `${namespace}.${path}` : path;\n wu.store.set(fullPath, value);\n }\n }, [namespace]);\n\n const getState = useCallback((path = '') => {\n const wu = getWuInstance();\n if (wu?.store) {\n const fullPath = namespace ? (path ? `${namespace}.${path}` : namespace) : path;\n return wu.store.get(fullPath);\n }\n return null;\n }, [namespace]);\n\n // Subscribe to changes\n useEffect(() => {\n const wu = getWuInstance();\n if (!wu?.store) return;\n\n // Suscripción directa al path: cubre escrituras al namespace raíz\n // (set('user', {...})) y escrituras anidadas profundas\n // (set('user.profile.name', x)) vía parent-path notification del store.\n const unsubscribe = wu.store.on(namespace || '*', () => {\n setLocalState(wu.store.get(namespace));\n });\n\n return unsubscribe;\n }, [namespace]);\n\n return { state, setState, getState };\n };\n}\n\n/**\n * Hook para integrar wu.ai con React (Paradigma C: IA como Director de Orquesta)\n *\n * Manages messages, streaming state, and AI interaction lifecycle.\n * The AI calls business-level actions that orchestrate the UI via wu.emit/wu.store.\n *\n * @example\n * const { messages, send, isStreaming } = useWuAI();\n *\n * await send('Navigate to users page');\n * // AI calls 'navigate' action → wu.emit('shell:navigate') → UI reacts\n */\nfunction createUseWuAI(React) {\n const { useState, useCallback, useRef, useEffect } = React;\n\n return function useWuAI(options = {}) {\n const { namespace = 'default', onActionExecuted = null } = options;\n\n const [messages, setMessages] = useState([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState(null);\n const abortRef = useRef(null);\n const actionListenerRef = useRef(null);\n\n // Listen for action execution events to provide visual feedback\n useEffect(() => {\n const wu = getWuInstance();\n if (!wu?.eventBus) return;\n\n const unsub = wu.eventBus.on('ai:action:executed', (event) => {\n const actionMsg = {\n id: `action-${Date.now()}`,\n role: 'action',\n content: event.data?.action || 'action',\n result: event.data?.result,\n timestamp: Date.now(),\n };\n setMessages((prev) => [...prev, actionMsg]);\n if (onActionExecuted) onActionExecuted(event.data);\n });\n\n actionListenerRef.current = unsub;\n return () => { if (unsub) unsub(); };\n }, [onActionExecuted]);\n\n /**\n * Send a message and stream the response in real-time.\n */\n const send = useCallback(async (text) => {\n if (!text?.trim()) return;\n\n const wu = getWuInstance();\n if (!wu?.ai) {\n setError('Wu AI not available');\n return;\n }\n\n // Add user message\n const userMsg = {\n id: `user-${Date.now()}`,\n role: 'user',\n content: text,\n timestamp: Date.now(),\n };\n setMessages((prev) => [...prev, userMsg]);\n setError(null);\n setIsStreaming(true);\n\n // Create assistant placeholder\n const assistantId = `assistant-${Date.now()}`;\n setMessages((prev) => [...prev, {\n id: assistantId,\n role: 'assistant',\n content: '',\n timestamp: Date.now(),\n }]);\n\n try {\n let fullContent = '';\n\n for await (const chunk of wu.ai.stream(text, { namespace })) {\n if (chunk.type === 'text') {\n fullContent += chunk.content;\n const captured = fullContent;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId ? { ...m, content: captured } : m,\n ),\n );\n }\n\n if (chunk.type === 'tool_result') {\n // Tool results are handled by the ai:action:executed listener\n }\n\n if (chunk.type === 'error') {\n setError(chunk.error?.message || 'AI request failed');\n }\n }\n } catch (err) {\n setError(err.message || 'AI request failed');\n // Remove empty assistant message on error\n setMessages((prev) => prev.filter((m) => m.id !== assistantId || m.content));\n } finally {\n setIsStreaming(false);\n }\n }, [namespace]);\n\n /**\n * Send without streaming (simpler, waits for full response).\n */\n const sendSync = useCallback(async (text) => {\n if (!text?.trim()) return null;\n\n const wu = getWuInstance();\n if (!wu?.ai) {\n setError('Wu AI not available');\n return null;\n }\n\n const userMsg = {\n id: `user-${Date.now()}`,\n role: 'user',\n content: text,\n timestamp: Date.now(),\n };\n setMessages((prev) => [...prev, userMsg]);\n setError(null);\n setIsStreaming(true);\n\n try {\n const response = await wu.ai.send(text, { namespace });\n\n const assistantMsg = {\n id: `assistant-${Date.now()}`,\n role: 'assistant',\n content: response.content,\n timestamp: Date.now(),\n };\n setMessages((prev) => [...prev, assistantMsg]);\n return response;\n } catch (err) {\n setError(err.message || 'AI request failed');\n return null;\n } finally {\n setIsStreaming(false);\n }\n }, [namespace]);\n\n const abort = useCallback(() => {\n const wu = getWuInstance();\n if (wu?.ai) wu.ai.abort(namespace);\n setIsStreaming(false);\n }, [namespace]);\n\n const clear = useCallback(() => {\n setMessages([]);\n setError(null);\n const wu = getWuInstance();\n if (wu?.ai) wu.ai.conversation.clear(namespace);\n }, [namespace]);\n\n return {\n messages,\n isStreaming,\n error,\n send,\n sendSync,\n abort,\n clear,\n };\n };\n}\n\n// API pública del adapter\nexport const wuReact = {\n register,\n createWuSlot,\n createUseWuEvents,\n createUseWuStore,\n createUseWuAI,\n getWuInstance,\n waitForWu\n};\n\n// Named exports para conveniencia\nexport {\n register,\n createWuSlot,\n createUseWuEvents,\n createUseWuStore,\n createUseWuAI,\n getWuInstance,\n waitForWu\n};\n\nexport default wuReact;\n"],"names":["adapterState","roots","Map","React","ReactDOM","createRoot","initialized","getWuInstance","window","wu","parent","top","waitForWu","timeout","Promise","resolve","reject","startTime","Date","now","handleWuReady","event","cleanup","addEventListener","checkInterval","setInterval","Error","clearInterval","removeEventListener","async","register","appName","Component","options","strictMode","props","onMount","onUnmount","standalone","standaloneContainer","hasReact","clientModule","import","default","console","error","ReactDOMClient","all","ensureReact","initialProps","currentProps","renderElement","root","element","createElement","StrictMode","render","mountApp","container","existing","get","unmountApp","innerHTML","set","updateApp","_container","nextProps","instance","unmount","delete","target","define","mount","update","log","warn","containerElement","document","querySelector","createWuSlot","useState","useEffect","useRef","name","url","fallback","onLoad","onError","className","style","actualAppName","containerId","mountedRef","callbacksRef","current","loading","setLoading","setError","cancelled","timer","setTimeout","getElementById","err","message","clearTimeout","catch","padding","border","borderRadius","backgroundColor","color","key","margin","defaultFallback","display","alignItems","justifyContent","Fragment","Object","assign","id","width","minHeight","createUseWuEvents","useCallback","subscriptionsRef","emit","data","eventBus","on","callback","unsubscribe","push","once","forEach","unsub","createUseWuStore","namespace","state","setLocalState","store","setState","path","value","fullPath","getState","createUseWuAI","onActionExecuted","messages","setMessages","isStreaming","setIsStreaming","actionListenerRef","actionMsg","role","content","action","result","timestamp","prev","send","text","trim","ai","userMsg","assistantId","fullContent","chunk","stream","type","captured","map","m","filter","sendSync","response","assistantMsg","abort","clear","conversation","wuReact"],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { WuCore } from '../index.js';
2
+
3
+ /** Get the Wu Framework instance from window or (same-origin) parent frames. */
4
+ export function getWuInstance(): WuCore | null;
5
+
6
+ /** Resolve once Wu Framework is available, or reject after `timeout` ms. */
7
+ export function waitForWu(timeout?: number): Promise<WuCore>;
8
+
9
+ export interface WuAdapterContext {
10
+ Component: any;
11
+ props: Record<string, any>;
12
+ prevProps?: Record<string, any>;
13
+ appName: string;
14
+ instance: any;
15
+ options: Record<string, any>;
16
+ }
17
+
18
+ export interface WuAdapterConfig {
19
+ /** Label used in logs, e.g. 'WuReact'. */
20
+ name?: string;
21
+ /** Load/detect the framework. Returning `false` aborts registration. */
22
+ ensure?: () => boolean | Promise<boolean>;
23
+ /** Create the framework instance into `container`; return an instance handle. */
24
+ mount: (container: HTMLElement, ctx: WuAdapterContext) => any | Promise<any>;
25
+ /** Tear down the instance and clear `container`. */
26
+ unmount: (container: HTMLElement, ctx: WuAdapterContext) => void | Promise<void>;
27
+ /**
28
+ * Optional live-props slot — re-render in place with merged props. Omit when
29
+ * the framework cannot update without remounting; `wu.update()` then no-ops.
30
+ */
31
+ update?: (container: HTMLElement, ctx: WuAdapterContext) => void | Promise<void>;
32
+ /** Timeout (ms) waiting for Wu before the standalone fallback. Default 3000. */
33
+ defineTimeout?: number;
34
+ }
35
+
36
+ /**
37
+ * Build a complete adapter `register(appName, Component, options)` from a small
38
+ * framework-specific config. Centralizes the boilerplate (getWuInstance,
39
+ * waitForWu, wu.define wiring, instance bookkeeping, standalone fallback, and
40
+ * the live-props `update` slot) so adapters only describe mount/unmount/update.
41
+ */
42
+ export function createWuAdapter(
43
+ config: WuAdapterConfig
44
+ ): (appName: string, Component: any, options?: Record<string, any>) => Promise<boolean>;
@@ -1,2 +1,2 @@
1
- function n(){return"undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null}function e(e=5e3){return new Promise((r,t)=>{const o=n();if(o)return void r(o);const w=Date.now(),d=()=>{u(),r(n())};window.addEventListener("wu:ready",d),window.addEventListener("wu:app:ready",d);const i=setInterval(()=>{const o=n();if(o)return u(),void r(o);Date.now()-w>e&&(u(),t(new Error(`Wu Framework not found after ${e}ms`)))},200);function u(){clearInterval(i),window.removeEventListener("wu:ready",d),window.removeEventListener("wu:app:ready",d)}})}export{n as getWuInstance,e as waitForWu};
1
+ function n(n){const{name:t="WuAdapter",ensure:o,mount:r,unmount:a,update:u,defineTimeout:i=3e3}=n;if("function"!=typeof r||"function"!=typeof a)throw new Error(`[${t}] createWuAdapter requires mount and unmount functions`);return async function(n,w,c={}){const{props:s={},standalone:d=!0,standaloneContainer:f="#root",onMount:p=null,onUnmount:l=null}=c;if(!1===(!o||await o()))return console.error(`[${t}] Cannot register ${n}: framework not available`),!1;const m={...s};let y={...s},v=null;const $=async e=>{e?(v=await r(e,{Component:w,props:y,appName:n,options:c}),p&&p(e)):console.error(`[${t}] Mount failed for ${n}: container is null`)},E={mount:$,unmount:async t=>{try{l&&l(t),await a(t,{appName:n,instance:v,options:c})}finally{v=null,y={...m}}}};"function"==typeof u&&(E.update=async(t,e)=>{const o=y;y={...y,...e||{}},await u(t,{props:y,prevProps:o,appName:n,instance:v,options:c})});try{return(await e(i)).define(n,E),!0}catch{if(console.warn(`[${t}] Wu Framework not available for ${n}`),d){const n="undefined"!=typeof document?document.querySelector(f):null;if(n)return await $(n),!0;console.warn(`[${t}] Standalone container ${f} not found`)}return!1}}}function t(){if("undefined"==typeof window)return null;if(window.wu)return window.wu;try{if(window.parent?.wu)return window.parent.wu}catch{}try{if(window.top?.wu)return window.top.wu}catch{}return null}function e(n=5e3){return new Promise((e,o)=>{const r=t();if(r)return void e(r);const a=Date.now(),u=()=>{w(),e(t())};window.addEventListener("wu:ready",u),window.addEventListener("wu:app:ready",u);const i=setInterval(()=>{const r=t();if(r)return w(),void e(r);Date.now()-a>n&&(w(),o(new Error(`Wu Framework not found after ${n}ms`)))},200);function w(){clearInterval(i),window.removeEventListener("wu:ready",u),window.removeEventListener("wu:app:ready",u)}})}export{n as createWuAdapter,t as getWuInstance,e as waitForWu};
2
2
  //# sourceMappingURL=shared.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sources":["../../src/adapters/shared.js"],"sourcesContent":["/**\n * WU-FRAMEWORK ADAPTERS — Shared Utilities\n *\n * Common functions used across all framework adapters.\n * Extracted to avoid duplication.\n */\n\n/**\n * Get the Wu Framework instance from window or parent frames.\n * @returns {object|null}\n */\nexport function getWuInstance() {\n if (typeof window === 'undefined') return null;\n\n return window.wu\n || window.parent?.wu\n || window.top?.wu\n || null;\n}\n\n/**\n * Wait for Wu Framework to become available.\n * @param {number} timeout - Timeout in ms (default 5000)\n * @returns {Promise<object>}\n */\nexport function waitForWu(timeout = 5000) {\n return new Promise((resolve, reject) => {\n const wu = getWuInstance();\n if (wu) {\n resolve(wu);\n return;\n }\n\n const startTime = Date.now();\n\n const handleWuReady = () => {\n cleanup();\n resolve(getWuInstance());\n };\n\n window.addEventListener('wu:ready', handleWuReady);\n window.addEventListener('wu:app:ready', handleWuReady);\n\n const checkInterval = setInterval(() => {\n const wu = getWuInstance();\n if (wu) {\n cleanup();\n resolve(wu);\n return;\n }\n\n if (Date.now() - startTime > timeout) {\n cleanup();\n reject(new Error(`Wu Framework not found after ${timeout}ms`));\n }\n }, 200);\n\n function cleanup() {\n clearInterval(checkInterval);\n window.removeEventListener('wu:ready', handleWuReady);\n window.removeEventListener('wu:app:ready', handleWuReady);\n }\n });\n}\n"],"names":["getWuInstance","window","wu","parent","top","waitForWu","timeout","Promise","resolve","reject","startTime","Date","now","handleWuReady","cleanup","addEventListener","checkInterval","setInterval","Error","clearInterval","removeEventListener"],"mappings":"AAWO,SAASA,IACd,MAAsB,oBAAXC,OAA+B,KAEnCA,OAAOC,IACTD,OAAOE,QAAQD,IACfD,OAAOG,KAAKF,IACZ,IACP,CAOO,SAASG,EAAUC,EAAU,KAClC,OAAO,IAAIC,QAAQ,CAACC,EAASC,KAC3B,MAAMP,EAAKF,IACX,GAAIE,EAEF,YADAM,EAAQN,GAIV,MAAMQ,EAAYC,KAAKC,MAEjBC,EAAgB,KACpBC,IACAN,EAAQR,MAGVC,OAAOc,iBAAiB,WAAYF,GACpCZ,OAAOc,iBAAiB,eAAgBF,GAExC,MAAMG,EAAgBC,YAAY,KAChC,MAAMf,EAAKF,IACX,GAAIE,EAGF,OAFAY,SACAN,EAAQN,GAINS,KAAKC,MAAQF,EAAYJ,IAC3BQ,IACAL,EAAO,IAAIS,MAAM,gCAAgCZ,UAElD,KAEH,SAASQ,IACPK,cAAcH,GACdf,OAAOmB,oBAAoB,WAAYP,GACvCZ,OAAOmB,oBAAoB,eAAgBP,EAC7C,GAEJ"}
1
+ {"version":3,"file":"shared.js","sources":["../../src/adapters/shared.js"],"sourcesContent":["/**\n * WU-FRAMEWORK ADAPTERS — Shared Utilities\n *\n * Common functions used across all framework adapters.\n * Extracted to avoid duplication.\n */\n\n/**\n * Build a complete `register()` for a framework adapter from a small,\n * framework-specific config. Centralizes the boilerplate every adapter\n * re-implemented by hand: getWuInstance/waitForWu, wu.define() wiring,\n * per-app instance bookkeeping, the standalone fallback, and the optional\n * live-props `update()` slot.\n *\n * @param {object} config\n * @param {string} config.name Label for logs, e.g. 'WuReact'.\n * @param {Function} [config.ensure] async () => boolean — load/detect the\n * framework. Returning `false` aborts.\n * @param {Function} config.mount (container, ctx) => instance.\n * ctx = { Component, props, appName, options }.\n * @param {Function} config.unmount (container, ctx) => void.\n * ctx = { appName, instance, options }.\n * @param {Function} [config.update] Optional (container, ctx) => void — the\n * live-props channel. ctx = { props,\n * prevProps, appName, instance, options }.\n * Omit when the framework cannot re-render\n * in place; wu.update() then no-ops.\n * @param {number} [config.defineTimeout=3000]\n * @returns {Function} register(appName, Component, options)\n */\nexport function createWuAdapter(config) {\n const {\n name = 'WuAdapter',\n ensure,\n mount,\n unmount,\n update,\n defineTimeout = 3000,\n } = config;\n\n if (typeof mount !== 'function' || typeof unmount !== 'function') {\n throw new Error(`[${name}] createWuAdapter requires mount and unmount functions`);\n }\n\n return async function register(appName, Component, options = {}) {\n const {\n props = {},\n standalone = true,\n standaloneContainer = '#root',\n onMount = null,\n onUnmount = null,\n } = options;\n\n const ready = ensure ? await ensure() : true;\n if (ready === false) {\n console.error(`[${name}] Cannot register ${appName}: framework not available`);\n return false;\n }\n\n // Per-app state lives in this closure: the current props (mutated by the\n // update channel) and the framework instance handle returned by mount().\n const initialProps = { ...props };\n let currentProps = { ...props };\n let instance = null;\n\n const mountApp = async (container) => {\n if (!container) {\n console.error(`[${name}] Mount failed for ${appName}: container is null`);\n return;\n }\n instance = await mount(container, { Component, props: currentProps, appName, options });\n if (onMount) onMount(container);\n };\n\n const unmountApp = async (container) => {\n try {\n if (onUnmount) onUnmount(container);\n await unmount(container, { appName, instance, options });\n } finally {\n instance = null;\n // Reset live-pushed props so a fresh mount (e.g. wu-core's relocation\n // to a different container) starts from the registration props, not\n // whatever was last pushed via wu.update().\n currentProps = { ...initialProps };\n }\n };\n\n const lifecycle = { mount: mountApp, unmount: unmountApp };\n\n // The live-props slot — only advertised when the framework supports it,\n // so wu.update() can honestly no-op for the rest.\n if (typeof update === 'function') {\n lifecycle.update = async (container, nextProps) => {\n const prevProps = currentProps;\n currentProps = { ...currentProps, ...(nextProps || {}) };\n await update(container, { props: currentProps, prevProps, appName, instance, options });\n };\n }\n\n try {\n const wu = await waitForWu(defineTimeout);\n wu.define(appName, lifecycle);\n return true;\n } catch {\n console.warn(`[${name}] Wu Framework not available for ${appName}`);\n if (standalone) {\n const el = typeof document !== 'undefined' ? document.querySelector(standaloneContainer) : null;\n if (el) {\n await mountApp(el);\n return true;\n }\n console.warn(`[${name}] Standalone container ${standaloneContainer} not found`);\n }\n return false;\n }\n };\n}\n\n/**\n * Get the Wu Framework instance from window or parent frames.\n * @returns {object|null}\n */\nexport function getWuInstance() {\n if (typeof window === 'undefined') return null;\n\n if (window.wu) return window.wu;\n\n // Reading .wu on a cross-origin Window throws a synchronous SecurityError\n // (optional chaining does not help: window.parent is always a Window).\n try {\n if (window.parent?.wu) return window.parent.wu;\n } catch { /* cross-origin parent */ }\n\n try {\n if (window.top?.wu) return window.top.wu;\n } catch { /* cross-origin top */ }\n\n return null;\n}\n\n/**\n * Wait for Wu Framework to become available.\n * @param {number} timeout - Timeout in ms (default 5000)\n * @returns {Promise<object>}\n */\nexport function waitForWu(timeout = 5000) {\n return new Promise((resolve, reject) => {\n const wu = getWuInstance();\n if (wu) {\n resolve(wu);\n return;\n }\n\n const startTime = Date.now();\n\n const handleWuReady = () => {\n cleanup();\n resolve(getWuInstance());\n };\n\n window.addEventListener('wu:ready', handleWuReady);\n window.addEventListener('wu:app:ready', handleWuReady);\n\n const checkInterval = setInterval(() => {\n const wu = getWuInstance();\n if (wu) {\n cleanup();\n resolve(wu);\n return;\n }\n\n if (Date.now() - startTime > timeout) {\n cleanup();\n reject(new Error(`Wu Framework not found after ${timeout}ms`));\n }\n }, 200);\n\n function cleanup() {\n clearInterval(checkInterval);\n window.removeEventListener('wu:ready', handleWuReady);\n window.removeEventListener('wu:app:ready', handleWuReady);\n }\n });\n}\n"],"names":["createWuAdapter","config","name","ensure","mount","unmount","update","defineTimeout","Error","async","appName","Component","options","props","standalone","standaloneContainer","onMount","onUnmount","console","error","initialProps","currentProps","instance","mountApp","container","lifecycle","nextProps","prevProps","waitForWu","define","warn","el","document","querySelector","getWuInstance","window","wu","parent","top","timeout","Promise","resolve","reject","startTime","Date","now","handleWuReady","cleanup","addEventListener","checkInterval","setInterval","clearInterval","removeEventListener"],"mappings":"AA8BO,SAASA,EAAgBC,GAC9B,MAAMC,KACJA,EAAO,YAAWC,OAClBA,EAAMC,MACNA,EAAKC,QACLA,EAAOC,OACPA,EAAMC,cACNA,EAAgB,KACdN,EAEJ,GAAqB,mBAAVG,GAA2C,mBAAZC,EACxC,MAAM,IAAIG,MAAM,IAAIN,2DAGtB,OAAOO,eAAwBC,EAASC,EAAWC,EAAU,CAAA,GAC3D,MAAMC,MACJA,EAAQ,CAAA,EAAEC,WACVA,GAAa,EAAIC,oBACjBA,EAAsB,QAAOC,QAC7BA,EAAU,KAAIC,UACdA,EAAY,MACVL,EAGJ,IAAc,MADAT,SAAeA,KAG3B,OADAe,QAAQC,MAAM,IAAIjB,sBAAyBQ,+BACpC,EAKT,MAAMU,EAAe,IAAKP,GAC1B,IAAIQ,EAAe,IAAKR,GACpBS,EAAW,KAEf,MAAMC,EAAWd,MAAOe,IACjBA,GAILF,QAAiBlB,EAAMoB,EAAW,CAAEb,YAAWE,MAAOQ,EAAcX,UAASE,YACzEI,GAASA,EAAQQ,IAJnBN,QAAQC,MAAM,IAAIjB,uBAA0BQ,yBAoB1Ce,EAAY,CAAErB,MAAOmB,EAAUlB,QAblBI,MAAOe,IACxB,IACMP,GAAWA,EAAUO,SACnBnB,EAAQmB,EAAW,CAAEd,UAASY,WAAUV,WAChD,CAAC,QACCU,EAAW,KAIXD,EAAe,IAAKD,EACtB,IAOoB,mBAAXd,IACTmB,EAAUnB,OAASG,MAAOe,EAAWE,KACnC,MAAMC,EAAYN,EAClBA,EAAe,IAAKA,KAAkBK,GAAa,CAAA,SAC7CpB,EAAOkB,EAAW,CAAEX,MAAOQ,EAAcM,YAAWjB,UAASY,WAAUV,cAIjF,IAGE,aAFiBgB,EAAUrB,IACxBsB,OAAOnB,EAASe,IACZ,CACT,CAAE,MAEA,GADAP,QAAQY,KAAK,IAAI5B,qCAAwCQ,KACrDI,EAAY,CACd,MAAMiB,EAAyB,oBAAbC,SAA2BA,SAASC,cAAclB,GAAuB,KAC3F,GAAIgB,EAEF,aADMR,EAASQ,IACR,EAETb,QAAQY,KAAK,IAAI5B,2BAA8Ba,cACjD,CACA,OAAO,CACT,CACF,CACF,CAMO,SAASmB,IACd,GAAsB,oBAAXC,OAAwB,OAAO,KAE1C,GAAIA,OAAOC,GAAI,OAAOD,OAAOC,GAI7B,IACE,GAAID,OAAOE,QAAQD,GAAI,OAAOD,OAAOE,OAAOD,EAC9C,CAAE,MAAkC,CAEpC,IACE,GAAID,OAAOG,KAAKF,GAAI,OAAOD,OAAOG,IAAIF,EACxC,CAAE,MAA+B,CAEjC,OAAO,IACT,CAOO,SAASR,EAAUW,EAAU,KAClC,OAAO,IAAIC,QAAQ,CAACC,EAASC,KAC3B,MAAMN,EAAKF,IACX,GAAIE,EAEF,YADAK,EAAQL,GAIV,MAAMO,EAAYC,KAAKC,MAEjBC,EAAgB,KACpBC,IACAN,EAAQP,MAGVC,OAAOa,iBAAiB,WAAYF,GACpCX,OAAOa,iBAAiB,eAAgBF,GAExC,MAAMG,EAAgBC,YAAY,KAChC,MAAMd,EAAKF,IACX,GAAIE,EAGF,OAFAW,SACAN,EAAQL,GAINQ,KAAKC,MAAQF,EAAYJ,IAC3BQ,IACAL,EAAO,IAAIlC,MAAM,gCAAgC+B,UAElD,KAEH,SAASQ,IACPI,cAAcF,GACdd,OAAOiB,oBAAoB,WAAYN,GACvCX,OAAOiB,oBAAoB,eAAgBN,EAC7C,GAEJ"}
@@ -2,7 +2,7 @@
2
2
  * 🚀 WU-FRAMEWORK SOLID.JS ADAPTER - TypeScript Declarations
3
3
  */
4
4
 
5
- import type { WuCore } from '../core/wu-core';
5
+ import type { WuCore } from '../../index.js';
6
6
 
7
7
  // Solid types (generics to avoid hard dependency)
8
8
  type Component<P = {}> = (props: P) => any;
@@ -1,2 +1,2 @@
1
- function n(){return function(n={}){const{namespace:e="default"}=n,t={messages:[],isStreaming:!1,error:null};return{messages:()=>t.messages,isStreaming:()=>t.isStreaming,error:()=>t.error,async send(n){if(!n?.trim())return;const o="undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null;if(o?.ai){t.messages=[...t.messages,{id:`user-${Date.now()}`,role:"user",content:n,timestamp:Date.now()}],t.isStreaming=!0,t.error=null;try{const r=await o.ai.send(n,{namespace:e});t.messages=[...t.messages,{id:`assistant-${Date.now()}`,role:"assistant",content:r.content,timestamp:Date.now()}]}catch(n){t.error=n.message}t.isStreaming=!1}else t.error="Wu AI not available"},clear(){t.messages=[],t.error=null}}}}const e={apps:new Map,solid:null,solidWeb:null,initialized:!1};function t(){return"undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null}function o(n=5e3){return new Promise((e,o)=>{const r=t();if(r)return void e(r);const i=Date.now(),s=()=>{l(),e(t())};window.addEventListener("wu:ready",s),window.addEventListener("wu:app:ready",s);const a=setInterval(()=>{const r=t();if(r)return l(),void e(r);Date.now()-i>n&&(l(),o(new Error(`Wu Framework not found after ${n}ms`)))},200);function l(){clearInterval(a),window.removeEventListener("wu:ready",s),window.removeEventListener("wu:app:ready",s)}})}async function r(n,r,i={}){const{props:s={},onMount:a=null,onUnmount:l=null,standalone:u=!0,standaloneContainer:c="#root"}=i;if(!await async function(){if(e.initialized)return!0;try{if("undefined"!=typeof window&&window.Solid)return e.solid=window.Solid,e.solidWeb=window.SolidWeb,e.initialized=!0,!0;const[n,t]=await Promise.all([import("solid-js"),import("solid-js/web")]);return e.solid=n,e.solidWeb=t,e.initialized=!0,!0}catch(n){return console.error("[WuSolid] Failed to load Solid:",n),!1}}())return console.error(`[WuSolid] Cannot register ${n}: Solid not available`),!1;const{render:d}=e.solidWeb;let w=null;const f=o=>{if(o){e.apps.has(n)&&(console.warn(`[WuSolid] ${n} already mounted, unmounting first`),m());try{o.innerHTML="",w=d(()=>r({...s,wuAppName:n,wuInstance:t()}),o),e.apps.set(n,{container:o,Component:r,dispose:w}),console.log(`[WuSolid] ✅ ${n} mounted successfully`),a&&a(o)}catch(e){throw console.error(`[WuSolid] Mount error for ${n}:`,e),e}}else console.error(`[WuSolid] Mount failed for ${n}: container is null`)},m=t=>{const o=e.apps.get(n);if(o)try{l&&l(o.container),o.dispose&&"function"==typeof o.dispose&&o.dispose(),o.container.innerHTML="",e.apps.delete(n),console.log(`[WuSolid] ✅ ${n} unmounted successfully`)}catch(e){console.error(`[WuSolid] Unmount error for ${n}:`,e)}t&&(t.innerHTML="")};try{return(await o(3e3)).define(n,{mount:f,unmount:m}),console.log(`[WuSolid] ✅ ${n} registered with Wu Framework`),!0}catch(e){if(console.warn(`[WuSolid] Wu Framework not available for ${n}`),u){const e=document.querySelector(c);if(e)return console.log(`[WuSolid] Running ${n} in standalone mode`),f(e),!0}return!1}}function i(){return async function(n){const{name:o,url:r,appName:i=null,fallback:s=null,onLoad:a=null,onError:l=null,class:u="",style:c={}}=n,{createSignal:d,onMount:w,onCleanup:f}=e.solid,[m,p]=d(!0),[g,v]=d(null);let y,W=null;const S=i||o;return w(async()=>{try{const n=t();if(!n)throw new Error("Wu Framework not initialized");const e=`wu-slot-${S}-${Date.now()}`,o=document.createElement("div");o.id=e,o.style.cssText="width: 100%; height: 100%;",y.innerHTML="",y.appendChild(o);const i=n.app(S,{url:r,container:`#${e}`,autoInit:!0});W=i,await i.mount(),p(!1),a&&a({name:S,url:r})}catch(n){console.error(`[WuSlot] Error loading ${S}:`,n),v(n.message||"Failed to load microfrontend"),p(!1),l&&l(n)}}),f(async()=>{if(W){try{await W.unmount()}catch(n){}W=null}}),(()=>{const n=document.createElement("div");return n.className=`wu-slot ${m()?"wu-slot-loading":""} ${g()?"wu-slot-error":""} ${u}`,n.style.cssText="min-height: 100px; position: relative;",n.setAttribute("data-wu-app",S),n.setAttribute("data-wu-url",r),Object.assign(n.style,c),y=n,g()?n.innerHTML=`\n <div style="padding: 1rem; border: 1px solid #f5c6cb; border-radius: 4px; background: #f8d7da; color: #721c24;">\n <strong>Error loading ${o}</strong>\n <p style="margin: 0.5rem 0 0 0;">${g()}</p>\n </div>\n `:m()&&(n.innerHTML=s||`\n <div style="display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;">\n Loading ${o}...\n </div>\n `),n})()}}function s(n=""){const{createSignal:o,onCleanup:r}=e.solid,i=t(),s=i?.store?.get(n)||null,[a,l]=o(s);if(i?.store){const e=n?`${n}.*`:"*";r(i.store.on(e,()=>{l(i.store.get(n))}))}return[a,(e,t)=>{if(i?.store){const o=n?`${n}.${e}`:e;i.store.set(o,t)}}]}function a(n){const{createSignal:o,onCleanup:r}=e.solid,[i,s]=o(null),a=t();if(a?.eventBus){r(a.eventBus.on(n,n=>{s(n)}))}return i}function l(){const{onCleanup:n}=e.solid,o=[];return n(()=>{o.forEach(n=>n())}),{emit:(n,e,o)=>{const r=t();r?.eventBus&&r.eventBus.emit(n,e,o)},on:(n,e)=>{const r=t();if(r?.eventBus){const t=r.eventBus.on(n,e);return o.push(t),t}return()=>{}},once:(n,e)=>{const o=t();return o?.eventBus?o.eventBus.once(n,e):()=>{}},off:(n,e)=>{const o=t();o?.eventBus&&o.eventBus.off(n,e)}}}function u(){const{createContext:n,useContext:o}=e.solid,r=n(null);return{WuProvider:function(n){const e=t();return r.Provider({value:e,children:n.children})},useWu:function(){return o(r)||t()},WuContext:r}}const c={register:r,createWuSlot:i,createWuStore:s,createWuEvent:a,useWuEvents:l,createWuContext:u,createUseWuAI:n,getWuInstance:t,waitForWu:o};export{n as createUseWuAI,u as createWuContext,a as createWuEvent,i as createWuSlot,s as createWuStore,c as default,t as getWuInstance,r as register,l as useWuEvents,o as waitForWu,c as wuSolid};
1
+ function e(){return function(e={}){const{namespace:n="default"}=e,t={messages:[],isStreaming:!1,error:null};return{messages:()=>t.messages,isStreaming:()=>t.isStreaming,error:()=>t.error,async send(e){if(!e?.trim())return;const o="undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null;if(o?.ai){t.messages=[...t.messages,{id:`user-${Date.now()}`,role:"user",content:e,timestamp:Date.now()}],t.isStreaming=!0,t.error=null;try{const r=await o.ai.send(e,{namespace:n});t.messages=[...t.messages,{id:`assistant-${Date.now()}`,role:"assistant",content:r.content,timestamp:Date.now()}]}catch(e){t.error=e.message}t.isStreaming=!1}else t.error="Wu AI not available"},clear(){t.messages=[],t.error=null}}}}const n={apps:new Map,solid:null,solidWeb:null,initialized:!1};async function t(){if(n.initialized)return!0;try{if("undefined"!=typeof window&&window.Solid)return n.solid=window.Solid,n.solidWeb=window.SolidWeb,n.initialized=!0,!0;const[e,t]=await Promise.all([import("solid-js"),import("solid-js/web")]);return n.solid=e,n.solidWeb=t,n.initialized=!0,!0}catch(e){return console.error("[WuSolid] Failed to load Solid:",e),!1}}function o(){if(!n.solid&&"undefined"!=typeof window&&window.Solid&&(n.solid=window.Solid,n.solidWeb=window.SolidWeb||n.solidWeb),!n.solid)throw new Error("[WuSolid] Solid not available — call register()/ensureSolid() or expose window.Solid first");return n.solid}function r(){return"undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null}function i(e=5e3){return new Promise((n,t)=>{const o=r();if(o)return void n(o);const i=Date.now(),s=()=>{l(),n(r())};window.addEventListener("wu:ready",s),window.addEventListener("wu:app:ready",s);const a=setInterval(()=>{const o=r();if(o)return l(),void n(o);Date.now()-i>e&&(l(),t(new Error(`Wu Framework not found after ${e}ms`)))},200);function l(){clearInterval(a),window.removeEventListener("wu:ready",s),window.removeEventListener("wu:app:ready",s)}})}async function s(e,o,s={}){const{props:a={},onMount:l=null,onUnmount:u=null,standalone:d=!0,standaloneContainer:c="#root"}=s;if(!await t())return console.error(`[WuSolid] Cannot register ${e}: Solid not available`),!1;const{render:w}=n.solidWeb;let m=null;const p=t=>{if(t){n.apps.has(e)&&(console.warn(`[WuSolid] ${e} already mounted, unmounting first`),f());try{t.innerHTML="",m=w(()=>o({...a,wuAppName:e,wuInstance:r()}),t),n.apps.set(e,{container:t,Component:o,dispose:m}),console.log(`[WuSolid] ✅ ${e} mounted successfully`),l&&l(t)}catch(n){throw console.error(`[WuSolid] Mount error for ${e}:`,n),n}}else console.error(`[WuSolid] Mount failed for ${e}: container is null`)},f=t=>{const o=n.apps.get(e);if(o)try{u&&u(o.container),o.dispose&&"function"==typeof o.dispose&&o.dispose(),o.container.innerHTML="",n.apps.delete(e),console.log(`[WuSolid] ✅ ${e} unmounted successfully`)}catch(n){console.error(`[WuSolid] Unmount error for ${e}:`,n)}t&&(t.innerHTML="")};try{return(await i(3e3)).define(e,{mount:p,unmount:f}),console.log(`[WuSolid] ✅ ${e} registered with Wu Framework`),!0}catch(n){if(console.warn(`[WuSolid] Wu Framework not available for ${e}`),d){const n=document.querySelector(c);if(n)return console.log(`[WuSolid] Running ${e} in standalone mode`),p(n),!0}return!1}}function a(){return t(),function(e){const{name:n,url:t,appName:i=null,fallback:s=null,onLoad:a=null,onError:l=null,class:u="",style:d={}}=e,c=i||n;let w=null;try{w=o()}catch{const e=document.createElement("div");return e.className=`wu-slot wu-slot-loading ${u}`,e.style.cssText="min-height: 100px; position: relative;",e.setAttribute("data-wu-app",c),e.setAttribute("data-wu-url",t),Object.assign(e.style,d),e.innerHTML=s||`\n <div style="display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;">\n Loading ${n}...\n </div>\n `,setTimeout(async()=>{try{const n=r();if(!n)throw new Error("Wu Framework not initialized");const o=`wu-slot-${c}-${Date.now()}`,i=document.createElement("div");i.id=o,i.style.cssText="width: 100%; height: 100%;",e.innerHTML="",e.appendChild(i);const s=n.app(c,{url:t,container:`#${o}`,autoInit:!0});await s.mount(),e.className=`wu-slot ${u}`,a&&a({name:c,url:t})}catch(t){console.error(`[WuSlot] Error loading ${c}:`,t),e.className=`wu-slot wu-slot-error ${u}`,e.innerHTML=`\n <div style="padding: 1rem; border: 1px solid #f5c6cb; border-radius: 4px; background: #f8d7da; color: #721c24;">\n <strong>Error loading ${n}</strong>\n <p style="margin: 0.5rem 0 0 0;">${t.message||"Failed to load microfrontend"}</p>\n </div>\n `,l&&l(t)}},0),e}const{createSignal:m,onMount:p,onCleanup:f}=w,[g,y]=m(!0),[v,W]=m(null);let S,$=null;return p(async()=>{try{const e=r();if(!e)throw new Error("Wu Framework not initialized");const n=`wu-slot-${c}-${Date.now()}`,o=document.createElement("div");o.id=n,o.style.cssText="width: 100%; height: 100%;",S.innerHTML="",S.appendChild(o);const i=e.app(c,{url:t,container:`#${n}`,autoInit:!0});$=i,await i.mount(),y(!1),a&&a({name:c,url:t})}catch(e){console.error(`[WuSlot] Error loading ${c}:`,e),W(e.message||"Failed to load microfrontend"),y(!1),l&&l(e)}}),f(async()=>{if($){try{await $.unmount()}catch(e){}$=null}}),(()=>{const e=document.createElement("div");return e.className=`wu-slot ${g()?"wu-slot-loading":""} ${v()?"wu-slot-error":""} ${u}`,e.style.cssText="min-height: 100px; position: relative;",e.setAttribute("data-wu-app",c),e.setAttribute("data-wu-url",t),Object.assign(e.style,d),S=e,v()?e.innerHTML=`\n <div style="padding: 1rem; border: 1px solid #f5c6cb; border-radius: 4px; background: #f8d7da; color: #721c24;">\n <strong>Error loading ${n}</strong>\n <p style="margin: 0.5rem 0 0 0;">${v()}</p>\n </div>\n `:g()&&(e.innerHTML=s||`\n <div style="display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;">\n Loading ${n}...\n </div>\n `),e})()}}function l(e=""){const{createSignal:n,onCleanup:t}=o(),i=r(),s=i?.store?.get(e)||null,[a,l]=n(s);if(i?.store){t(i.store.on(e||"*",()=>{l(i.store.get(e))}))}return[a,(n,t)=>{if(i?.store){const o=e?`${e}.${n}`:n;i.store.set(o,t)}}]}function u(e){const{createSignal:n,onCleanup:t}=o(),[i,s]=n(null),a=r();if(a?.eventBus){t(a.eventBus.on(e,e=>{s(e)}))}return i}function d(){const{onCleanup:e}=o(),n=[];return e(()=>{n.forEach(e=>e())}),{emit:(e,n,t)=>{const o=r();o?.eventBus&&o.eventBus.emit(e,n,t)},on:(e,t)=>{const o=r();if(o?.eventBus){const r=o.eventBus.on(e,t);return n.push(r),r}return()=>{}},once:(e,n)=>{const t=r();return t?.eventBus?t.eventBus.once(e,n):()=>{}},off:(e,n)=>{const t=r();t?.eventBus&&t.eventBus.off(e,n)}}}function c(){const{createContext:e,useContext:n}=o(),t=e(null);return{WuProvider:function(e){const n=r();return t.Provider({value:n,children:e.children})},useWu:function(){return n(t)||r()},WuContext:t}}const w={register:s,createWuSlot:a,createWuStore:l,createWuEvent:u,useWuEvents:d,createWuContext:c,createUseWuAI:e,getWuInstance:r,waitForWu:i};export{e as createUseWuAI,c as createWuContext,u as createWuEvent,a as createWuSlot,l as createWuStore,w as default,r as getWuInstance,s as register,d as useWuEvents,i as waitForWu,w as wuSolid};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/adapters/solid/ai.js","../../../src/adapters/solid/index.js"],"sourcesContent":["/**\n * WU-FRAMEWORK SOLID AI INTEGRATION\n */\nfunction getWuInstance() {\n if (typeof window === 'undefined') return null;\n return window.wu || window.parent?.wu || window.top?.wu || null;\n}\n\nexport function createUseWuAI() {\n return function useWuAI(options = {}) {\n const { namespace = 'default' } = options;\n const state = { messages: [], isStreaming: false, error: null };\n return {\n messages: () => state.messages,\n isStreaming: () => state.isStreaming,\n error: () => state.error,\n async send(text) {\n if (!text?.trim()) return;\n const wu = getWuInstance();\n if (!wu?.ai) { state.error = 'Wu AI not available'; return; }\n state.messages = [...state.messages, { id: `user-${Date.now()}`, role: 'user', content: text, timestamp: Date.now() }];\n state.isStreaming = true; state.error = null;\n try {\n const res = await wu.ai.send(text, { namespace });\n state.messages = [...state.messages, { id: `assistant-${Date.now()}`, role: 'assistant', content: res.content, timestamp: Date.now() }];\n } catch (err) { state.error = err.message; }\n state.isStreaming = false;\n },\n clear() { state.messages = []; state.error = null; },\n };\n };\n}\n","/**\n * 🚀 WU-FRAMEWORK SOLID.JS ADAPTER\n *\n * Simplifica la integración de Solid.js con Wu Framework.\n * Aprovecha la reactividad fine-grained de Solid para microfrontends eficientes.\n *\n * @example\n * // Microfrontend (main.jsx)\n * import { wuSolid } from 'wu-framework/adapters/solid';\n * import App from './App';\n *\n * wuSolid.register('my-app', App);\n *\n * @example\n * // Shell (cargar microfrontend)\n * import { WuSlot } from 'wu-framework/adapters/solid';\n *\n * <WuSlot name=\"my-app\" url=\"http://localhost:3001\" />\n */\n\n// Estado global del adapter\nconst adapterState = {\n apps: new Map(),\n solid: null,\n solidWeb: null,\n initialized: false\n};\n\n/**\n * Detecta y obtiene Solid del contexto global o lo importa\n */\nasync function ensureSolid() {\n if (adapterState.initialized) return true;\n\n try {\n // Intentar obtener de window\n if (typeof window !== 'undefined' && window.Solid) {\n adapterState.solid = window.Solid;\n adapterState.solidWeb = window.SolidWeb;\n adapterState.initialized = true;\n return true;\n }\n\n // Intentar import dinámico\n const [solid, solidWeb] = await Promise.all([\n import('solid-js'),\n import('solid-js/web')\n ]);\n\n adapterState.solid = solid;\n adapterState.solidWeb = solidWeb;\n adapterState.initialized = true;\n return true;\n\n } catch (error) {\n console.error('[WuSolid] Failed to load Solid:', error);\n return false;\n }\n}\n\n/**\n * Obtiene la instancia de Wu Framework\n */\nfunction getWuInstance() {\n if (typeof window === 'undefined') return null;\n\n return window.wu\n || window.parent?.wu\n || window.top?.wu\n || null;\n}\n\n/**\n * Espera a que Wu Framework esté disponible\n */\nfunction waitForWu(timeout = 5000) {\n return new Promise((resolve, reject) => {\n const wu = getWuInstance();\n if (wu) {\n resolve(wu);\n return;\n }\n\n const startTime = Date.now();\n\n const handleWuReady = () => {\n cleanup();\n resolve(getWuInstance());\n };\n\n window.addEventListener('wu:ready', handleWuReady);\n window.addEventListener('wu:app:ready', handleWuReady);\n\n const checkInterval = setInterval(() => {\n const wu = getWuInstance();\n if (wu) {\n cleanup();\n resolve(wu);\n return;\n }\n\n if (Date.now() - startTime > timeout) {\n cleanup();\n reject(new Error(`Wu Framework not found after ${timeout}ms`));\n }\n }, 200);\n\n function cleanup() {\n clearInterval(checkInterval);\n window.removeEventListener('wu:ready', handleWuReady);\n window.removeEventListener('wu:app:ready', handleWuReady);\n }\n });\n}\n\n/**\n * Registra un componente Solid como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend\n * @param {Function} Component - Componente Solid principal\n * @param {Object} options - Opciones adicionales\n * @param {Object} options.props - Props iniciales para el componente\n * @param {Function} options.onMount - Callback después de montar\n * @param {Function} options.onUnmount - Callback antes de desmontar\n * @param {boolean} options.standalone - Permitir ejecución standalone (default: true)\n * @param {string} options.standaloneContainer - Selector para modo standalone (default: '#root')\n *\n * @example\n * // Básico\n * wuSolid.register('my-app', App);\n *\n * @example\n * // Con props\n * wuSolid.register('my-app', App, {\n * props: { apiUrl: 'https://api.example.com' },\n * onMount: (container) => console.log('Mounted!')\n * });\n */\nasync function register(appName, Component, options = {}) {\n const {\n props = {},\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#root'\n } = options;\n\n // Asegurar que Solid está disponible\n const hasSolid = await ensureSolid();\n if (!hasSolid) {\n console.error(`[WuSolid] Cannot register ${appName}: Solid not available`);\n return false;\n }\n\n const { render } = adapterState.solidWeb;\n\n let disposeApp = null;\n\n // Función de mount interna\n const mountApp = (container) => {\n if (!container) {\n console.error(`[WuSolid] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Evitar doble mount\n if (adapterState.apps.has(appName)) {\n console.warn(`[WuSolid] ${appName} already mounted, unmounting first`);\n unmountApp();\n }\n\n try {\n // Limpiar container\n container.innerHTML = '';\n\n // Renderizar componente Solid\n // render() retorna una función dispose\n disposeApp = render(\n () => Component({\n ...props,\n wuAppName: appName,\n wuInstance: getWuInstance()\n }),\n container\n );\n\n // Guardar referencia\n adapterState.apps.set(appName, {\n container,\n Component,\n dispose: disposeApp\n });\n\n console.log(`[WuSolid] ✅ ${appName} mounted successfully`);\n\n if (onMount) {\n onMount(container);\n }\n } catch (error) {\n console.error(`[WuSolid] Mount error for ${appName}:`, error);\n throw error;\n }\n };\n\n // Función de unmount interna\n const unmountApp = (container) => {\n const appData = adapterState.apps.get(appName);\n\n if (appData) {\n try {\n if (onUnmount) {\n onUnmount(appData.container);\n }\n\n // Dispose de Solid (limpia todas las reactividades)\n if (appData.dispose && typeof appData.dispose === 'function') {\n appData.dispose();\n }\n\n // Limpiar DOM\n appData.container.innerHTML = '';\n\n adapterState.apps.delete(appName);\n\n console.log(`[WuSolid] ✅ ${appName} unmounted successfully`);\n } catch (error) {\n console.error(`[WuSolid] Unmount error for ${appName}:`, error);\n }\n }\n\n if (container) {\n container.innerHTML = '';\n }\n };\n\n // Intentar registrar con Wu Framework\n try {\n const wu = await waitForWu(3000);\n\n wu.define(appName, {\n mount: mountApp,\n unmount: unmountApp\n });\n\n console.log(`[WuSolid] ✅ ${appName} registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuSolid] Wu Framework not available for ${appName}`);\n\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n\n if (containerElement) {\n console.log(`[WuSolid] Running ${appName} in standalone mode`);\n mountApp(containerElement);\n return true;\n }\n }\n\n return false;\n }\n}\n\n/**\n * Crea un componente WuSlot para Solid\n *\n * @example\n * import { WuSlot } from 'wu-framework/adapters/solid';\n *\n * function Shell() {\n * return (\n * <div>\n * <WuSlot name=\"header\" url=\"http://localhost:3001\" />\n * <WuSlot name=\"content\" url=\"http://localhost:3002\" />\n * </div>\n * );\n * }\n */\nfunction createWuSlot() {\n // Esta función debe ser llamada dentro del contexto de Solid\n return async function WuSlot(props) {\n const {\n name,\n url,\n appName = null,\n fallback = null,\n onLoad = null,\n onError = null,\n class: className = '',\n style = {}\n } = props;\n\n const { createSignal, onMount, onCleanup } = adapterState.solid;\n\n const [loading, setLoading] = createSignal(true);\n const [error, setError] = createSignal(null);\n\n let containerRef;\n let appInstance = null;\n\n const actualAppName = appName || name;\n\n onMount(async () => {\n try {\n const wu = getWuInstance();\n if (!wu) throw new Error('Wu Framework not initialized');\n\n const containerId = `wu-slot-${actualAppName}-${Date.now()}`;\n const innerContainer = document.createElement('div');\n innerContainer.id = containerId;\n innerContainer.style.cssText = 'width: 100%; height: 100%;';\n\n containerRef.innerHTML = '';\n containerRef.appendChild(innerContainer);\n\n const app = wu.app(actualAppName, {\n url,\n container: `#${containerId}`,\n autoInit: true\n });\n\n appInstance = app;\n await app.mount();\n\n setLoading(false);\n if (onLoad) onLoad({ name: actualAppName, url });\n\n } catch (err) {\n console.error(`[WuSlot] Error loading ${actualAppName}:`, err);\n setError(err.message || 'Failed to load microfrontend');\n setLoading(false);\n if (onError) onError(err);\n }\n });\n\n onCleanup(async () => {\n if (appInstance) {\n try {\n await appInstance.unmount();\n } catch (e) {}\n appInstance = null;\n }\n });\n\n // Retornar JSX de Solid\n return (() => {\n const el = document.createElement('div');\n el.className = `wu-slot ${loading() ? 'wu-slot-loading' : ''} ${error() ? 'wu-slot-error' : ''} ${className}`;\n el.style.cssText = 'min-height: 100px; position: relative;';\n el.setAttribute('data-wu-app', actualAppName);\n el.setAttribute('data-wu-url', url);\n\n Object.assign(el.style, style);\n\n containerRef = el;\n\n if (error()) {\n el.innerHTML = `\n <div style=\"padding: 1rem; border: 1px solid #f5c6cb; border-radius: 4px; background: #f8d7da; color: #721c24;\">\n <strong>Error loading ${name}</strong>\n <p style=\"margin: 0.5rem 0 0 0;\">${error()}</p>\n </div>\n `;\n } else if (loading()) {\n el.innerHTML = fallback || `\n <div style=\"display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;\">\n Loading ${name}...\n </div>\n `;\n }\n\n return el;\n })();\n };\n}\n\n/**\n * Crea un store de Wu compatible con la reactividad de Solid\n *\n * @param {string} namespace - Namespace en el store de Wu\n * @returns {Array} [state, setState] similar a createSignal\n *\n * @example\n * import { createWuStore } from 'wu-framework/adapters/solid';\n *\n * function MyComponent() {\n * const [user, setUser] = createWuStore('user');\n *\n * return (\n * <div>\n * <p>Name: {user()?.name}</p>\n * <button onClick={() => setUser('name', 'John')}>\n * Set Name\n * </button>\n * </div>\n * );\n * }\n */\nfunction createWuStore(namespace = '') {\n const { createSignal, onCleanup } = adapterState.solid;\n\n const wu = getWuInstance();\n const initialValue = wu?.store?.get(namespace) || null;\n\n const [state, setState] = createSignal(initialValue);\n\n // Suscribirse a cambios en Wu Store\n if (wu?.store) {\n const pattern = namespace ? `${namespace}.*` : '*';\n const unsubscribe = wu.store.on(pattern, () => {\n setState(wu.store.get(namespace));\n });\n\n onCleanup(unsubscribe);\n }\n\n // Función para actualizar el store\n const setWuState = (path, value) => {\n if (wu?.store) {\n const fullPath = namespace ? `${namespace}.${path}` : path;\n wu.store.set(fullPath, value);\n }\n };\n\n return [state, setWuState];\n}\n\n/**\n * Crea un signal reactivo basado en eventos de Wu\n *\n * @param {string} eventPattern - Patrón de eventos\n * @returns {Function} Signal con el último evento\n *\n * @example\n * import { createWuEvent } from 'wu-framework/adapters/solid';\n *\n * function MyComponent() {\n * const lastUserEvent = createWuEvent('user:*');\n *\n * return (\n * <Show when={lastUserEvent()}>\n * <p>Last event: {lastUserEvent()?.name}</p>\n * </Show>\n * );\n * }\n */\nfunction createWuEvent(eventPattern) {\n const { createSignal, onCleanup } = adapterState.solid;\n\n const [event, setEvent] = createSignal(null);\n\n const wu = getWuInstance();\n if (wu?.eventBus) {\n const unsubscribe = wu.eventBus.on(eventPattern, (e) => {\n setEvent(e);\n });\n\n onCleanup(unsubscribe);\n }\n\n return event;\n}\n\n/**\n * Hook para usar el EventBus de Wu Framework en Solid\n *\n * @example\n * import { useWuEvents } from 'wu-framework/adapters/solid';\n *\n * function MyComponent() {\n * const { emit, on } = useWuEvents();\n *\n * onMount(() => {\n * on('user:login', (data) => console.log('User logged in:', data));\n * });\n *\n * return (\n * <button onClick={() => emit('user:logout', { reason: 'manual' })}>\n * Logout\n * </button>\n * );\n * }\n */\nfunction useWuEvents() {\n const { onCleanup } = adapterState.solid;\n const subscriptions = [];\n\n const emit = (event, data, options) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n wu.eventBus.emit(event, data, options);\n }\n };\n\n const on = (event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n const unsubscribe = wu.eventBus.on(event, callback);\n subscriptions.push(unsubscribe);\n return unsubscribe;\n }\n return () => {};\n };\n\n const once = (event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n return wu.eventBus.once(event, callback);\n }\n return () => {};\n };\n\n const off = (event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n wu.eventBus.off(event, callback);\n }\n };\n\n // Cleanup automático\n onCleanup(() => {\n subscriptions.forEach(unsub => unsub());\n });\n\n return { emit, on, once, off };\n}\n\n/**\n * Contexto de Wu para Solid\n * Permite acceder a Wu desde cualquier componente hijo\n *\n * @example\n * import { WuProvider, useWu } from 'wu-framework/adapters/solid';\n *\n * // En el root\n * <WuProvider>\n * <App />\n * </WuProvider>\n *\n * // En cualquier componente hijo\n * function MyComponent() {\n * const wu = useWu();\n * // ...\n * }\n */\nfunction createWuContext() {\n const { createContext, useContext } = adapterState.solid;\n\n const WuContext = createContext(null);\n\n function WuProvider(props) {\n const wu = getWuInstance();\n return WuContext.Provider({\n value: wu,\n children: props.children\n });\n }\n\n function useWu() {\n return useContext(WuContext) || getWuInstance();\n }\n\n return { WuProvider, useWu, WuContext };\n}\n\n// ============================================\n// AI INTEGRATION\n// ============================================\nimport { createUseWuAI } from './ai.js';\n\n// API pública del adapter\nexport const wuSolid = {\n register,\n createWuSlot,\n createWuStore,\n createWuEvent,\n useWuEvents,\n createWuContext,\n createUseWuAI,\n getWuInstance,\n waitForWu\n};\n\nexport {\n register,\n createWuSlot,\n createWuStore,\n createWuEvent,\n useWuEvents,\n createWuContext,\n createUseWuAI,\n getWuInstance,\n waitForWu\n};\n\nexport default wuSolid;\n"],"names":["createUseWuAI","options","namespace","state","messages","isStreaming","error","send","text","trim","wu","window","parent","top","ai","id","Date","now","role","content","timestamp","res","err","message","clear","adapterState","apps","Map","solid","solidWeb","initialized","getWuInstance","waitForWu","timeout","Promise","resolve","reject","startTime","handleWuReady","cleanup","addEventListener","checkInterval","setInterval","Error","clearInterval","removeEventListener","async","register","appName","Component","props","onMount","onUnmount","standalone","standaloneContainer","Solid","SolidWeb","all","import","console","ensureSolid","render","disposeApp","mountApp","container","has","warn","unmountApp","innerHTML","wuAppName","wuInstance","set","dispose","log","appData","get","delete","define","mount","unmount","containerElement","document","querySelector","createWuSlot","name","url","fallback","onLoad","onError","class","className","style","createSignal","onCleanup","loading","setLoading","setError","containerRef","appInstance","actualAppName","containerId","innerContainer","createElement","cssText","appendChild","app","autoInit","e","el","setAttribute","Object","assign","createWuStore","initialValue","store","setState","pattern","on","path","value","fullPath","createWuEvent","eventPattern","event","setEvent","eventBus","useWuEvents","subscriptions","forEach","unsub","emit","data","callback","unsubscribe","push","once","off","createWuContext","createContext","useContext","WuContext","WuProvider","Provider","children","useWu","wuSolid"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/adapters/solid/ai.js","../../../src/adapters/solid/index.js"],"sourcesContent":["/**\n * WU-FRAMEWORK SOLID AI INTEGRATION\n */\nfunction getWuInstance() {\n if (typeof window === 'undefined') return null;\n return window.wu || window.parent?.wu || window.top?.wu || null;\n}\n\nexport function createUseWuAI() {\n return function useWuAI(options = {}) {\n const { namespace = 'default' } = options;\n const state = { messages: [], isStreaming: false, error: null };\n return {\n messages: () => state.messages,\n isStreaming: () => state.isStreaming,\n error: () => state.error,\n async send(text) {\n if (!text?.trim()) return;\n const wu = getWuInstance();\n if (!wu?.ai) { state.error = 'Wu AI not available'; return; }\n state.messages = [...state.messages, { id: `user-${Date.now()}`, role: 'user', content: text, timestamp: Date.now() }];\n state.isStreaming = true; state.error = null;\n try {\n const res = await wu.ai.send(text, { namespace });\n state.messages = [...state.messages, { id: `assistant-${Date.now()}`, role: 'assistant', content: res.content, timestamp: Date.now() }];\n } catch (err) { state.error = err.message; }\n state.isStreaming = false;\n },\n clear() { state.messages = []; state.error = null; },\n };\n };\n}\n","/**\n * 🚀 WU-FRAMEWORK SOLID.JS ADAPTER\n *\n * Simplifica la integración de Solid.js con Wu Framework.\n * Aprovecha la reactividad fine-grained de Solid para microfrontends eficientes.\n *\n * @example\n * // Microfrontend (main.jsx)\n * import { wuSolid } from 'wu-framework/adapters/solid';\n * import App from './App';\n *\n * wuSolid.register('my-app', App);\n *\n * @example\n * // Shell (cargar microfrontend)\n * import { createWuSlot } from 'wu-framework/adapters/solid';\n * const WuSlot = createWuSlot();\n *\n * <WuSlot name=\"my-app\" url=\"http://localhost:3001\" />\n */\n\n// Estado global del adapter\nconst adapterState = {\n apps: new Map(),\n solid: null,\n solidWeb: null,\n initialized: false\n};\n\n/**\n * Detecta y obtiene Solid del contexto global o lo importa\n */\nasync function ensureSolid() {\n if (adapterState.initialized) return true;\n\n try {\n // Intentar obtener de window\n if (typeof window !== 'undefined' && window.Solid) {\n adapterState.solid = window.Solid;\n adapterState.solidWeb = window.SolidWeb;\n adapterState.initialized = true;\n return true;\n }\n\n // Intentar import dinámico\n const [solid, solidWeb] = await Promise.all([\n import('solid-js'),\n import('solid-js/web')\n ]);\n\n adapterState.solid = solid;\n adapterState.solidWeb = solidWeb;\n adapterState.initialized = true;\n return true;\n\n } catch (error) {\n console.error('[WuSolid] Failed to load Solid:', error);\n return false;\n }\n}\n\n/**\n * Obtiene Solid de forma síncrona (estado del adapter o window.Solid)\n */\nfunction getSolid() {\n if (!adapterState.solid && typeof window !== 'undefined' && window.Solid) {\n adapterState.solid = window.Solid;\n adapterState.solidWeb = window.SolidWeb || adapterState.solidWeb;\n }\n if (!adapterState.solid) {\n throw new Error('[WuSolid] Solid not available — call register()/ensureSolid() or expose window.Solid first');\n }\n return adapterState.solid;\n}\n\n/**\n * Obtiene la instancia de Wu Framework\n */\nfunction getWuInstance() {\n if (typeof window === 'undefined') return null;\n\n return window.wu\n || window.parent?.wu\n || window.top?.wu\n || null;\n}\n\n/**\n * Espera a que Wu Framework esté disponible\n */\nfunction waitForWu(timeout = 5000) {\n return new Promise((resolve, reject) => {\n const wu = getWuInstance();\n if (wu) {\n resolve(wu);\n return;\n }\n\n const startTime = Date.now();\n\n const handleWuReady = () => {\n cleanup();\n resolve(getWuInstance());\n };\n\n window.addEventListener('wu:ready', handleWuReady);\n window.addEventListener('wu:app:ready', handleWuReady);\n\n const checkInterval = setInterval(() => {\n const wu = getWuInstance();\n if (wu) {\n cleanup();\n resolve(wu);\n return;\n }\n\n if (Date.now() - startTime > timeout) {\n cleanup();\n reject(new Error(`Wu Framework not found after ${timeout}ms`));\n }\n }, 200);\n\n function cleanup() {\n clearInterval(checkInterval);\n window.removeEventListener('wu:ready', handleWuReady);\n window.removeEventListener('wu:app:ready', handleWuReady);\n }\n });\n}\n\n/**\n * Registra un componente Solid como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend\n * @param {Function} Component - Componente Solid principal\n * @param {Object} options - Opciones adicionales\n * @param {Object} options.props - Props iniciales para el componente\n * @param {Function} options.onMount - Callback después de montar\n * @param {Function} options.onUnmount - Callback antes de desmontar\n * @param {boolean} options.standalone - Permitir ejecución standalone (default: true)\n * @param {string} options.standaloneContainer - Selector para modo standalone (default: '#root')\n *\n * @example\n * // Básico\n * wuSolid.register('my-app', App);\n *\n * @example\n * // Con props\n * wuSolid.register('my-app', App, {\n * props: { apiUrl: 'https://api.example.com' },\n * onMount: (container) => console.log('Mounted!')\n * });\n */\nasync function register(appName, Component, options = {}) {\n const {\n props = {},\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#root'\n } = options;\n\n // Asegurar que Solid está disponible\n const hasSolid = await ensureSolid();\n if (!hasSolid) {\n console.error(`[WuSolid] Cannot register ${appName}: Solid not available`);\n return false;\n }\n\n const { render } = adapterState.solidWeb;\n\n let disposeApp = null;\n\n // Función de mount interna\n const mountApp = (container) => {\n if (!container) {\n console.error(`[WuSolid] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Evitar doble mount\n if (adapterState.apps.has(appName)) {\n console.warn(`[WuSolid] ${appName} already mounted, unmounting first`);\n unmountApp();\n }\n\n try {\n // Limpiar container\n container.innerHTML = '';\n\n // Renderizar componente Solid\n // render() retorna una función dispose\n disposeApp = render(\n () => Component({\n ...props,\n wuAppName: appName,\n wuInstance: getWuInstance()\n }),\n container\n );\n\n // Guardar referencia\n adapterState.apps.set(appName, {\n container,\n Component,\n dispose: disposeApp\n });\n\n console.log(`[WuSolid] ✅ ${appName} mounted successfully`);\n\n if (onMount) {\n onMount(container);\n }\n } catch (error) {\n console.error(`[WuSolid] Mount error for ${appName}:`, error);\n throw error;\n }\n };\n\n // Función de unmount interna\n const unmountApp = (container) => {\n const appData = adapterState.apps.get(appName);\n\n if (appData) {\n try {\n if (onUnmount) {\n onUnmount(appData.container);\n }\n\n // Dispose de Solid (limpia todas las reactividades)\n if (appData.dispose && typeof appData.dispose === 'function') {\n appData.dispose();\n }\n\n // Limpiar DOM\n appData.container.innerHTML = '';\n\n adapterState.apps.delete(appName);\n\n console.log(`[WuSolid] ✅ ${appName} unmounted successfully`);\n } catch (error) {\n console.error(`[WuSolid] Unmount error for ${appName}:`, error);\n }\n }\n\n if (container) {\n container.innerHTML = '';\n }\n };\n\n // Intentar registrar con Wu Framework\n try {\n const wu = await waitForWu(3000);\n\n wu.define(appName, {\n mount: mountApp,\n unmount: unmountApp\n });\n\n console.log(`[WuSolid] ✅ ${appName} registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuSolid] Wu Framework not available for ${appName}`);\n\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n\n if (containerElement) {\n console.log(`[WuSolid] Running ${appName} in standalone mode`);\n mountApp(containerElement);\n return true;\n }\n }\n\n return false;\n }\n}\n\n/**\n * Crea un componente WuSlot para Solid\n *\n * @example\n * import { createWuSlot } from 'wu-framework/adapters/solid';\n * const WuSlot = createWuSlot();\n *\n * function Shell() {\n * return (\n * <div>\n * <WuSlot name=\"header\" url=\"http://localhost:3001\" />\n * <WuSlot name=\"content\" url=\"http://localhost:3002\" />\n * </div>\n * );\n * }\n */\nfunction createWuSlot() {\n // Precargar Solid para que esté disponible al renderizar\n ensureSolid();\n\n // Esta función debe ser llamada dentro del contexto de Solid\n return function WuSlot(props) {\n const {\n name,\n url,\n appName = null,\n fallback = null,\n onLoad = null,\n onError = null,\n class: className = '',\n style = {}\n } = props;\n\n const actualAppName = appName || name;\n\n // Solid puede no haber cargado aún (ensureSolid() importa en background\n // y el shell suele renderizar sincrónicamente después de createWuSlot).\n // Tirar acá abortaría el render del shell entero: degradar a un slot\n // plano que monta el microfrontend sin primitivas reactivas.\n let solidApi = null;\n try {\n solidApi = getSolid();\n } catch {\n const el = document.createElement('div');\n el.className = `wu-slot wu-slot-loading ${className}`;\n el.style.cssText = 'min-height: 100px; position: relative;';\n el.setAttribute('data-wu-app', actualAppName);\n el.setAttribute('data-wu-url', url);\n Object.assign(el.style, style);\n el.innerHTML = fallback || `\n <div style=\"display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;\">\n Loading ${name}...\n </div>\n `;\n // Diferido para que Solid termine de insertar `el` en el documento\n setTimeout(async () => {\n try {\n const wu = getWuInstance();\n if (!wu) throw new Error('Wu Framework not initialized');\n const containerId = `wu-slot-${actualAppName}-${Date.now()}`;\n const innerContainer = document.createElement('div');\n innerContainer.id = containerId;\n innerContainer.style.cssText = 'width: 100%; height: 100%;';\n el.innerHTML = '';\n el.appendChild(innerContainer);\n const app = wu.app(actualAppName, { url, container: `#${containerId}`, autoInit: true });\n await app.mount();\n el.className = `wu-slot ${className}`;\n if (onLoad) onLoad({ name: actualAppName, url });\n } catch (err) {\n console.error(`[WuSlot] Error loading ${actualAppName}:`, err);\n el.className = `wu-slot wu-slot-error ${className}`;\n el.innerHTML = `\n <div style=\"padding: 1rem; border: 1px solid #f5c6cb; border-radius: 4px; background: #f8d7da; color: #721c24;\">\n <strong>Error loading ${name}</strong>\n <p style=\"margin: 0.5rem 0 0 0;\">${err.message || 'Failed to load microfrontend'}</p>\n </div>\n `;\n if (onError) onError(err);\n }\n }, 0);\n return el;\n }\n\n const { createSignal, onMount, onCleanup } = solidApi;\n\n const [loading, setLoading] = createSignal(true);\n const [error, setError] = createSignal(null);\n\n let containerRef;\n let appInstance = null;\n\n onMount(async () => {\n try {\n const wu = getWuInstance();\n if (!wu) throw new Error('Wu Framework not initialized');\n\n const containerId = `wu-slot-${actualAppName}-${Date.now()}`;\n const innerContainer = document.createElement('div');\n innerContainer.id = containerId;\n innerContainer.style.cssText = 'width: 100%; height: 100%;';\n\n containerRef.innerHTML = '';\n containerRef.appendChild(innerContainer);\n\n const app = wu.app(actualAppName, {\n url,\n container: `#${containerId}`,\n autoInit: true\n });\n\n appInstance = app;\n await app.mount();\n\n setLoading(false);\n if (onLoad) onLoad({ name: actualAppName, url });\n\n } catch (err) {\n console.error(`[WuSlot] Error loading ${actualAppName}:`, err);\n setError(err.message || 'Failed to load microfrontend');\n setLoading(false);\n if (onError) onError(err);\n }\n });\n\n onCleanup(async () => {\n if (appInstance) {\n try {\n await appInstance.unmount();\n } catch (e) {}\n appInstance = null;\n }\n });\n\n // Retornar JSX de Solid\n return (() => {\n const el = document.createElement('div');\n el.className = `wu-slot ${loading() ? 'wu-slot-loading' : ''} ${error() ? 'wu-slot-error' : ''} ${className}`;\n el.style.cssText = 'min-height: 100px; position: relative;';\n el.setAttribute('data-wu-app', actualAppName);\n el.setAttribute('data-wu-url', url);\n\n Object.assign(el.style, style);\n\n containerRef = el;\n\n if (error()) {\n el.innerHTML = `\n <div style=\"padding: 1rem; border: 1px solid #f5c6cb; border-radius: 4px; background: #f8d7da; color: #721c24;\">\n <strong>Error loading ${name}</strong>\n <p style=\"margin: 0.5rem 0 0 0;\">${error()}</p>\n </div>\n `;\n } else if (loading()) {\n el.innerHTML = fallback || `\n <div style=\"display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;\">\n Loading ${name}...\n </div>\n `;\n }\n\n return el;\n })();\n };\n}\n\n/**\n * Crea un store de Wu compatible con la reactividad de Solid\n *\n * @param {string} namespace - Namespace en el store de Wu\n * @returns {Array} [state, setState] similar a createSignal\n *\n * @example\n * import { createWuStore } from 'wu-framework/adapters/solid';\n *\n * function MyComponent() {\n * const [user, setUser] = createWuStore('user');\n *\n * return (\n * <div>\n * <p>Name: {user()?.name}</p>\n * <button onClick={() => setUser('name', 'John')}>\n * Set Name\n * </button>\n * </div>\n * );\n * }\n */\nfunction createWuStore(namespace = '') {\n const { createSignal, onCleanup } = getSolid();\n\n const wu = getWuInstance();\n const initialValue = wu?.store?.get(namespace) || null;\n\n const [state, setState] = createSignal(initialValue);\n\n // Suscribirse a cambios en Wu Store: la ruta directa recibe escrituras\n // exactas y anidadas (notify recorre los padres); `ns.*` no ve ninguna.\n if (wu?.store) {\n const unsubscribe = wu.store.on(namespace || '*', () => {\n setState(wu.store.get(namespace));\n });\n\n onCleanup(unsubscribe);\n }\n\n // Función para actualizar el store\n const setWuState = (path, value) => {\n if (wu?.store) {\n const fullPath = namespace ? `${namespace}.${path}` : path;\n wu.store.set(fullPath, value);\n }\n };\n\n return [state, setWuState];\n}\n\n/**\n * Crea un signal reactivo basado en eventos de Wu\n *\n * @param {string} eventPattern - Patrón de eventos\n * @returns {Function} Signal con el último evento\n *\n * @example\n * import { createWuEvent } from 'wu-framework/adapters/solid';\n *\n * function MyComponent() {\n * const lastUserEvent = createWuEvent('user:*');\n *\n * return (\n * <Show when={lastUserEvent()}>\n * <p>Last event: {lastUserEvent()?.name}</p>\n * </Show>\n * );\n * }\n */\nfunction createWuEvent(eventPattern) {\n const { createSignal, onCleanup } = getSolid();\n\n const [event, setEvent] = createSignal(null);\n\n const wu = getWuInstance();\n if (wu?.eventBus) {\n const unsubscribe = wu.eventBus.on(eventPattern, (e) => {\n setEvent(e);\n });\n\n onCleanup(unsubscribe);\n }\n\n return event;\n}\n\n/**\n * Hook para usar el EventBus de Wu Framework en Solid\n *\n * @example\n * import { useWuEvents } from 'wu-framework/adapters/solid';\n *\n * function MyComponent() {\n * const { emit, on } = useWuEvents();\n *\n * onMount(() => {\n * on('user:login', (data) => console.log('User logged in:', data));\n * });\n *\n * return (\n * <button onClick={() => emit('user:logout', { reason: 'manual' })}>\n * Logout\n * </button>\n * );\n * }\n */\nfunction useWuEvents() {\n const { onCleanup } = getSolid();\n const subscriptions = [];\n\n const emit = (event, data, options) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n wu.eventBus.emit(event, data, options);\n }\n };\n\n const on = (event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n const unsubscribe = wu.eventBus.on(event, callback);\n subscriptions.push(unsubscribe);\n return unsubscribe;\n }\n return () => {};\n };\n\n const once = (event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n return wu.eventBus.once(event, callback);\n }\n return () => {};\n };\n\n const off = (event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n wu.eventBus.off(event, callback);\n }\n };\n\n // Cleanup automático\n onCleanup(() => {\n subscriptions.forEach(unsub => unsub());\n });\n\n return { emit, on, once, off };\n}\n\n/**\n * Contexto de Wu para Solid\n * Permite acceder a Wu desde cualquier componente hijo\n *\n * @example\n * import { WuProvider, useWu } from 'wu-framework/adapters/solid';\n *\n * // En el root\n * <WuProvider>\n * <App />\n * </WuProvider>\n *\n * // En cualquier componente hijo\n * function MyComponent() {\n * const wu = useWu();\n * // ...\n * }\n */\nfunction createWuContext() {\n const { createContext, useContext } = getSolid();\n\n const WuContext = createContext(null);\n\n function WuProvider(props) {\n const wu = getWuInstance();\n return WuContext.Provider({\n value: wu,\n children: props.children\n });\n }\n\n function useWu() {\n return useContext(WuContext) || getWuInstance();\n }\n\n return { WuProvider, useWu, WuContext };\n}\n\n// ============================================\n// AI INTEGRATION\n// ============================================\nimport { createUseWuAI } from './ai.js';\n\n// API pública del adapter\nexport const wuSolid = {\n register,\n createWuSlot,\n createWuStore,\n createWuEvent,\n useWuEvents,\n createWuContext,\n createUseWuAI,\n getWuInstance,\n waitForWu\n};\n\nexport {\n register,\n createWuSlot,\n createWuStore,\n createWuEvent,\n useWuEvents,\n createWuContext,\n createUseWuAI,\n getWuInstance,\n waitForWu\n};\n\nexport default wuSolid;\n"],"names":["createUseWuAI","options","namespace","state","messages","isStreaming","error","send","text","trim","wu","window","parent","top","ai","id","Date","now","role","content","timestamp","res","err","message","clear","adapterState","apps","Map","solid","solidWeb","initialized","async","ensureSolid","Solid","SolidWeb","Promise","all","import","console","getSolid","Error","getWuInstance","waitForWu","timeout","resolve","reject","startTime","handleWuReady","cleanup","addEventListener","checkInterval","setInterval","clearInterval","removeEventListener","register","appName","Component","props","onMount","onUnmount","standalone","standaloneContainer","render","disposeApp","mountApp","container","has","warn","unmountApp","innerHTML","wuAppName","wuInstance","set","dispose","log","appData","get","delete","define","mount","unmount","containerElement","document","querySelector","createWuSlot","name","url","fallback","onLoad","onError","class","className","style","actualAppName","solidApi","el","createElement","cssText","setAttribute","Object","assign","setTimeout","containerId","innerContainer","appendChild","app","autoInit","createSignal","onCleanup","loading","setLoading","setError","containerRef","appInstance","e","createWuStore","initialValue","store","setState","on","path","value","fullPath","createWuEvent","eventPattern","event","setEvent","eventBus","useWuEvents","subscriptions","forEach","unsub","emit","data","callback","unsubscribe","push","once","off","createWuContext","createContext","useContext","WuContext","WuProvider","Provider","children","useWu","wuSolid"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * WU-FRAMEWORK STENCIL ADAPTER - TypeScript Declarations
3
3
  */
4
4
 
5
- import type { WuCore } from '../../core/wu-core';
5
+ import type { WuCore } from '../../index.js';
6
6
 
7
7
  /**
8
8
  * Stencil adapter registration options
@@ -2,7 +2,7 @@
2
2
  * WU-FRAMEWORK STIMULUS ADAPTER - TypeScript Declarations
3
3
  */
4
4
 
5
- import type { WuCore } from '../../core/wu-core';
5
+ import type { WuCore } from '../../index.js';
6
6
 
7
7
  /**
8
8
  * Stimulus app configuration
@@ -2,7 +2,7 @@
2
2
  * 🚀 WU-FRAMEWORK SVELTE ADAPTER - TypeScript Declarations
3
3
  */
4
4
 
5
- import type { WuCore } from '../core/wu-core';
5
+ import type { WuCore } from '../../index.js';
6
6
 
7
7
  // Svelte types (generics to avoid hard dependency)
8
8
  type SvelteComponent = any;