wu-framework 2.1.2 → 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
- function n(n={}){const{namespace:e="default"}=n,t=new Set;let o={messages:[],isStreaming:!1,error:null};function r(){t.forEach(n=>n(o))}return{subscribe:n=>(t.add(n),n(o),()=>t.delete(n)),async send(n){if(!n?.trim())return;const t="undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null;if(!t?.ai)return o={...o,error:"Wu AI not available"},void r();o={...o,messages:[...o.messages,{id:`user-${Date.now()}`,role:"user",content:n,timestamp:Date.now()}],isStreaming:!0,error:null},r();try{const r=await t.ai.send(n,{namespace:e});o={...o,messages:[...o.messages,{id:`assistant-${Date.now()}`,role:"assistant",content:r.content,timestamp:Date.now()}],isStreaming:!1}}catch(n){o={...o,isStreaming:!1,error:n.message}}r()},clear(){o={messages:[],isStreaming:!1,error:null},r()}}}const e={apps:new Map,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 a=Date.now(),s=()=>{l(),e(t())};window.addEventListener("wu:ready",s),window.addEventListener("wu:app:ready",s);const i=setInterval(()=>{const r=t();if(r)return l(),void e(r);Date.now()-a>n&&(l(),o(new Error(`Wu Framework not found after ${n}ms`)))},200);function l(){clearInterval(i),window.removeEventListener("wu:ready",s),window.removeEventListener("wu:app:ready",s)}})}async function r(n,r,a={}){const{props:s={},context:i=new Map,intro:l=!1,onMount:u=null,onUnmount:c=null,standalone:d=!0,standaloneContainer:p="#app"}=a,m=o=>{if(o){e.apps.has(n)&&(console.warn(`[WuSvelte] ${n} already mounted, unmounting first`),w());try{o.innerHTML="";const a=new r({target:o,props:{...s,wuAppName:n,wuInstance:t()},context:i,intro:l});e.apps.set(n,{instance:a,container:o,Component:r}),console.log(`[WuSvelte] ✅ ${n} mounted successfully`),u&&u(o,a)}catch(e){throw console.error(`[WuSvelte] Mount error for ${n}:`,e),e}}else console.error(`[WuSvelte] Mount failed for ${n}: container is null`)},w=t=>{const o=e.apps.get(n);if(o)try{c&&c(o.container,o.instance),o.instance.$destroy(),e.apps.delete(n),console.log(`[WuSvelte] ✅ ${n} unmounted successfully`)}catch(e){console.error(`[WuSvelte] Unmount error for ${n}:`,e)}t&&(t.innerHTML="")};try{return(await o(3e3)).define(n,{mount:m,unmount:w}),console.log(`[WuSvelte] ✅ ${n} registered with Wu Framework`),!0}catch(e){if(console.warn(`[WuSvelte] Wu Framework not available for ${n}`),d){const e=document.querySelector(p);if(e)return console.log(`[WuSvelte] Running ${n} in standalone mode`),m(e),!0;console.warn(`[WuSvelte] Standalone container ${p} not found`)}return!1}}async function a(n,a,s={}){const{props:i={},onMount:l=null,onUnmount:u=null,standalone:c=!0,standaloneContainer:d="#app"}=s,p=async o=>{if(o){e.apps.has(n)&&(console.warn(`[WuSvelte5] ${n} already mounted, unmounting first`),await m());try{let u;o.innerHTML="";try{u=(await import("svelte")).mount}catch(e){return console.warn("[WuSvelte5] Svelte 5 mount not available, using legacy API"),r(n,a,s)}const c=u(a,{target:o,props:{...i,wuAppName:n,wuInstance:t()}});e.apps.set(n,{instance:c,container:o,Component:a,isSvelte5:!0}),console.log(`[WuSvelte5] ✅ ${n} mounted successfully`),l&&l(o,c)}catch(e){throw console.error(`[WuSvelte5] Mount error for ${n}:`,e),e}}else console.error(`[WuSvelte5] Mount failed for ${n}: container is null`)},m=async t=>{const o=e.apps.get(n);if(o)try{if(u&&u(o.container,o.instance),o.isSvelte5)try{const n=await import("svelte");n.unmount&&n.unmount(o.instance)}catch(n){o.instance.$destroy&&o.instance.$destroy()}else o.instance.$destroy();e.apps.delete(n),console.log(`[WuSvelte5] ✅ ${n} unmounted successfully`)}catch(e){console.error(`[WuSvelte5] Unmount error for ${n}:`,e)}t&&(t.innerHTML="")};try{return(await o(3e3)).define(n,{mount:p,unmount:m}),console.log(`[WuSvelte5] ✅ ${n} registered with Wu Framework`),!0}catch(e){if(console.warn(`[WuSvelte5] Wu Framework not available for ${n}`),c){const e=document.querySelector(d);if(e)return console.log(`[WuSvelte5] Running ${n} in standalone mode`),await p(e),!0}return!1}}function s(n=""){const e=new Set;let o=null,r=null;const a=t();if(a?.store){o=a.store.get(n);const t=n?`${n}.*`:"*";r=a.store.on(t,()=>{o=a.store.get(n),e.forEach(n=>n(o))})}return{subscribe:n=>(e.add(n),n(o),()=>{e.delete(n),0===e.size&&r&&(r(),r=null)}),set(e,o){const r=t();if(r?.store){const t=n?`${n}.${e}`:e;r.store.set(t,o)}},get(e=""){const o=t();if(o?.store){const t=n?e?`${n}.${e}`:n:e;return o.store.get(t)}return null},update(e){const r=e(o),a=t();a?.store&&n&&a.store.set(n,r)}}}function i(n){const e=new Set;let o=null,r=null;const a=t();return a?.eventBus&&(r=a.eventBus.on(n,n=>{o=n,e.forEach(n=>n(o))})),{subscribe:n=>(e.add(n),n(o),()=>{e.delete(n),0===e.size&&r&&(r(),r=null)}),emit(e,o){const r=t();if(r?.eventBus){const t=n.replace("*","custom");r.eventBus.emit(t,e,o)}}}}function l(){const n=[];return{emit:(n,e,o)=>{const r=t();r?.eventBus?r.eventBus.emit(n,e,o):console.warn("[useWuEvents] Wu Framework not available")},on:(e,o)=>{const r=t();if(r?.eventBus){const t=r.eventBus.on(e,o);return n.push(t),t}return console.warn("[useWuEvents] Wu Framework not available"),()=>{}},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)},cleanup:()=>{n.forEach(n=>n()),n.length=0}}}function u(){return{props:["name","url","appName","fallbackText"],template:"\n<script>\n import { onMount, onDestroy, createEventDispatcher } from 'svelte';\n import { getWuInstance } from 'wu-framework/adapters/svelte';\n\n export let name;\n export let url;\n export let appName = null;\n export let fallbackText = null;\n\n const dispatch = createEventDispatcher();\n\n let container;\n let loading = true;\n let error = null;\n let appInstance = null;\n\n $: actualAppName = appName || name;\n\n onMount(async () => {\n await mountMicrofrontend();\n });\n\n onDestroy(() => {\n unmountMicrofrontend();\n });\n\n async function mountMicrofrontend() {\n try {\n loading = true;\n error = null;\n\n const wu = getWuInstance();\n if (!wu) {\n throw new Error('Wu Framework not initialized');\n }\n\n const containerId = `wu-slot-${actualAppName}-${Date.now()}`;\n const innerContainer = document.createElement('div');\n innerContainer.id = containerId;\n innerContainer.style.width = '100%';\n innerContainer.style.height = '100%';\n\n container.innerHTML = '';\n container.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 loading = false;\n dispatch('load', { name: actualAppName, url });\n dispatch('mount', { name: actualAppName, container: innerContainer });\n\n } catch (err) {\n console.error(`[WuSlot] Error loading ${actualAppName}:`, err);\n error = err.message || 'Failed to load microfrontend';\n loading = false;\n dispatch('error', err);\n }\n }\n\n async function unmountMicrofrontend() {\n if (appInstance) {\n dispatch('unmount', { name: actualAppName });\n\n try {\n await appInstance.unmount();\n } catch (err) {\n console.warn(`[WuSlot] Error unmounting ${actualAppName}:`, err);\n }\n\n appInstance = null;\n }\n }\n<\/script>\n\n<div\n bind:this={container}\n class=\"wu-slot\"\n class:wu-slot-loading={loading}\n class:wu-slot-error={error}\n data-wu-app={actualAppName}\n data-wu-url={url}\n style=\"min-height: 100px; position: relative;\">\n\n {#if error}\n <div class=\"wu-slot-error-message\"\n 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 {:else if loading}\n <div class=\"wu-slot-loading-message\"\n style=\"display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;\">\n {fallbackText || `Loading ${name}...`}\n </div>\n {/if}\n</div>\n\n<style>\n .wu-slot {\n width: 100%;\n min-height: 100px;\n }\n</style>\n ".trim(),createInstance:(n,e)=>{const o=document.createElement("div");o.className="wu-slot",o.style.minHeight="100px",o.style.position="relative",n.appendChild(o);let r=!0,a=null,s=null;const i=e.appName||e.name,l=()=>{a?o.innerHTML=`\n <div style="padding: 1rem; border: 1px solid #f5c6cb; border-radius: 4px; background: #f8d7da; color: #721c24;">\n <strong>Error loading ${e.name}</strong>\n <p style="margin: 0.5rem 0 0 0;">${a}</p>\n </div>\n `:r&&(o.innerHTML=`\n <div style="display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;">\n ${e.fallbackText||`Loading ${e.name}...`}\n </div>\n `)};return(async()=>{try{l();const n=t();if(!n)throw new Error("Wu Framework not initialized");const a=`wu-slot-${i}-${Date.now()}`,u=document.createElement("div");u.id=a,u.style.cssText="width: 100%; height: 100%;",o.innerHTML="",o.appendChild(u);const c=n.app(i,{url:e.url,container:`#${a}`,autoInit:!0});s=c,await c.mount(),r=!1,e.onLoad&&e.onLoad({name:i,url:e.url})}catch(n){a=n.message,r=!1,l(),e.onError&&e.onError(n)}})(),{destroy:async()=>{if(s){try{await s.unmount()}catch(n){}s=null}o.remove()}}}}}const c={register:r,registerSvelte5:a,createWuStore:s,createWuEventStore:i,useWuEvents:l,createWuSlotConfig:u,createWuAIStore:n,getWuInstance:t,waitForWu:o};export{n as createWuAIStore,i as createWuEventStore,u as createWuSlotConfig,s as createWuStore,c as default,t as getWuInstance,r as register,a as registerSvelte5,l as useWuEvents,o as waitForWu,c as wuSvelte};
1
+ function n(n={}){const{namespace:e="default"}=n,t=new Set;let o={messages:[],isStreaming:!1,error:null};function r(){t.forEach(n=>n(o))}return{subscribe:n=>(t.add(n),n(o),()=>t.delete(n)),async send(n){if(!n?.trim())return;const t="undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null;if(!t?.ai)return o={...o,error:"Wu AI not available"},void r();o={...o,messages:[...o.messages,{id:`user-${Date.now()}`,role:"user",content:n,timestamp:Date.now()}],isStreaming:!0,error:null},r();try{const r=await t.ai.send(n,{namespace:e});o={...o,messages:[...o.messages,{id:`assistant-${Date.now()}`,role:"assistant",content:r.content,timestamp:Date.now()}],isStreaming:!1}}catch(n){o={...o,isStreaming:!1,error:n.message}}r()},clear(){o={messages:[],isStreaming:!1,error:null},r()}}}const e={apps:new Map,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 a=Date.now(),s=()=>{i(),e(t())};window.addEventListener("wu:ready",s),window.addEventListener("wu:app:ready",s);const l=setInterval(()=>{const r=t();if(r)return i(),void e(r);Date.now()-a>n&&(i(),o(new Error(`Wu Framework not found after ${n}ms`)))},200);function i(){clearInterval(l),window.removeEventListener("wu:ready",s),window.removeEventListener("wu:app:ready",s)}})}async function r(n,r,a={}){const{props:s={},context:l=new Map,intro:i=!1,onMount:u=null,onUnmount:c=null,standalone:d=!0,standaloneContainer:p="#app"}=a,m=o=>{if(o){e.apps.has(n)&&(console.warn(`[WuSvelte] ${n} already mounted, unmounting first`),w());try{o.innerHTML="";const a=new r({target:o,props:{...s,wuAppName:n,wuInstance:t()},context:l,intro:i});e.apps.set(n,{instance:a,container:o,Component:r}),console.log(`[WuSvelte] ✅ ${n} mounted successfully`),u&&u(o,a)}catch(e){throw console.error(`[WuSvelte] Mount error for ${n}:`,e),e}}else console.error(`[WuSvelte] Mount failed for ${n}: container is null`)},w=t=>{const o=e.apps.get(n);if(o)try{c&&c(o.container,o.instance),o.instance.$destroy(),e.apps.delete(n),console.log(`[WuSvelte] ✅ ${n} unmounted successfully`)}catch(e){console.error(`[WuSvelte] Unmount error for ${n}:`,e)}t&&(t.innerHTML="")},f=(t,o)=>{const r=e.apps.get(n);r?.instance?.$set&&r.instance.$set(o||{})};try{return(await o(3e3)).define(n,{mount:m,unmount:w,update:f}),console.log(`[WuSvelte] ✅ ${n} registered with Wu Framework`),!0}catch(e){if(console.warn(`[WuSvelte] Wu Framework not available for ${n}`),d){const e=document.querySelector(p);if(e)return console.log(`[WuSvelte] Running ${n} in standalone mode`),m(e),!0;console.warn(`[WuSvelte] Standalone container ${p} not found`)}return!1}}async function a(n,r,a={}){const{props:s={},onMount:l=null,onUnmount:i=null,standalone:u=!0,standaloneContainer:c="#app"}=a,d=async o=>{if(o){e.apps.has(n)&&(console.warn(`[WuSvelte5] ${n} already mounted, unmounting first`),await p());try{o.innerHTML="";let a=null;try{a=(await import("svelte")).mount}catch(n){}const i={...s,wuAppName:n,wuInstance:t()};let u,c=!0;a?u=a(r,{target:o,props:i}):(console.warn("[WuSvelte5] Svelte 5 mount not available, using legacy API"),c=!1,u=new r({target:o,props:i})),e.apps.set(n,{instance:u,container:o,Component:r,isSvelte5:c}),console.log(`[WuSvelte5] ✅ ${n} mounted successfully`),l&&l(o,u)}catch(e){throw console.error(`[WuSvelte5] Mount error for ${n}:`,e),e}}else console.error(`[WuSvelte5] Mount failed for ${n}: container is null`)},p=async t=>{const o=e.apps.get(n);if(o)try{if(i&&i(o.container,o.instance),o.isSvelte5)try{const n=await import("svelte");n.unmount&&n.unmount(o.instance)}catch(n){o.instance.$destroy&&o.instance.$destroy()}else o.instance.$destroy();e.apps.delete(n),console.log(`[WuSvelte5] ✅ ${n} unmounted successfully`)}catch(e){console.error(`[WuSvelte5] Unmount error for ${n}:`,e)}t&&(t.innerHTML="")};try{return(await o(3e3)).define(n,{mount:d,unmount:p}),console.log(`[WuSvelte5] ✅ ${n} registered with Wu Framework`),!0}catch(e){if(console.warn(`[WuSvelte5] Wu Framework not available for ${n}`),u){const e=document.querySelector(c);if(e)return console.log(`[WuSvelte5] Running ${n} in standalone mode`),await d(e),!0}return!1}}function s(n=""){const e=new Set;let o=null,r=null;const a=t();if(a?.store){o=a.store.get(n);const t=()=>{o=a.store.get(n),e.forEach(n=>n(o))};r=a.store.on(n||"*",t)}return{subscribe:n=>(e.add(n),n(o),()=>{e.delete(n),0===e.size&&r&&(r(),r=null)}),set(e,o){const r=t();if(r?.store){const t=n?`${n}.${e}`:e;r.store.set(t,o)}},get(e=""){const o=t();if(o?.store){const t=n?e?`${n}.${e}`:n:e;return o.store.get(t)}return null},update(e){const r=e(o),a=t();a?.store&&n&&a.store.set(n,r)}}}function l(n){const e=new Set;let o=null,r=null;const a=t();return a?.eventBus&&(r=a.eventBus.on(n,n=>{o=n,e.forEach(n=>n(o))})),{subscribe:n=>(e.add(n),n(o),()=>{e.delete(n),0===e.size&&r&&(r(),r=null)}),emit(e,o){const r=t();if(r?.eventBus){const t=n.replace("*","custom");r.eventBus.emit(t,e,o)}}}}function i(){const n=[];return{emit:(n,e,o)=>{const r=t();r?.eventBus?r.eventBus.emit(n,e,o):console.warn("[useWuEvents] Wu Framework not available")},on:(e,o)=>{const r=t();if(r?.eventBus){const t=r.eventBus.on(e,o);return n.push(t),t}return console.warn("[useWuEvents] Wu Framework not available"),()=>{}},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)},cleanup:()=>{n.forEach(n=>n()),n.length=0}}}function u(){return{props:["name","url","appName","fallbackText"],template:"\n<script>\n import { onMount, onDestroy, createEventDispatcher } from 'svelte';\n import { getWuInstance } from 'wu-framework/adapters/svelte';\n\n export let name;\n export let url;\n export let appName = null;\n export let fallbackText = null;\n\n const dispatch = createEventDispatcher();\n\n let container;\n let loading = true;\n let error = null;\n let appInstance = null;\n\n $: actualAppName = appName || name;\n\n onMount(async () => {\n await mountMicrofrontend();\n });\n\n onDestroy(() => {\n unmountMicrofrontend();\n });\n\n async function mountMicrofrontend() {\n try {\n loading = true;\n error = null;\n\n const wu = getWuInstance();\n if (!wu) {\n throw new Error('Wu Framework not initialized');\n }\n\n const containerId = `wu-slot-${actualAppName}-${Date.now()}`;\n const innerContainer = document.createElement('div');\n innerContainer.id = containerId;\n innerContainer.style.width = '100%';\n innerContainer.style.height = '100%';\n\n container.innerHTML = '';\n container.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 loading = false;\n dispatch('load', { name: actualAppName, url });\n dispatch('mount', { name: actualAppName, container: innerContainer });\n\n } catch (err) {\n console.error(`[WuSlot] Error loading ${actualAppName}:`, err);\n error = err.message || 'Failed to load microfrontend';\n loading = false;\n dispatch('error', err);\n }\n }\n\n async function unmountMicrofrontend() {\n if (appInstance) {\n dispatch('unmount', { name: actualAppName });\n\n try {\n await appInstance.unmount();\n } catch (err) {\n console.warn(`[WuSlot] Error unmounting ${actualAppName}:`, err);\n }\n\n appInstance = null;\n }\n }\n<\/script>\n\n<div\n bind:this={container}\n class=\"wu-slot\"\n class:wu-slot-loading={loading}\n class:wu-slot-error={error}\n data-wu-app={actualAppName}\n data-wu-url={url}\n style=\"min-height: 100px; position: relative;\">\n\n {#if error}\n <div class=\"wu-slot-error-message\"\n 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 {:else if loading}\n <div class=\"wu-slot-loading-message\"\n style=\"display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;\">\n {fallbackText || `Loading ${name}...`}\n </div>\n {/if}\n</div>\n\n<style>\n .wu-slot {\n width: 100%;\n min-height: 100px;\n }\n</style>\n ".trim(),createInstance:(n,e)=>{const o=document.createElement("div");o.className="wu-slot",o.style.minHeight="100px",o.style.position="relative",n.appendChild(o);let r=!0,a=null,s=null;const l=e.appName||e.name,i=()=>{a?o.innerHTML=`\n <div style="padding: 1rem; border: 1px solid #f5c6cb; border-radius: 4px; background: #f8d7da; color: #721c24;">\n <strong>Error loading ${e.name}</strong>\n <p style="margin: 0.5rem 0 0 0;">${a}</p>\n </div>\n `:r&&(o.innerHTML=`\n <div style="display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;">\n ${e.fallbackText||`Loading ${e.name}...`}\n </div>\n `)};return(async()=>{try{i();const n=t();if(!n)throw new Error("Wu Framework not initialized");const a=`wu-slot-${l}-${Date.now()}`,u=document.createElement("div");u.id=a,u.style.cssText="width: 100%; height: 100%;",o.innerHTML="",o.appendChild(u);const c=n.app(l,{url:e.url,container:`#${a}`,autoInit:!0});s=c,await c.mount(),r=!1,e.onLoad&&e.onLoad({name:l,url:e.url})}catch(n){a=n.message,r=!1,i(),e.onError&&e.onError(n)}})(),{destroy:async()=>{if(s){try{await s.unmount()}catch(n){}s=null}o.remove()}}}}}const c={register:r,registerSvelte5:a,createWuStore:s,createWuEventStore:l,useWuEvents:i,createWuSlotConfig:u,createWuAIStore:n,getWuInstance:t,waitForWu:o};export{n as createWuAIStore,l as createWuEventStore,u as createWuSlotConfig,s as createWuStore,c as default,t as getWuInstance,r as register,a as registerSvelte5,i as useWuEvents,o as waitForWu,c as wuSvelte};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/adapters/svelte/ai.js","../../../src/adapters/svelte/index.js"],"sourcesContent":["/**\n * WU-FRAMEWORK SVELTE 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 createWuAIStore(options = {}) {\n const { namespace = 'default' } = options;\n const subscribers = new Set();\n let state = { messages: [], isStreaming: false, error: null };\n function notify() { subscribers.forEach(fn => fn(state)); }\n\n return {\n subscribe(fn) { subscribers.add(fn); fn(state); return () => subscribers.delete(fn); },\n async send(text) {\n if (!text?.trim()) return;\n const wu = getWuInstance();\n if (!wu?.ai) { state = { ...state, error: 'Wu AI not available' }; notify(); return; }\n state = { ...state, messages: [...state.messages, { id: `user-${Date.now()}`, role: 'user', content: text, timestamp: Date.now() }], isStreaming: true, error: null };\n notify();\n try {\n const res = await wu.ai.send(text, { namespace });\n state = { ...state, messages: [...state.messages, { id: `assistant-${Date.now()}`, role: 'assistant', content: res.content, timestamp: Date.now() }], isStreaming: false };\n } catch (err) { state = { ...state, isStreaming: false, error: err.message }; }\n notify();\n },\n clear() { state = { messages: [], isStreaming: false, error: null }; notify(); },\n };\n}\n","/**\n * 🚀 WU-FRAMEWORK SVELTE ADAPTER\n *\n * Simplifica la integración de Svelte con Wu Framework.\n * Convierte componentes Svelte en microfrontends con UNA línea de código.\n *\n * @example\n * // Microfrontend (main.js)\n * import { wuSvelte } from 'wu-framework/adapters/svelte';\n * import App from './App.svelte';\n *\n * wuSvelte.register('my-app', App);\n *\n * @example\n * // Shell (cargar microfrontend)\n * import WuSlot from 'wu-framework/adapters/svelte/WuSlot.svelte';\n *\n * <WuSlot name=\"my-app\" url=\"http://localhost:3001\" />\n */\n\n// Estado global del adapter\nconst adapterState = {\n apps: new Map(),\n initialized: false\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 Svelte como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend (debe coincidir con wu.json)\n * @param {typeof SvelteComponent} Component - Componente Svelte principal (App.svelte)\n * @param {Object} options - Opciones adicionales\n * @param {Object} options.props - Props iniciales para el componente\n * @param {Object} options.context - Contexto a pasar al componente\n * @param {boolean} options.intro - Ejecutar transiciones de intro (default: false)\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: '#app')\n *\n * @example\n * // Básico\n * wuSvelte.register('my-app', App);\n *\n * @example\n * // Con props y context\n * wuSvelte.register('my-app', App, {\n * props: { apiUrl: 'https://api.example.com' },\n * context: new Map([['theme', 'dark']]),\n * onMount: (container) => console.log('Mounted!')\n * });\n */\nasync function register(appName, Component, options = {}) {\n const {\n props = {},\n context = new Map(),\n intro = false,\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#app'\n } = options;\n\n // Función de mount interna\n const mountApp = (container) => {\n if (!container) {\n console.error(`[WuSvelte] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Evitar doble mount\n if (adapterState.apps.has(appName)) {\n console.warn(`[WuSvelte] ${appName} already mounted, unmounting first`);\n unmountApp();\n }\n\n try {\n // Limpiar container\n container.innerHTML = '';\n\n // Crear instancia del componente Svelte\n const instance = new Component({\n target: container,\n props: {\n ...props,\n // Inyectar información de Wu\n wuAppName: appName,\n wuInstance: getWuInstance()\n },\n context,\n intro\n });\n\n // Guardar referencia\n adapterState.apps.set(appName, {\n instance,\n container,\n Component\n });\n\n console.log(`[WuSvelte] ✅ ${appName} mounted successfully`);\n\n if (onMount) {\n onMount(container, instance);\n }\n } catch (error) {\n console.error(`[WuSvelte] 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, appData.instance);\n }\n\n // Destruir instancia de Svelte\n appData.instance.$destroy();\n adapterState.apps.delete(appName);\n\n console.log(`[WuSvelte] ✅ ${appName} unmounted successfully`);\n } catch (error) {\n console.error(`[WuSvelte] Unmount error for ${appName}:`, error);\n }\n }\n\n // Limpiar container si se proporciona\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(`[WuSvelte] ✅ ${appName} registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuSvelte] 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(`[WuSvelte] Running ${appName} in standalone mode`);\n mountApp(containerElement);\n return true;\n } else {\n console.warn(`[WuSvelte] Standalone container ${standaloneContainer} not found`);\n }\n }\n\n return false;\n }\n}\n\n/**\n * Registra un componente Svelte 5 con runes como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend\n * @param {typeof SvelteComponent} Component - Componente Svelte 5\n * @param {Object} options - Opciones adicionales\n *\n * @example\n * // Svelte 5 con mount API\n * import { wuSvelte } from 'wu-framework/adapters/svelte';\n * import App from './App.svelte';\n *\n * wuSvelte.registerSvelte5('my-app', App);\n */\nasync function registerSvelte5(appName, Component, options = {}) {\n const {\n props = {},\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#app'\n } = options;\n\n // Función de mount para Svelte 5\n const mountApp = async (container) => {\n if (!container) {\n console.error(`[WuSvelte5] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Evitar doble mount\n if (adapterState.apps.has(appName)) {\n console.warn(`[WuSvelte5] ${appName} already mounted, unmounting first`);\n await unmountApp();\n }\n\n try {\n container.innerHTML = '';\n\n // Svelte 5 usa mount() del módulo svelte\n let mountFn;\n try {\n const svelte = await import('svelte');\n mountFn = svelte.mount;\n } catch (e) {\n // Fallback a API legacy\n console.warn('[WuSvelte5] Svelte 5 mount not available, using legacy API');\n return register(appName, Component, options);\n }\n\n // Montar con Svelte 5 API\n const instance = mountFn(Component, {\n target: container,\n props: {\n ...props,\n wuAppName: appName,\n wuInstance: getWuInstance()\n }\n });\n\n adapterState.apps.set(appName, {\n instance,\n container,\n Component,\n isSvelte5: true\n });\n\n console.log(`[WuSvelte5] ✅ ${appName} mounted successfully`);\n\n if (onMount) {\n onMount(container, instance);\n }\n } catch (error) {\n console.error(`[WuSvelte5] Mount error for ${appName}:`, error);\n throw error;\n }\n };\n\n // Función de unmount para Svelte 5\n const unmountApp = async (container) => {\n const appData = adapterState.apps.get(appName);\n\n if (appData) {\n try {\n if (onUnmount) {\n onUnmount(appData.container, appData.instance);\n }\n\n // Svelte 5 usa unmount()\n if (appData.isSvelte5) {\n try {\n const svelte = await import('svelte');\n if (svelte.unmount) {\n svelte.unmount(appData.instance);\n }\n } catch (e) {\n // Fallback\n if (appData.instance.$destroy) {\n appData.instance.$destroy();\n }\n }\n } else {\n appData.instance.$destroy();\n }\n\n adapterState.apps.delete(appName);\n console.log(`[WuSvelte5] ✅ ${appName} unmounted successfully`);\n } catch (error) {\n console.error(`[WuSvelte5] 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(`[WuSvelte5] ✅ ${appName} registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuSvelte5] Wu Framework not available for ${appName}`);\n\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n\n if (containerElement) {\n console.log(`[WuSvelte5] Running ${appName} in standalone mode`);\n await mountApp(containerElement);\n return true;\n }\n }\n\n return false;\n }\n}\n\n/**\n * Store reactivo para usar con Svelte\n * Compatible con la sintaxis $store de Svelte\n *\n * @param {string} namespace - Namespace en el store de Wu\n * @returns {Object} Store compatible con Svelte\n *\n * @example\n * <script>\n * import { createWuStore } from 'wu-framework/adapters/svelte';\n *\n * const userStore = createWuStore('user');\n *\n * // Usar con sintaxis reactiva\n * $: userName = $userStore?.name;\n *\n * function updateName(name) {\n * userStore.set('name', name);\n * }\n * </script>\n */\nfunction createWuStore(namespace = '') {\n const subscribers = new Set();\n let currentValue = null;\n let unsubscribeWu = null;\n\n // Obtener valor inicial\n const wu = getWuInstance();\n if (wu?.store) {\n currentValue = wu.store.get(namespace);\n\n // Suscribirse a cambios en Wu Store\n const pattern = namespace ? `${namespace}.*` : '*';\n unsubscribeWu = wu.store.on(pattern, () => {\n currentValue = wu.store.get(namespace);\n subscribers.forEach(fn => fn(currentValue));\n });\n }\n\n return {\n // Svelte store contract\n subscribe(fn) {\n subscribers.add(fn);\n fn(currentValue);\n\n return () => {\n subscribers.delete(fn);\n // Limpiar suscripción a Wu si no hay más subscribers\n if (subscribers.size === 0 && unsubscribeWu) {\n unsubscribeWu();\n unsubscribeWu = null;\n }\n };\n },\n\n // Métodos adicionales\n set(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 },\n\n get(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 },\n\n update(fn) {\n const newValue = fn(currentValue);\n const wu = getWuInstance();\n if (wu?.store && namespace) {\n wu.store.set(namespace, newValue);\n }\n }\n };\n}\n\n/**\n * Store para eventos de Wu Framework\n * Permite usar eventos de forma reactiva en Svelte\n *\n * @example\n * <script>\n * import { createWuEventStore } from 'wu-framework/adapters/svelte';\n *\n * const userEvents = createWuEventStore('user:*');\n *\n * $: if ($userEvents) {\n * console.log('User event:', $userEvents);\n * }\n * </script>\n */\nfunction createWuEventStore(eventPattern) {\n const subscribers = new Set();\n let lastEvent = null;\n let unsubscribeWu = null;\n\n const wu = getWuInstance();\n if (wu?.eventBus) {\n unsubscribeWu = wu.eventBus.on(eventPattern, (event) => {\n lastEvent = event;\n subscribers.forEach(fn => fn(lastEvent));\n });\n }\n\n return {\n subscribe(fn) {\n subscribers.add(fn);\n fn(lastEvent);\n\n return () => {\n subscribers.delete(fn);\n if (subscribers.size === 0 && unsubscribeWu) {\n unsubscribeWu();\n unsubscribeWu = null;\n }\n };\n },\n\n emit(data, options) {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n // Extraer nombre del evento del patrón (sin wildcard)\n const eventName = eventPattern.replace('*', 'custom');\n wu.eventBus.emit(eventName, data, options);\n }\n }\n };\n}\n\n/**\n * Helper para usar el EventBus de Wu en Svelte\n *\n * @example\n * <script>\n * import { useWuEvents } from 'wu-framework/adapters/svelte';\n * import { onDestroy } from 'svelte';\n *\n * const { emit, on, cleanup } = useWuEvents();\n *\n * on('user:login', (data) => {\n * console.log('User logged in:', data);\n * });\n *\n * onDestroy(cleanup);\n * </script>\n */\nfunction useWuEvents() {\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 } else {\n console.warn('[useWuEvents] Wu Framework not available');\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 console.warn('[useWuEvents] Wu Framework not available');\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 const cleanup = () => {\n subscriptions.forEach(unsub => unsub());\n subscriptions.length = 0;\n };\n\n return { emit, on, once, off, cleanup };\n}\n\n/**\n * Crea la configuración para un componente WuSlot en Svelte\n * Retorna el código del componente que se puede usar como referencia\n *\n * @example\n * // WuSlot.svelte - Crear manualmente basado en esta configuración\n * const config = createWuSlotConfig();\n * // Usar config.template como base para el componente\n */\nfunction createWuSlotConfig() {\n return {\n props: ['name', 'url', 'appName', 'fallbackText'],\n\n template: `\n<script>\n import { onMount, onDestroy, createEventDispatcher } from 'svelte';\n import { getWuInstance } from 'wu-framework/adapters/svelte';\n\n export let name;\n export let url;\n export let appName = null;\n export let fallbackText = null;\n\n const dispatch = createEventDispatcher();\n\n let container;\n let loading = true;\n let error = null;\n let appInstance = null;\n\n $: actualAppName = appName || name;\n\n onMount(async () => {\n await mountMicrofrontend();\n });\n\n onDestroy(() => {\n unmountMicrofrontend();\n });\n\n async function mountMicrofrontend() {\n try {\n loading = true;\n error = null;\n\n const wu = getWuInstance();\n if (!wu) {\n throw new Error('Wu Framework not initialized');\n }\n\n const containerId = \\`wu-slot-\\${actualAppName}-\\${Date.now()}\\`;\n const innerContainer = document.createElement('div');\n innerContainer.id = containerId;\n innerContainer.style.width = '100%';\n innerContainer.style.height = '100%';\n\n container.innerHTML = '';\n container.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 loading = false;\n dispatch('load', { name: actualAppName, url });\n dispatch('mount', { name: actualAppName, container: innerContainer });\n\n } catch (err) {\n console.error(\\`[WuSlot] Error loading \\${actualAppName}:\\`, err);\n error = err.message || 'Failed to load microfrontend';\n loading = false;\n dispatch('error', err);\n }\n }\n\n async function unmountMicrofrontend() {\n if (appInstance) {\n dispatch('unmount', { name: actualAppName });\n\n try {\n await appInstance.unmount();\n } catch (err) {\n console.warn(\\`[WuSlot] Error unmounting \\${actualAppName}:\\`, err);\n }\n\n appInstance = null;\n }\n }\n</script>\n\n<div\n bind:this={container}\n class=\"wu-slot\"\n class:wu-slot-loading={loading}\n class:wu-slot-error={error}\n data-wu-app={actualAppName}\n data-wu-url={url}\n style=\"min-height: 100px; position: relative;\">\n\n {#if error}\n <div class=\"wu-slot-error-message\"\n 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 {:else if loading}\n <div class=\"wu-slot-loading-message\"\n style=\"display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;\">\n {fallbackText || \\`Loading \\${name}...\\`}\n </div>\n {/if}\n</div>\n\n<style>\n .wu-slot {\n width: 100%;\n min-height: 100px;\n }\n</style>\n `.trim(),\n\n // Implementación JavaScript pura para usar sin .svelte\n createInstance: (target, props) => {\n const container = document.createElement('div');\n container.className = 'wu-slot';\n container.style.minHeight = '100px';\n container.style.position = 'relative';\n target.appendChild(container);\n\n let loading = true;\n let error = null;\n let appInstance = null;\n\n const actualAppName = props.appName || props.name;\n\n const updateUI = () => {\n if (error) {\n container.innerHTML = `\n <div style=\"padding: 1rem; border: 1px solid #f5c6cb; border-radius: 4px; background: #f8d7da; color: #721c24;\">\n <strong>Error loading ${props.name}</strong>\n <p style=\"margin: 0.5rem 0 0 0;\">${error}</p>\n </div>\n `;\n } else if (loading) {\n container.innerHTML = `\n <div style=\"display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;\">\n ${props.fallbackText || `Loading ${props.name}...`}\n </div>\n `;\n }\n };\n\n const mount = async () => {\n try {\n updateUI();\n\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 container.innerHTML = '';\n container.appendChild(innerContainer);\n\n const app = wu.app(actualAppName, {\n url: props.url,\n container: `#${containerId}`,\n autoInit: true\n });\n\n appInstance = app;\n await app.mount();\n\n loading = false;\n if (props.onLoad) props.onLoad({ name: actualAppName, url: props.url });\n\n } catch (err) {\n error = err.message;\n loading = false;\n updateUI();\n if (props.onError) props.onError(err);\n }\n };\n\n const destroy = async () => {\n if (appInstance) {\n try {\n await appInstance.unmount();\n } catch (e) {}\n appInstance = null;\n }\n container.remove();\n };\n\n mount();\n\n return { destroy };\n }\n };\n}\n\n// ============================================\n// AI INTEGRATION\n// ============================================\nimport { createWuAIStore } from './ai.js';\n\n// API pública del adapter\nexport const wuSvelte = {\n register,\n registerSvelte5,\n createWuStore,\n createWuEventStore,\n useWuEvents,\n createWuSlotConfig,\n createWuAIStore,\n getWuInstance,\n waitForWu\n};\n\nexport {\n register,\n registerSvelte5,\n createWuStore,\n createWuEventStore,\n useWuEvents,\n createWuSlotConfig,\n createWuAIStore,\n getWuInstance,\n waitForWu\n};\n\nexport default wuSvelte;\n"],"names":["createWuAIStore","options","namespace","subscribers","Set","state","messages","isStreaming","error","notify","forEach","fn","subscribe","add","delete","send","text","trim","wu","window","parent","top","ai","id","Date","now","role","content","timestamp","res","err","message","clear","adapterState","apps","Map","initialized","getWuInstance","waitForWu","timeout","Promise","resolve","reject","startTime","handleWuReady","cleanup","addEventListener","checkInterval","setInterval","Error","clearInterval","removeEventListener","async","register","appName","Component","props","context","intro","onMount","onUnmount","standalone","standaloneContainer","mountApp","container","has","console","warn","unmountApp","innerHTML","instance","target","wuAppName","wuInstance","set","log","appData","get","$destroy","define","mount","unmount","containerElement","document","querySelector","registerSvelte5","mountFn","import","e","isSvelte5","svelte","createWuStore","currentValue","unsubscribeWu","store","pattern","on","size","path","value","fullPath","update","newValue","createWuEventStore","eventPattern","lastEvent","eventBus","event","emit","data","eventName","replace","useWuEvents","subscriptions","callback","unsubscribe","push","once","off","unsub","length","createWuSlotConfig","template","createInstance","createElement","className","style","minHeight","position","appendChild","loading","appInstance","actualAppName","name","updateUI","fallbackText","containerId","innerContainer","cssText","app","url","autoInit","onLoad","onError","destroy","remove","wuSvelte"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/adapters/svelte/ai.js","../../../src/adapters/svelte/index.js"],"sourcesContent":["/**\n * WU-FRAMEWORK SVELTE 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 createWuAIStore(options = {}) {\n const { namespace = 'default' } = options;\n const subscribers = new Set();\n let state = { messages: [], isStreaming: false, error: null };\n function notify() { subscribers.forEach(fn => fn(state)); }\n\n return {\n subscribe(fn) { subscribers.add(fn); fn(state); return () => subscribers.delete(fn); },\n async send(text) {\n if (!text?.trim()) return;\n const wu = getWuInstance();\n if (!wu?.ai) { state = { ...state, error: 'Wu AI not available' }; notify(); return; }\n state = { ...state, messages: [...state.messages, { id: `user-${Date.now()}`, role: 'user', content: text, timestamp: Date.now() }], isStreaming: true, error: null };\n notify();\n try {\n const res = await wu.ai.send(text, { namespace });\n state = { ...state, messages: [...state.messages, { id: `assistant-${Date.now()}`, role: 'assistant', content: res.content, timestamp: Date.now() }], isStreaming: false };\n } catch (err) { state = { ...state, isStreaming: false, error: err.message }; }\n notify();\n },\n clear() { state = { messages: [], isStreaming: false, error: null }; notify(); },\n };\n}\n","/**\n * 🚀 WU-FRAMEWORK SVELTE ADAPTER\n *\n * Simplifica la integración de Svelte con Wu Framework.\n * Convierte componentes Svelte en microfrontends con UNA línea de código.\n *\n * @example\n * // Microfrontend (main.js)\n * import { wuSvelte } from 'wu-framework/adapters/svelte';\n * import App from './App.svelte';\n *\n * wuSvelte.register('my-app', App);\n *\n * @example\n * // Shell (cargar microfrontend)\n * import WuSlot from 'wu-framework/adapters/svelte/WuSlot.svelte';\n *\n * <WuSlot name=\"my-app\" url=\"http://localhost:3001\" />\n */\n\n// Estado global del adapter\nconst adapterState = {\n apps: new Map(),\n initialized: false\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 Svelte como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend (debe coincidir con wu.json)\n * @param {typeof SvelteComponent} Component - Componente Svelte principal (App.svelte)\n * @param {Object} options - Opciones adicionales\n * @param {Object} options.props - Props iniciales para el componente\n * @param {Object} options.context - Contexto a pasar al componente\n * @param {boolean} options.intro - Ejecutar transiciones de intro (default: false)\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: '#app')\n *\n * @example\n * // Básico\n * wuSvelte.register('my-app', App);\n *\n * @example\n * // Con props y context\n * wuSvelte.register('my-app', App, {\n * props: { apiUrl: 'https://api.example.com' },\n * context: new Map([['theme', 'dark']]),\n * onMount: (container) => console.log('Mounted!')\n * });\n */\nasync function register(appName, Component, options = {}) {\n const {\n props = {},\n context = new Map(),\n intro = false,\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#app'\n } = options;\n\n // Función de mount interna\n const mountApp = (container) => {\n if (!container) {\n console.error(`[WuSvelte] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Evitar doble mount\n if (adapterState.apps.has(appName)) {\n console.warn(`[WuSvelte] ${appName} already mounted, unmounting first`);\n unmountApp();\n }\n\n try {\n // Limpiar container\n container.innerHTML = '';\n\n // Crear instancia del componente Svelte\n const instance = new Component({\n target: container,\n props: {\n ...props,\n // Inyectar información de Wu\n wuAppName: appName,\n wuInstance: getWuInstance()\n },\n context,\n intro\n });\n\n // Guardar referencia\n adapterState.apps.set(appName, {\n instance,\n container,\n Component\n });\n\n console.log(`[WuSvelte] ✅ ${appName} mounted successfully`);\n\n if (onMount) {\n onMount(container, instance);\n }\n } catch (error) {\n console.error(`[WuSvelte] 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, appData.instance);\n }\n\n // Destruir instancia de Svelte\n appData.instance.$destroy();\n adapterState.apps.delete(appName);\n\n console.log(`[WuSvelte] ✅ ${appName} unmounted successfully`);\n } catch (error) {\n console.error(`[WuSvelte] Unmount error for ${appName}:`, error);\n }\n }\n\n // Limpiar container si se proporciona\n if (container) {\n container.innerHTML = '';\n }\n };\n\n // Canal de props vivo: $set() de Svelte 4 actualiza props reactivamente.\n const updateApp = (_container, nextProps) => {\n const appData = adapterState.apps.get(appName);\n if (appData?.instance?.$set) appData.instance.$set(nextProps || {});\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(`[WuSvelte] ✅ ${appName} registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuSvelte] 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(`[WuSvelte] Running ${appName} in standalone mode`);\n mountApp(containerElement);\n return true;\n } else {\n console.warn(`[WuSvelte] Standalone container ${standaloneContainer} not found`);\n }\n }\n\n return false;\n }\n}\n\n/**\n * Registra un componente Svelte 5 con runes como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend\n * @param {typeof SvelteComponent} Component - Componente Svelte 5\n * @param {Object} options - Opciones adicionales\n *\n * @example\n * // Svelte 5 con mount API\n * import { wuSvelte } from 'wu-framework/adapters/svelte';\n * import App from './App.svelte';\n *\n * wuSvelte.registerSvelte5('my-app', App);\n */\nasync function registerSvelte5(appName, Component, options = {}) {\n const {\n props = {},\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#app'\n } = options;\n\n // Función de mount para Svelte 5\n const mountApp = async (container) => {\n if (!container) {\n console.error(`[WuSvelte5] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Evitar doble mount\n if (adapterState.apps.has(appName)) {\n console.warn(`[WuSvelte5] ${appName} already mounted, unmounting first`);\n await unmountApp();\n }\n\n try {\n container.innerHTML = '';\n\n // Svelte 5 usa mount() del módulo svelte\n let mountFn = null;\n try {\n const svelte = await import('svelte');\n mountFn = svelte.mount;\n } catch (e) {\n // 'svelte' no importable — se maneja abajo con la API legacy\n }\n\n const componentProps = {\n ...props,\n wuAppName: appName,\n wuInstance: getWuInstance()\n };\n\n let instance;\n let isSvelte5 = true;\n\n if (mountFn) {\n // Montar con Svelte 5 API\n instance = mountFn(Component, {\n target: container,\n props: componentProps\n });\n } else {\n // Fallback a API legacy (Svelte 3/4) — montar en el container actual\n console.warn('[WuSvelte5] Svelte 5 mount not available, using legacy API');\n isSvelte5 = false;\n instance = new Component({\n target: container,\n props: componentProps\n });\n }\n\n adapterState.apps.set(appName, {\n instance,\n container,\n Component,\n isSvelte5\n });\n\n console.log(`[WuSvelte5] ✅ ${appName} mounted successfully`);\n\n if (onMount) {\n onMount(container, instance);\n }\n } catch (error) {\n console.error(`[WuSvelte5] Mount error for ${appName}:`, error);\n throw error;\n }\n };\n\n // Función de unmount para Svelte 5\n const unmountApp = async (container) => {\n const appData = adapterState.apps.get(appName);\n\n if (appData) {\n try {\n if (onUnmount) {\n onUnmount(appData.container, appData.instance);\n }\n\n // Svelte 5 usa unmount()\n if (appData.isSvelte5) {\n try {\n const svelte = await import('svelte');\n if (svelte.unmount) {\n svelte.unmount(appData.instance);\n }\n } catch (e) {\n // Fallback\n if (appData.instance.$destroy) {\n appData.instance.$destroy();\n }\n }\n } else {\n appData.instance.$destroy();\n }\n\n adapterState.apps.delete(appName);\n console.log(`[WuSvelte5] ✅ ${appName} unmounted successfully`);\n } catch (error) {\n console.error(`[WuSvelte5] 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(`[WuSvelte5] ✅ ${appName} registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuSvelte5] Wu Framework not available for ${appName}`);\n\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n\n if (containerElement) {\n console.log(`[WuSvelte5] Running ${appName} in standalone mode`);\n await mountApp(containerElement);\n return true;\n }\n }\n\n return false;\n }\n}\n\n/**\n * Store reactivo para usar con Svelte\n * Compatible con la sintaxis $store de Svelte\n *\n * @param {string} namespace - Namespace en el store de Wu\n * @returns {Object} Store compatible con Svelte\n *\n * @example\n * <script>\n * import { createWuStore } from 'wu-framework/adapters/svelte';\n *\n * const userStore = createWuStore('user');\n *\n * // Usar con sintaxis reactiva\n * $: userName = $userStore?.name;\n *\n * function updateName(name) {\n * userStore.set('name', name);\n * }\n * </script>\n */\nfunction createWuStore(namespace = '') {\n const subscribers = new Set();\n let currentValue = null;\n let unsubscribeWu = null;\n\n // Obtener valor inicial\n const wu = getWuInstance();\n if (wu?.store) {\n currentValue = wu.store.get(namespace);\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 const handleChange = () => {\n currentValue = wu.store.get(namespace);\n subscribers.forEach(fn => fn(currentValue));\n };\n unsubscribeWu = wu.store.on(namespace || '*', handleChange);\n }\n\n return {\n // Svelte store contract\n subscribe(fn) {\n subscribers.add(fn);\n fn(currentValue);\n\n return () => {\n subscribers.delete(fn);\n // Limpiar suscripción a Wu si no hay más subscribers\n if (subscribers.size === 0 && unsubscribeWu) {\n unsubscribeWu();\n unsubscribeWu = null;\n }\n };\n },\n\n // Métodos adicionales\n set(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 },\n\n get(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 },\n\n update(fn) {\n const newValue = fn(currentValue);\n const wu = getWuInstance();\n if (wu?.store && namespace) {\n wu.store.set(namespace, newValue);\n }\n }\n };\n}\n\n/**\n * Store para eventos de Wu Framework\n * Permite usar eventos de forma reactiva en Svelte\n *\n * @example\n * <script>\n * import { createWuEventStore } from 'wu-framework/adapters/svelte';\n *\n * const userEvents = createWuEventStore('user:*');\n *\n * $: if ($userEvents) {\n * console.log('User event:', $userEvents);\n * }\n * </script>\n */\nfunction createWuEventStore(eventPattern) {\n const subscribers = new Set();\n let lastEvent = null;\n let unsubscribeWu = null;\n\n const wu = getWuInstance();\n if (wu?.eventBus) {\n unsubscribeWu = wu.eventBus.on(eventPattern, (event) => {\n lastEvent = event;\n subscribers.forEach(fn => fn(lastEvent));\n });\n }\n\n return {\n subscribe(fn) {\n subscribers.add(fn);\n fn(lastEvent);\n\n return () => {\n subscribers.delete(fn);\n if (subscribers.size === 0 && unsubscribeWu) {\n unsubscribeWu();\n unsubscribeWu = null;\n }\n };\n },\n\n emit(data, options) {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n // Extraer nombre del evento del patrón (sin wildcard)\n const eventName = eventPattern.replace('*', 'custom');\n wu.eventBus.emit(eventName, data, options);\n }\n }\n };\n}\n\n/**\n * Helper para usar el EventBus de Wu en Svelte\n *\n * @example\n * <script>\n * import { useWuEvents } from 'wu-framework/adapters/svelte';\n * import { onDestroy } from 'svelte';\n *\n * const { emit, on, cleanup } = useWuEvents();\n *\n * on('user:login', (data) => {\n * console.log('User logged in:', data);\n * });\n *\n * onDestroy(cleanup);\n * </script>\n */\nfunction useWuEvents() {\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 } else {\n console.warn('[useWuEvents] Wu Framework not available');\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 console.warn('[useWuEvents] Wu Framework not available');\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 const cleanup = () => {\n subscriptions.forEach(unsub => unsub());\n subscriptions.length = 0;\n };\n\n return { emit, on, once, off, cleanup };\n}\n\n/**\n * Crea la configuración para un componente WuSlot en Svelte\n * Retorna el código del componente que se puede usar como referencia\n *\n * @example\n * // WuSlot.svelte - Crear manualmente basado en esta configuración\n * const config = createWuSlotConfig();\n * // Usar config.template como base para el componente\n */\nfunction createWuSlotConfig() {\n return {\n props: ['name', 'url', 'appName', 'fallbackText'],\n\n template: `\n<script>\n import { onMount, onDestroy, createEventDispatcher } from 'svelte';\n import { getWuInstance } from 'wu-framework/adapters/svelte';\n\n export let name;\n export let url;\n export let appName = null;\n export let fallbackText = null;\n\n const dispatch = createEventDispatcher();\n\n let container;\n let loading = true;\n let error = null;\n let appInstance = null;\n\n $: actualAppName = appName || name;\n\n onMount(async () => {\n await mountMicrofrontend();\n });\n\n onDestroy(() => {\n unmountMicrofrontend();\n });\n\n async function mountMicrofrontend() {\n try {\n loading = true;\n error = null;\n\n const wu = getWuInstance();\n if (!wu) {\n throw new Error('Wu Framework not initialized');\n }\n\n const containerId = \\`wu-slot-\\${actualAppName}-\\${Date.now()}\\`;\n const innerContainer = document.createElement('div');\n innerContainer.id = containerId;\n innerContainer.style.width = '100%';\n innerContainer.style.height = '100%';\n\n container.innerHTML = '';\n container.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 loading = false;\n dispatch('load', { name: actualAppName, url });\n dispatch('mount', { name: actualAppName, container: innerContainer });\n\n } catch (err) {\n console.error(\\`[WuSlot] Error loading \\${actualAppName}:\\`, err);\n error = err.message || 'Failed to load microfrontend';\n loading = false;\n dispatch('error', err);\n }\n }\n\n async function unmountMicrofrontend() {\n if (appInstance) {\n dispatch('unmount', { name: actualAppName });\n\n try {\n await appInstance.unmount();\n } catch (err) {\n console.warn(\\`[WuSlot] Error unmounting \\${actualAppName}:\\`, err);\n }\n\n appInstance = null;\n }\n }\n</script>\n\n<div\n bind:this={container}\n class=\"wu-slot\"\n class:wu-slot-loading={loading}\n class:wu-slot-error={error}\n data-wu-app={actualAppName}\n data-wu-url={url}\n style=\"min-height: 100px; position: relative;\">\n\n {#if error}\n <div class=\"wu-slot-error-message\"\n 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 {:else if loading}\n <div class=\"wu-slot-loading-message\"\n style=\"display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;\">\n {fallbackText || \\`Loading \\${name}...\\`}\n </div>\n {/if}\n</div>\n\n<style>\n .wu-slot {\n width: 100%;\n min-height: 100px;\n }\n</style>\n `.trim(),\n\n // Implementación JavaScript pura para usar sin .svelte\n createInstance: (target, props) => {\n const container = document.createElement('div');\n container.className = 'wu-slot';\n container.style.minHeight = '100px';\n container.style.position = 'relative';\n target.appendChild(container);\n\n let loading = true;\n let error = null;\n let appInstance = null;\n\n const actualAppName = props.appName || props.name;\n\n const updateUI = () => {\n if (error) {\n container.innerHTML = `\n <div style=\"padding: 1rem; border: 1px solid #f5c6cb; border-radius: 4px; background: #f8d7da; color: #721c24;\">\n <strong>Error loading ${props.name}</strong>\n <p style=\"margin: 0.5rem 0 0 0;\">${error}</p>\n </div>\n `;\n } else if (loading) {\n container.innerHTML = `\n <div style=\"display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;\">\n ${props.fallbackText || `Loading ${props.name}...`}\n </div>\n `;\n }\n };\n\n const mount = async () => {\n try {\n updateUI();\n\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 container.innerHTML = '';\n container.appendChild(innerContainer);\n\n const app = wu.app(actualAppName, {\n url: props.url,\n container: `#${containerId}`,\n autoInit: true\n });\n\n appInstance = app;\n await app.mount();\n\n loading = false;\n if (props.onLoad) props.onLoad({ name: actualAppName, url: props.url });\n\n } catch (err) {\n error = err.message;\n loading = false;\n updateUI();\n if (props.onError) props.onError(err);\n }\n };\n\n const destroy = async () => {\n if (appInstance) {\n try {\n await appInstance.unmount();\n } catch (e) {}\n appInstance = null;\n }\n container.remove();\n };\n\n mount();\n\n return { destroy };\n }\n };\n}\n\n// ============================================\n// AI INTEGRATION\n// ============================================\nimport { createWuAIStore } from './ai.js';\n\n// API pública del adapter\nexport const wuSvelte = {\n register,\n registerSvelte5,\n createWuStore,\n createWuEventStore,\n useWuEvents,\n createWuSlotConfig,\n createWuAIStore,\n getWuInstance,\n waitForWu\n};\n\nexport {\n register,\n registerSvelte5,\n createWuStore,\n createWuEventStore,\n useWuEvents,\n createWuSlotConfig,\n createWuAIStore,\n getWuInstance,\n waitForWu\n};\n\nexport default wuSvelte;\n"],"names":["createWuAIStore","options","namespace","subscribers","Set","state","messages","isStreaming","error","notify","forEach","fn","subscribe","add","delete","send","text","trim","wu","window","parent","top","ai","id","Date","now","role","content","timestamp","res","err","message","clear","adapterState","apps","Map","initialized","getWuInstance","waitForWu","timeout","Promise","resolve","reject","startTime","handleWuReady","cleanup","addEventListener","checkInterval","setInterval","Error","clearInterval","removeEventListener","async","register","appName","Component","props","context","intro","onMount","onUnmount","standalone","standaloneContainer","mountApp","container","has","console","warn","unmountApp","innerHTML","instance","target","wuAppName","wuInstance","set","log","appData","get","$destroy","updateApp","_container","nextProps","$set","define","mount","unmount","update","containerElement","document","querySelector","registerSvelte5","mountFn","import","e","componentProps","isSvelte5","svelte","createWuStore","currentValue","unsubscribeWu","store","handleChange","on","size","path","value","fullPath","newValue","createWuEventStore","eventPattern","lastEvent","eventBus","event","emit","data","eventName","replace","useWuEvents","subscriptions","callback","unsubscribe","push","once","off","unsub","length","createWuSlotConfig","template","createInstance","createElement","className","style","minHeight","position","appendChild","loading","appInstance","actualAppName","name","updateUI","fallbackText","containerId","innerContainer","cssText","app","url","autoInit","onLoad","onError","destroy","remove","wuSvelte"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * 🚀 WU-FRAMEWORK VANILLA 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
  /**
8
8
  * Configuración de app Vanilla
@@ -1,2 +1,2 @@
1
- function n(n={}){const{namespace:e="default"}=n,t={messages:[],isStreaming:!1,error:null};return{async send(n){if(!n?.trim())return null;const o="undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null;if(!o?.ai)return t.error="Wu AI not available",null;t.messages.push({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});return t.messages.push({id:`assistant-${Date.now()}`,role:"assistant",content:r.content,timestamp:Date.now()}),t.isStreaming=!1,r}catch(n){return t.error=n.message,t.isStreaming=!1,null}},clear(){t.messages.length=0,t.error=null},getMessages:()=>[...t.messages],getError:()=>t.error,isStreaming:()=>t.isStreaming}}const e={apps:new Map,instances:new Map};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 a=Date.now(),s=()=>{i(),e(t())};window.addEventListener("wu:ready",s),window.addEventListener("wu:app:ready",s);const l=setInterval(()=>{const r=t();if(r)return i(),void e(r);Date.now()-a>n&&(i(),o(new Error(`Wu Framework not found after ${n}ms`)))},200);function i(){clearInterval(l),window.removeEventListener("wu:ready",s),window.removeEventListener("wu:app:ready",s)}})}async function r(n,t,r={}){const{render:a,destroy:s=null,init:l=null,state:i={}}=t,{onMount:u=null,onUnmount:c=null,standalone:d=!0,standaloneContainer:f="#app"}=r;if(!a||"function"!=typeof a)throw new Error(`[WuVanilla] render function is required for ${n}`);const m={...i},w=o=>{if(o){e.apps.has(n)&&(console.warn(`[WuVanilla] ${n} already mounted, unmounting first`),p());try{o.innerHTML="",l&&"function"==typeof l&&l(o,m),a(o,m),e.apps.set(n,{container:o,config:t,state:m}),console.log(`[WuVanilla] ✅ ${n} mounted successfully`),u&&u(o,m)}catch(e){throw console.error(`[WuVanilla] Mount error for ${n}:`,e),e}}else console.error(`[WuVanilla] Mount failed for ${n}: container is null`)},p=t=>{const o=e.apps.get(n);if(o)try{c&&c(o.container,o.state),s&&"function"==typeof s?s(o.container,o.state):o.container.innerHTML="",e.apps.delete(n),console.log(`[WuVanilla] ✅ ${n} unmounted successfully`)}catch(e){console.error(`[WuVanilla] Unmount error for ${n}:`,e)}t&&(t.innerHTML="")};try{return(await o(3e3)).define(n,{mount:w,unmount:p}),console.log(`[WuVanilla] ✅ ${n} registered with Wu Framework`),!0}catch(e){if(console.warn(`[WuVanilla] Wu Framework not available for ${n}`),d){const e=document.querySelector(f);if(e)return console.log(`[WuVanilla] Running ${n} in standalone mode`),w(e),!0}return!1}}async function a(n,t,r={}){const{constructorArgs:a=[],onMount:s=null,onUnmount:l=null,standalone:i=!0,standaloneContainer:u="#app"}=r,c=o=>{if(o){e.instances.has(n)&&(console.warn(`[WuVanilla] ${n} already mounted, unmounting first`),d());try{o.innerHTML="";const r=new t(o,...a);r.render&&"function"==typeof r.render&&r.render(),e.instances.set(n,{instance:r,container:o}),console.log(`[WuVanilla] ✅ ${n} (class) mounted successfully`),s&&s(o,r)}catch(e){throw console.error(`[WuVanilla] Mount error for ${n}:`,e),e}}else console.error(`[WuVanilla] Mount failed for ${n}: container is null`)},d=t=>{const o=e.instances.get(n);if(o)try{l&&l(o.container,o.instance),o.instance.destroy&&"function"==typeof o.instance.destroy?o.instance.destroy():o.container.innerHTML="",e.instances.delete(n),console.log(`[WuVanilla] ✅ ${n} (class) unmounted successfully`)}catch(e){console.error(`[WuVanilla] Unmount error for ${n}:`,e)}t&&(t.innerHTML="")};try{return(await o(3e3)).define(n,{mount:c,unmount:d}),console.log(`[WuVanilla] ✅ ${n} (class) registered with Wu Framework`),!0}catch(e){if(console.warn(`[WuVanilla] Wu Framework not available for ${n}`),i){const e=document.querySelector(u);if(e)return console.log(`[WuVanilla] Running ${n} in standalone mode`),c(e),!0}return!1}}async function s(n,t,r={}){const{data:a={},scripts:s=[],styles:l=[],onMount:i=null,onUnmount:u=null,standalone:c=!0,standaloneContainer:d="#app"}=r,f=o=>{if(o)try{if(o.innerHTML="",l.length>0){const e=document.createElement("style");e.textContent=l.join("\n"),e.setAttribute("data-wu-app",n),o.appendChild(e)}const r=document.createElement("div");r.setAttribute("data-wu-template",n),r.innerHTML="function"==typeof t?t(a):t,o.appendChild(r),s.forEach(n=>{"function"==typeof n&&n(o,a)}),e.apps.set(n,{container:o,template:t,data:a}),console.log(`[WuVanilla] ✅ ${n} (template) mounted successfully`),i&&i(o,a)}catch(e){throw console.error(`[WuVanilla] Mount error for ${n}:`,e),e}else console.error(`[WuVanilla] Mount failed for ${n}: container is null`)},m=t=>{const o=e.apps.get(n);o&&(u&&u(o.container,o.data),o.container.innerHTML="",e.apps.delete(n),console.log(`[WuVanilla] ✅ ${n} (template) unmounted successfully`)),t&&(t.innerHTML="")};try{return(await o(3e3)).define(n,{mount:f,unmount:m}),console.log(`[WuVanilla] ✅ ${n} (template) registered with Wu Framework`),!0}catch(e){if(console.warn(`[WuVanilla] Wu Framework not available for ${n}`),c){const e=document.querySelector(d);if(e)return console.log(`[WuVanilla] Running ${n} in standalone mode`),f(e),!0}return!1}}function l(n){const{state:e={},template:t,actions:o={},onInit:r,onDestroy:a}=n;let s={...e},l=null,i=!1;const u=n=>{s={...s,...n},i&&l&&c(l,s)},c=(n,e)=>{const r=t(e),a=document.activeElement?.id;if(n.innerHTML=r,a){const e=n.querySelector(`#${a}`);e&&e.focus()}n.querySelectorAll("[data-action]").forEach(n=>{const e=n.getAttribute("data-action");o[e]&&n.addEventListener("click",()=>{const t=o[e](s,n);t&&u(t)})})};return{state:s,init:n=>{l=n,r&&r(n,s)},render:(n,e)=>{l=n,s=e||s,i=!0,c(n,s)},destroy:n=>{a&&a(n,s),i=!1,l=null,n.innerHTML=""},setState:u,getState:()=>s}}function i(){const n=[];return{emit:(n,e,o)=>{const r=t();r?.eventBus&&r.eventBus.emit(n,e,o)},on:(e,o)=>{const r=t();if(r?.eventBus){const t=r.eventBus.on(e,o);return n.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)},cleanup:()=>{n.forEach(n=>n()),n.length=0}}}function u(n=""){return{get:(e="")=>{const o=t();if(o?.store){const t=n?e?`${n}.${e}`:n:e;return o.store.get(t)}return null},set:(e,o)=>{const r=t();if(r?.store){const t=n?`${n}.${e}`:e;r.store.set(t,o)}},onChange:(e,o)=>{const r=t();if(r?.store){const t=n?`${n}.${e}`:e;return r.store.on(t,o)}return()=>{}}}}function c(n,e){const{name:o,url:r,fallbackText:a=null,onLoad:s=null,onError:l=null}=e,i=document.createElement("div");i.className="wu-slot",i.style.cssText="min-height: 100px; position: relative;",i.setAttribute("data-wu-app",o),i.setAttribute("data-wu-url",r),i.innerHTML=`\n <div style="display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;">\n ${a||`Loading ${o}...`}\n </div>\n `,n.appendChild(i);let u=null;return(async()=>{try{const n=t();if(!n)throw new Error("Wu Framework not initialized");const e=`wu-slot-${o}-${Date.now()}`,a=document.createElement("div");a.id=e,a.style.cssText="width: 100%; height: 100%;",i.innerHTML="",i.appendChild(a);const l=n.app(o,{url:r,container:`#${e}`,autoInit:!0});u=l,await l.mount(),s&&s({name:o,url:r})}catch(n){i.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;">${n.message}</p>\n </div>\n `,l&&l(n)}})(),{container:i,destroy:async()=>{if(u){try{await u.unmount()}catch(n){}u=null}i.remove()}}}const d={register:r,registerClass:a,registerTemplate:s,createComponent:l,createWuSlot:c,useWuEvents:i,useWuStore:u,useWuAI:n,getWuInstance:t,waitForWu:o};export{l as createComponent,c as createWuSlot,d as default,t as getWuInstance,r as register,a as registerClass,s as registerTemplate,n as useWuAI,i as useWuEvents,u as useWuStore,o as waitForWu,d as wuVanilla};
1
+ import{waitForWu as n,getWuInstance as e,createWuAdapter as t}from"../shared.js";function o(n={}){const{namespace:e="default"}=n,t={messages:[],isStreaming:!1,error:null};return{async send(n){if(!n?.trim())return null;const o="undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null;if(!o?.ai)return t.error="Wu AI not available",null;t.messages.push({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});return t.messages.push({id:`assistant-${Date.now()}`,role:"assistant",content:r.content,timestamp:Date.now()}),t.isStreaming=!1,r}catch(n){return t.error=n.message,t.isStreaming=!1,null}},clear(){t.messages.length=0,t.error=null},getMessages:()=>[...t.messages],getError:()=>t.error,isStreaming:()=>t.isStreaming}}const r={apps:new Map,instances:new Map};function a(n,e,o={}){const{render:a,destroy:s=null,init:i=null,state:l={}}=e,{onMount:u=null,onUnmount:c=null}=o;if(!a||"function"!=typeof a)throw new Error(`[WuVanilla] render function is required for ${n}`);const d=t({name:"WuVanilla",mount(t,{props:o}){const s={...l,...o};return t.innerHTML="",i&&"function"==typeof i&&i(t,s),a(t,s),r.apps.set(n,{container:t,config:e,state:s}),u&&u(t,s),{container:t,state:s}},unmount(e){const t=r.apps.get(n);t&&(c&&c(t.container,t.state),s&&"function"==typeof s?s(t.container,t.state):t.container.innerHTML="",r.apps.delete(n)),e&&(e.innerHTML="")},update(e,{props:t}){const o=r.apps.get(n),s=o?.container||e,i={...o?.state||l,...t};o&&(o.state=i),s&&a(s,i)}}),{onMount:m,onUnmount:p,...f}=o;return d(n,e,{standaloneContainer:"#app",...f})}async function s(e,t,o={}){const{constructorArgs:a=[],onMount:s=null,onUnmount:i=null,standalone:l=!0,standaloneContainer:u="#app"}=o,c=n=>{if(n){r.instances.has(e)&&(console.warn(`[WuVanilla] ${e} already mounted, unmounting first`),d());try{n.innerHTML="";const o=new t(n,...a);o.render&&"function"==typeof o.render&&o.render(),r.instances.set(e,{instance:o,container:n}),console.log(`[WuVanilla] ✅ ${e} (class) mounted successfully`),s&&s(n,o)}catch(n){throw console.error(`[WuVanilla] Mount error for ${e}:`,n),n}}else console.error(`[WuVanilla] Mount failed for ${e}: container is null`)},d=n=>{const t=r.instances.get(e);if(t)try{i&&i(t.container,t.instance),t.instance.destroy&&"function"==typeof t.instance.destroy?t.instance.destroy():t.container.innerHTML="",r.instances.delete(e),console.log(`[WuVanilla] ✅ ${e} (class) unmounted successfully`)}catch(n){console.error(`[WuVanilla] Unmount error for ${e}:`,n)}n&&(n.innerHTML="")};try{return(await n(3e3)).define(e,{mount:c,unmount:d}),console.log(`[WuVanilla] ✅ ${e} (class) registered with Wu Framework`),!0}catch(n){if(console.warn(`[WuVanilla] Wu Framework not available for ${e}`),l){const n=document.querySelector(u);if(n)return console.log(`[WuVanilla] Running ${e} in standalone mode`),c(n),!0}return!1}}async function i(e,t,o={}){const{data:a={},scripts:s=[],styles:i=[],onMount:l=null,onUnmount:u=null,standalone:c=!0,standaloneContainer:d="#app"}=o,m=n=>{if(n)try{if(n.innerHTML="",i.length>0){const t=document.createElement("style");t.textContent=i.join("\n"),t.setAttribute("data-wu-app",e),n.appendChild(t)}const o=document.createElement("div");o.setAttribute("data-wu-template",e),o.innerHTML="function"==typeof t?t(a):t,n.appendChild(o),s.forEach(e=>{"function"==typeof e&&e(n,a)}),r.apps.set(e,{container:n,template:t,data:a}),console.log(`[WuVanilla] ✅ ${e} (template) mounted successfully`),l&&l(n,a)}catch(n){throw console.error(`[WuVanilla] Mount error for ${e}:`,n),n}else console.error(`[WuVanilla] Mount failed for ${e}: container is null`)},p=n=>{const t=r.apps.get(e);t&&(u&&u(t.container,t.data),t.container.innerHTML="",r.apps.delete(e),console.log(`[WuVanilla] ✅ ${e} (template) unmounted successfully`)),n&&(n.innerHTML="")};try{return(await n(3e3)).define(e,{mount:m,unmount:p}),console.log(`[WuVanilla] ✅ ${e} (template) registered with Wu Framework`),!0}catch(n){if(console.warn(`[WuVanilla] Wu Framework not available for ${e}`),c){const n=document.querySelector(d);if(n)return console.log(`[WuVanilla] Running ${e} in standalone mode`),m(n),!0}return!1}}function l(n){const{state:e={},template:t,actions:o={},onInit:r,onDestroy:a}=n;let s={...e},i=null,l=!1;const u=n=>{s={...s,...n},l&&i&&c(i,s)},c=(n,e)=>{const r=t(e),a=document.activeElement?.id;if(n.innerHTML=r,a){const e=n.querySelector(`#${a}`);e&&e.focus()}n.querySelectorAll("[data-action]").forEach(n=>{const e=n.getAttribute("data-action");o[e]&&n.addEventListener("click",()=>{const t=o[e](s,n);t&&u(t)})})};return{state:s,init:n=>{i=n,r&&r(n,s)},render:(n,e)=>{i=n,s=e||s,l=!0,c(n,s)},destroy:n=>{a&&a(n,s),l=!1,i=null,n.innerHTML=""},setState:u,getState:()=>s}}function u(){const n=[];return{emit:(n,t,o)=>{const r=e();r?.eventBus&&r.eventBus.emit(n,t,o)},on:(t,o)=>{const r=e();if(r?.eventBus){const e=r.eventBus.on(t,o);return n.push(e),e}return()=>{}},once:(n,t)=>{const o=e();return o?.eventBus?o.eventBus.once(n,t):()=>{}},off:(n,t)=>{const o=e();o?.eventBus&&o.eventBus.off(n,t)},cleanup:()=>{n.forEach(n=>n()),n.length=0}}}function c(n=""){return{get:(t="")=>{const o=e();if(o?.store){const e=n?t?`${n}.${t}`:n:t;return o.store.get(e)}return null},set:(t,o)=>{const r=e();if(r?.store){const e=n?`${n}.${t}`:t;r.store.set(e,o)}},onChange:(t,o)=>{const r=e();if(r?.store){const e=n?`${n}.${t}`:t;return r.store.on(e,o)}return()=>{}}}}function d(n,t){const{name:o,url:r,fallbackText:a=null,onLoad:s=null,onError:i=null}=t,l=document.createElement("div");l.className="wu-slot",l.style.cssText="min-height: 100px; position: relative;",l.setAttribute("data-wu-app",o),l.setAttribute("data-wu-url",r),l.innerHTML=`\n <div style="display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;">\n ${a||`Loading ${o}...`}\n </div>\n `,n.appendChild(l);let u=null;return(async()=>{try{const n=e();if(!n)throw new Error("Wu Framework not initialized");const t=`wu-slot-${o}-${Date.now()}`,a=document.createElement("div");a.id=t,a.style.cssText="width: 100%; height: 100%;",l.innerHTML="",l.appendChild(a);const i=n.app(o,{url:r,container:`#${t}`,autoInit:!0});u=i,await i.mount(),s&&s({name:o,url:r})}catch(n){l.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;">${n.message}</p>\n </div>\n `,i&&i(n)}})(),{container:l,destroy:async()=>{if(u){try{await u.unmount()}catch(n){}u=null}l.remove()}}}const m={register:a,registerClass:s,registerTemplate:i,createComponent:l,createWuSlot:d,useWuEvents:u,useWuStore:c,useWuAI:o,getWuInstance:e,waitForWu:n};export{l as createComponent,d as createWuSlot,m as default,e as getWuInstance,a as register,s as registerClass,i as registerTemplate,o as useWuAI,u as useWuEvents,c as useWuStore,n as waitForWu,m as wuVanilla};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/adapters/vanilla/ai.js","../../../src/adapters/vanilla/index.js"],"sourcesContent":["/**\n * WU-FRAMEWORK VANILLA JS 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 useWuAI(options = {}) {\n const { namespace = 'default' } = options;\n const state = { messages: [], isStreaming: false, error: null };\n return {\n async send(text) {\n if (!text?.trim()) return null;\n const wu = getWuInstance();\n if (!wu?.ai) { state.error = 'Wu AI not available'; return null; }\n state.messages.push({ 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.push({ id: `assistant-${Date.now()}`, role: 'assistant', content: res.content, timestamp: Date.now() });\n state.isStreaming = false; return res;\n } catch (err) { state.error = err.message; state.isStreaming = false; return null; }\n },\n clear() { state.messages.length = 0; state.error = null; },\n getMessages() { return [...state.messages]; },\n getError() { return state.error; },\n isStreaming() { return state.isStreaming; },\n };\n}\n","/**\n * 🚀 WU-FRAMEWORK VANILLA JS ADAPTER\n *\n * El adapter más simple - Para JavaScript puro sin frameworks.\n * Ideal para microfrontends ligeros o legacy code.\n *\n * @example\n * // Microfrontend (main.js)\n * import { wuVanilla } from 'wu-framework/adapters/vanilla';\n *\n * wuVanilla.register('my-app', {\n * render: (container) => {\n * container.innerHTML = '<h1>Hello World</h1>';\n * }\n * });\n *\n * @example\n * // Con clase\n * class MyApp {\n * constructor(container) {\n * this.container = container;\n * }\n * render() {\n * this.container.innerHTML = '<h1>My App</h1>';\n * }\n * destroy() {\n * this.container.innerHTML = '';\n * }\n * }\n *\n * wuVanilla.registerClass('my-app', MyApp);\n */\n\n// Estado global del adapter\nconst adapterState = {\n apps: new Map(),\n instances: new Map()\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 una app Vanilla JS como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend\n * @param {Object} config - Configuración de la app\n * @param {Function} config.render - Función para renderizar (recibe container)\n * @param {Function} [config.destroy] - Función para limpiar (recibe container)\n * @param {Function} [config.init] - Función de inicialización (recibe container)\n * @param {Object} [config.state] - Estado inicial\n * @param {Object} options - Opciones adicionales\n *\n * @example\n * wuVanilla.register('counter', {\n * state: { count: 0 },\n * init: (container) => {\n * console.log('Initializing...');\n * },\n * render: (container, state) => {\n * container.innerHTML = `\n * <div>\n * <h1>Count: ${state.count}</h1>\n * <button id=\"increment\">+</button>\n * </div>\n * `;\n * container.querySelector('#increment').onclick = () => {\n * state.count++;\n * // Re-render\n * };\n * },\n * destroy: (container) => {\n * container.innerHTML = '';\n * }\n * });\n */\nasync function register(appName, config, options = {}) {\n const {\n render,\n destroy = null,\n init = null,\n state = {}\n } = config;\n\n const {\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#app'\n } = options;\n\n if (!render || typeof render !== 'function') {\n throw new Error(`[WuVanilla] render function is required for ${appName}`);\n }\n\n // Estado local de la app\n const appState = { ...state };\n\n // Función de mount\n const mountApp = (container) => {\n if (!container) {\n console.error(`[WuVanilla] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Evitar doble mount\n if (adapterState.apps.has(appName)) {\n console.warn(`[WuVanilla] ${appName} already mounted, unmounting first`);\n unmountApp();\n }\n\n try {\n // Limpiar container\n container.innerHTML = '';\n\n // Ejecutar init si existe\n if (init && typeof init === 'function') {\n init(container, appState);\n }\n\n // Renderizar\n render(container, appState);\n\n // Guardar referencia\n adapterState.apps.set(appName, {\n container,\n config,\n state: appState\n });\n\n console.log(`[WuVanilla] ✅ ${appName} mounted successfully`);\n\n if (onMount) {\n onMount(container, appState);\n }\n } catch (error) {\n console.error(`[WuVanilla] Mount error for ${appName}:`, error);\n throw error;\n }\n };\n\n // Función de unmount\n const unmountApp = (container) => {\n const appData = adapterState.apps.get(appName);\n\n if (appData) {\n try {\n if (onUnmount) {\n onUnmount(appData.container, appData.state);\n }\n\n // Ejecutar destroy si existe\n if (destroy && typeof destroy === 'function') {\n destroy(appData.container, appData.state);\n } else {\n // Cleanup por defecto\n appData.container.innerHTML = '';\n }\n\n adapterState.apps.delete(appName);\n\n console.log(`[WuVanilla] ✅ ${appName} unmounted successfully`);\n } catch (error) {\n console.error(`[WuVanilla] 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(`[WuVanilla] ✅ ${appName} registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuVanilla] Wu Framework not available for ${appName}`);\n\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n\n if (containerElement) {\n console.log(`[WuVanilla] Running ${appName} in standalone mode`);\n mountApp(containerElement);\n return true;\n }\n }\n\n return false;\n }\n}\n\n/**\n * Registra una clase como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend\n * @param {Function} AppClass - Clase con constructor(container) y métodos render/destroy\n * @param {Object} options - Opciones adicionales\n *\n * @example\n * class TodoApp {\n * constructor(container) {\n * this.container = container;\n * this.todos = [];\n * }\n *\n * render() {\n * this.container.innerHTML = `\n * <ul>${this.todos.map(t => `<li>${t}</li>`).join('')}</ul>\n * `;\n * }\n *\n * addTodo(text) {\n * this.todos.push(text);\n * this.render();\n * }\n *\n * destroy() {\n * this.container.innerHTML = '';\n * this.todos = [];\n * }\n * }\n *\n * wuVanilla.registerClass('todo-app', TodoApp);\n */\nasync function registerClass(appName, AppClass, options = {}) {\n const {\n constructorArgs = [],\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#app'\n } = options;\n\n // Función de mount\n const mountApp = (container) => {\n if (!container) {\n console.error(`[WuVanilla] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Evitar doble mount\n if (adapterState.instances.has(appName)) {\n console.warn(`[WuVanilla] ${appName} already mounted, unmounting first`);\n unmountApp();\n }\n\n try {\n container.innerHTML = '';\n\n // Crear instancia de la clase\n const instance = new AppClass(container, ...constructorArgs);\n\n // Llamar render si existe\n if (instance.render && typeof instance.render === 'function') {\n instance.render();\n }\n\n // Guardar instancia\n adapterState.instances.set(appName, {\n instance,\n container\n });\n\n console.log(`[WuVanilla] ✅ ${appName} (class) mounted successfully`);\n\n if (onMount) {\n onMount(container, instance);\n }\n } catch (error) {\n console.error(`[WuVanilla] Mount error for ${appName}:`, error);\n throw error;\n }\n };\n\n // Función de unmount\n const unmountApp = (container) => {\n const appData = adapterState.instances.get(appName);\n\n if (appData) {\n try {\n if (onUnmount) {\n onUnmount(appData.container, appData.instance);\n }\n\n // Llamar destroy si existe\n if (appData.instance.destroy && typeof appData.instance.destroy === 'function') {\n appData.instance.destroy();\n } else {\n appData.container.innerHTML = '';\n }\n\n adapterState.instances.delete(appName);\n\n console.log(`[WuVanilla] ✅ ${appName} (class) unmounted successfully`);\n } catch (error) {\n console.error(`[WuVanilla] 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(`[WuVanilla] ✅ ${appName} (class) registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuVanilla] Wu Framework not available for ${appName}`);\n\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n\n if (containerElement) {\n console.log(`[WuVanilla] Running ${appName} in standalone mode`);\n mountApp(containerElement);\n return true;\n }\n }\n\n return false;\n }\n}\n\n/**\n * Registra un template HTML como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend\n * @param {string|Function} template - HTML string o función que retorna HTML\n * @param {Object} options - Opciones adicionales\n *\n * @example\n * // Template estático\n * wuVanilla.registerTemplate('header', '<header><h1>My Header</h1></header>');\n *\n * // Template dinámico\n * wuVanilla.registerTemplate('greeting', (data) => `<h1>Hello ${data.name}!</h1>`, {\n * data: { name: 'World' }\n * });\n */\nasync function registerTemplate(appName, template, options = {}) {\n const {\n data = {},\n scripts = [],\n styles = [],\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#app'\n } = options;\n\n const mountApp = (container) => {\n if (!container) {\n console.error(`[WuVanilla] Mount failed for ${appName}: container is null`);\n return;\n }\n\n try {\n container.innerHTML = '';\n\n // Inyectar estilos\n if (styles.length > 0) {\n const styleEl = document.createElement('style');\n styleEl.textContent = styles.join('\\n');\n styleEl.setAttribute('data-wu-app', appName);\n container.appendChild(styleEl);\n }\n\n // Crear wrapper\n const wrapper = document.createElement('div');\n wrapper.setAttribute('data-wu-template', appName);\n\n // Renderizar template\n if (typeof template === 'function') {\n wrapper.innerHTML = template(data);\n } else {\n wrapper.innerHTML = template;\n }\n\n container.appendChild(wrapper);\n\n // Ejecutar scripts\n scripts.forEach(scriptFn => {\n if (typeof scriptFn === 'function') {\n scriptFn(container, data);\n }\n });\n\n adapterState.apps.set(appName, { container, template, data });\n\n console.log(`[WuVanilla] ✅ ${appName} (template) mounted successfully`);\n\n if (onMount) {\n onMount(container, data);\n }\n } catch (error) {\n console.error(`[WuVanilla] Mount error for ${appName}:`, error);\n throw error;\n }\n };\n\n const unmountApp = (container) => {\n const appData = adapterState.apps.get(appName);\n\n if (appData) {\n if (onUnmount) {\n onUnmount(appData.container, appData.data);\n }\n\n appData.container.innerHTML = '';\n adapterState.apps.delete(appName);\n\n console.log(`[WuVanilla] ✅ ${appName} (template) unmounted successfully`);\n }\n\n if (container) {\n container.innerHTML = '';\n }\n };\n\n try {\n const wu = await waitForWu(3000);\n\n wu.define(appName, {\n mount: mountApp,\n unmount: unmountApp\n });\n\n console.log(`[WuVanilla] ✅ ${appName} (template) registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuVanilla] Wu Framework not available for ${appName}`);\n\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n if (containerElement) {\n console.log(`[WuVanilla] Running ${appName} in standalone mode`);\n mountApp(containerElement);\n return true;\n }\n }\n\n return false;\n }\n}\n\n/**\n * Helper para crear un componente reactivo simple\n *\n * @param {Object} config - Configuración del componente\n * @returns {Object} Componente con métodos de estado\n *\n * @example\n * const Counter = wuVanilla.createComponent({\n * state: { count: 0 },\n * template: (state) => `\n * <div>\n * <h1>Count: ${state.count}</h1>\n * <button data-action=\"increment\">+</button>\n * <button data-action=\"decrement\">-</button>\n * </div>\n * `,\n * actions: {\n * increment: (state) => ({ count: state.count + 1 }),\n * decrement: (state) => ({ count: state.count - 1 })\n * }\n * });\n *\n * wuVanilla.register('counter', Counter);\n */\nfunction createComponent(config) {\n const { state: initialState = {}, template, actions = {}, onInit, onDestroy } = config;\n\n let currentState = { ...initialState };\n let container = null;\n let mounted = false;\n\n const setState = (newState) => {\n currentState = { ...currentState, ...newState };\n if (mounted && container) {\n render(container, currentState);\n }\n };\n\n const render = (cont, state) => {\n const html = template(state);\n\n // Preservar focus si es posible\n const activeId = document.activeElement?.id;\n\n cont.innerHTML = html;\n\n // Restaurar focus\n if (activeId) {\n const el = cont.querySelector(`#${activeId}`);\n if (el) el.focus();\n }\n\n // Bind actions\n cont.querySelectorAll('[data-action]').forEach(el => {\n const actionName = el.getAttribute('data-action');\n if (actions[actionName]) {\n el.addEventListener('click', () => {\n const result = actions[actionName](currentState, el);\n if (result) {\n setState(result);\n }\n });\n }\n });\n };\n\n return {\n state: currentState,\n\n init: (cont) => {\n container = cont;\n if (onInit) onInit(cont, currentState);\n },\n\n render: (cont, state) => {\n container = cont;\n currentState = state || currentState;\n mounted = true;\n render(cont, currentState);\n },\n\n destroy: (cont) => {\n if (onDestroy) onDestroy(cont, currentState);\n mounted = false;\n container = null;\n cont.innerHTML = '';\n },\n\n // Exponer setState para uso externo\n setState,\n getState: () => currentState\n };\n}\n\n/**\n * Helper para usar eventos de Wu Framework\n */\nfunction useWuEvents() {\n const subscriptions = [];\n\n return {\n emit: (event, data, options) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n wu.eventBus.emit(event, data, options);\n }\n },\n\n 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 once: (event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n return wu.eventBus.once(event, callback);\n }\n return () => {};\n },\n\n off: (event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n wu.eventBus.off(event, callback);\n }\n },\n\n cleanup: () => {\n subscriptions.forEach(unsub => unsub());\n subscriptions.length = 0;\n }\n };\n}\n\n/**\n * Helper para usar el Store de Wu Framework\n */\nfunction useWuStore(namespace = '') {\n return {\n get: (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 },\n\n set: (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 },\n\n onChange: (pattern, callback) => {\n const wu = getWuInstance();\n if (wu?.store) {\n const fullPattern = namespace ? `${namespace}.${pattern}` : pattern;\n return wu.store.on(fullPattern, callback);\n }\n return () => {};\n }\n };\n}\n\n/**\n * Crea un WuSlot en JavaScript puro\n */\nfunction createWuSlot(target, props) {\n const { name, url, fallbackText = null, onLoad = null, onError = null } = props;\n\n const container = document.createElement('div');\n container.className = 'wu-slot';\n container.style.cssText = 'min-height: 100px; position: relative;';\n container.setAttribute('data-wu-app', name);\n container.setAttribute('data-wu-url', url);\n\n // Loading state\n container.innerHTML = `\n <div style=\"display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;\">\n ${fallbackText || `Loading ${name}...`}\n </div>\n `;\n\n target.appendChild(container);\n\n let appInstance = null;\n\n const mount = async () => {\n try {\n const wu = getWuInstance();\n if (!wu) throw new Error('Wu Framework not initialized');\n\n const containerId = `wu-slot-${name}-${Date.now()}`;\n const innerContainer = document.createElement('div');\n innerContainer.id = containerId;\n innerContainer.style.cssText = 'width: 100%; height: 100%;';\n\n container.innerHTML = '';\n container.appendChild(innerContainer);\n\n const app = wu.app(name, {\n url,\n container: `#${containerId}`,\n autoInit: true\n });\n\n appInstance = app;\n await app.mount();\n\n if (onLoad) onLoad({ name, url });\n\n } catch (err) {\n container.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}</p>\n </div>\n `;\n if (onError) onError(err);\n }\n };\n\n const destroy = async () => {\n if (appInstance) {\n try {\n await appInstance.unmount();\n } catch (e) {}\n appInstance = null;\n }\n container.remove();\n };\n\n mount();\n\n return { container, destroy };\n}\n\n// ============================================\n// AI INTEGRATION\n// ============================================\nimport { useWuAI } from './ai.js';\n\n// API pública del adapter\nexport const wuVanilla = {\n register,\n registerClass,\n registerTemplate,\n createComponent,\n createWuSlot,\n useWuEvents,\n useWuStore,\n useWuAI,\n getWuInstance,\n waitForWu\n};\n\nexport {\n register,\n registerClass,\n registerTemplate,\n createComponent,\n createWuSlot,\n useWuEvents,\n useWuStore,\n useWuAI,\n getWuInstance,\n waitForWu\n};\n\nexport default wuVanilla;\n"],"names":["useWuAI","options","namespace","state","messages","isStreaming","error","send","text","trim","wu","window","parent","top","ai","push","id","Date","now","role","content","timestamp","res","err","message","clear","length","getMessages","getError","adapterState","apps","Map","instances","getWuInstance","waitForWu","timeout","Promise","resolve","reject","startTime","handleWuReady","cleanup","addEventListener","checkInterval","setInterval","Error","clearInterval","removeEventListener","async","register","appName","config","render","destroy","init","onMount","onUnmount","standalone","standaloneContainer","appState","mountApp","container","has","console","warn","unmountApp","innerHTML","set","log","appData","get","delete","define","mount","unmount","containerElement","document","querySelector","registerClass","AppClass","constructorArgs","instance","registerTemplate","template","data","scripts","styles","styleEl","createElement","textContent","join","setAttribute","appendChild","wrapper","forEach","scriptFn","createComponent","initialState","actions","onInit","onDestroy","currentState","mounted","setState","newState","cont","html","activeId","activeElement","el","focus","querySelectorAll","actionName","getAttribute","result","getState","useWuEvents","subscriptions","emit","event","eventBus","on","callback","unsubscribe","once","off","unsub","useWuStore","path","store","fullPath","value","onChange","pattern","fullPattern","createWuSlot","target","props","name","url","fallbackText","onLoad","onError","className","style","cssText","appInstance","containerId","innerContainer","app","autoInit","e","remove","wuVanilla"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/adapters/vanilla/ai.js","../../../src/adapters/vanilla/index.js"],"sourcesContent":["/**\n * WU-FRAMEWORK VANILLA JS 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 useWuAI(options = {}) {\n const { namespace = 'default' } = options;\n const state = { messages: [], isStreaming: false, error: null };\n return {\n async send(text) {\n if (!text?.trim()) return null;\n const wu = getWuInstance();\n if (!wu?.ai) { state.error = 'Wu AI not available'; return null; }\n state.messages.push({ 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.push({ id: `assistant-${Date.now()}`, role: 'assistant', content: res.content, timestamp: Date.now() });\n state.isStreaming = false; return res;\n } catch (err) { state.error = err.message; state.isStreaming = false; return null; }\n },\n clear() { state.messages.length = 0; state.error = null; },\n getMessages() { return [...state.messages]; },\n getError() { return state.error; },\n isStreaming() { return state.isStreaming; },\n };\n}\n","/**\n * 🚀 WU-FRAMEWORK VANILLA JS ADAPTER\n *\n * El adapter más simple - Para JavaScript puro sin frameworks.\n * Ideal para microfrontends ligeros o legacy code.\n *\n * @example\n * // Microfrontend (main.js)\n * import { wuVanilla } from 'wu-framework/adapters/vanilla';\n *\n * wuVanilla.register('my-app', {\n * render: (container) => {\n * container.innerHTML = '<h1>Hello World</h1>';\n * }\n * });\n *\n * @example\n * // Con clase\n * class MyApp {\n * constructor(container) {\n * this.container = container;\n * }\n * render() {\n * this.container.innerHTML = '<h1>My App</h1>';\n * }\n * destroy() {\n * this.container.innerHTML = '';\n * }\n * }\n *\n * wuVanilla.registerClass('my-app', MyApp);\n */\n\n// Estado global del adapter\nconst adapterState = {\n apps: new Map(),\n instances: new Map()\n};\n\n// getWuInstance/waitForWu viven en shared.js (versión con guarda cross-origin),\n// no se re-implementan acá.\nimport { getWuInstance, waitForWu, createWuAdapter } from '../shared.js';\n\n/**\n * Registra una app Vanilla JS como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend\n * @param {Object} config - Configuración de la app\n * @param {Function} config.render - Función para renderizar (recibe container)\n * @param {Function} [config.destroy] - Función para limpiar (recibe container)\n * @param {Function} [config.init] - Función de inicialización (recibe container)\n * @param {Object} [config.state] - Estado inicial\n * @param {Object} options - Opciones adicionales\n *\n * @example\n * wuVanilla.register('counter', {\n * state: { count: 0 },\n * init: (container) => {\n * console.log('Initializing...');\n * },\n * render: (container, state) => {\n * container.innerHTML = `\n * <div>\n * <h1>Count: ${state.count}</h1>\n * <button id=\"increment\">+</button>\n * </div>\n * `;\n * container.querySelector('#increment').onclick = () => {\n * state.count++;\n * // Re-render\n * };\n * },\n * destroy: (container) => {\n * container.innerHTML = '';\n * }\n * });\n */\nfunction register(appName, config, options = {}) {\n const {\n render,\n destroy = null,\n init = null,\n state = {}\n } = config;\n\n const { onMount = null, onUnmount = null } = options;\n\n if (!render || typeof render !== 'function') {\n throw new Error(`[WuVanilla] render function is required for ${appName}`);\n }\n\n // Construido sobre el contrato canónico createWuAdapter: la plomería de\n // getWuInstance/waitForWu/define/standalone vive ahí. Acá solo va la\n // lógica específica de vanilla — incluido el canal de props vivo (update).\n const registerFn = createWuAdapter({\n name: 'WuVanilla',\n // Las props del shell se fusionan sobre config.state como estado vivo.\n mount(container, { props }) {\n const appState = { ...state, ...props };\n container.innerHTML = '';\n if (init && typeof init === 'function') init(container, appState);\n render(container, appState);\n adapterState.apps.set(appName, { container, config, state: appState });\n if (onMount) onMount(container, appState);\n return { container, state: appState };\n },\n unmount(container) {\n const appData = adapterState.apps.get(appName);\n if (appData) {\n if (onUnmount) onUnmount(appData.container, appData.state);\n if (destroy && typeof destroy === 'function') {\n destroy(appData.container, appData.state);\n } else {\n appData.container.innerHTML = '';\n }\n adapterState.apps.delete(appName);\n }\n if (container) container.innerHTML = '';\n },\n // Canal de props vivo: el shell llama wu.update(app, props) y la app\n // re-renderiza in-place con el estado fusionado, sin desmontar.\n update(container, { props }) {\n const appData = adapterState.apps.get(appName);\n const target = appData?.container || container;\n const appState = { ...(appData?.state || state), ...props };\n if (appData) appData.state = appState;\n if (target) render(target, appState);\n },\n });\n\n // onMount/onUnmount ya se invocan arriba con la firma rica (container, state);\n // no se reenvían a createWuAdapter para que no se disparen una segunda vez.\n const { onMount: _om, onUnmount: _ou, ...rest } = options;\n return registerFn(appName, config, { standaloneContainer: '#app', ...rest });\n}\n\n/**\n * Registra una clase como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend\n * @param {Function} AppClass - Clase con constructor(container) y métodos render/destroy\n * @param {Object} options - Opciones adicionales\n *\n * @example\n * class TodoApp {\n * constructor(container) {\n * this.container = container;\n * this.todos = [];\n * }\n *\n * render() {\n * this.container.innerHTML = `\n * <ul>${this.todos.map(t => `<li>${t}</li>`).join('')}</ul>\n * `;\n * }\n *\n * addTodo(text) {\n * this.todos.push(text);\n * this.render();\n * }\n *\n * destroy() {\n * this.container.innerHTML = '';\n * this.todos = [];\n * }\n * }\n *\n * wuVanilla.registerClass('todo-app', TodoApp);\n */\nasync function registerClass(appName, AppClass, options = {}) {\n const {\n constructorArgs = [],\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#app'\n } = options;\n\n // Función de mount\n const mountApp = (container) => {\n if (!container) {\n console.error(`[WuVanilla] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Evitar doble mount\n if (adapterState.instances.has(appName)) {\n console.warn(`[WuVanilla] ${appName} already mounted, unmounting first`);\n unmountApp();\n }\n\n try {\n container.innerHTML = '';\n\n // Crear instancia de la clase\n const instance = new AppClass(container, ...constructorArgs);\n\n // Llamar render si existe\n if (instance.render && typeof instance.render === 'function') {\n instance.render();\n }\n\n // Guardar instancia\n adapterState.instances.set(appName, {\n instance,\n container\n });\n\n console.log(`[WuVanilla] ✅ ${appName} (class) mounted successfully`);\n\n if (onMount) {\n onMount(container, instance);\n }\n } catch (error) {\n console.error(`[WuVanilla] Mount error for ${appName}:`, error);\n throw error;\n }\n };\n\n // Función de unmount\n const unmountApp = (container) => {\n const appData = adapterState.instances.get(appName);\n\n if (appData) {\n try {\n if (onUnmount) {\n onUnmount(appData.container, appData.instance);\n }\n\n // Llamar destroy si existe\n if (appData.instance.destroy && typeof appData.instance.destroy === 'function') {\n appData.instance.destroy();\n } else {\n appData.container.innerHTML = '';\n }\n\n adapterState.instances.delete(appName);\n\n console.log(`[WuVanilla] ✅ ${appName} (class) unmounted successfully`);\n } catch (error) {\n console.error(`[WuVanilla] 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(`[WuVanilla] ✅ ${appName} (class) registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuVanilla] Wu Framework not available for ${appName}`);\n\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n\n if (containerElement) {\n console.log(`[WuVanilla] Running ${appName} in standalone mode`);\n mountApp(containerElement);\n return true;\n }\n }\n\n return false;\n }\n}\n\n/**\n * Registra un template HTML como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend\n * @param {string|Function} template - HTML string o función que retorna HTML\n * @param {Object} options - Opciones adicionales\n *\n * @example\n * // Template estático\n * wuVanilla.registerTemplate('header', '<header><h1>My Header</h1></header>');\n *\n * // Template dinámico\n * wuVanilla.registerTemplate('greeting', (data) => `<h1>Hello ${data.name}!</h1>`, {\n * data: { name: 'World' }\n * });\n */\nasync function registerTemplate(appName, template, options = {}) {\n const {\n data = {},\n scripts = [],\n styles = [],\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#app'\n } = options;\n\n const mountApp = (container) => {\n if (!container) {\n console.error(`[WuVanilla] Mount failed for ${appName}: container is null`);\n return;\n }\n\n try {\n container.innerHTML = '';\n\n // Inyectar estilos\n if (styles.length > 0) {\n const styleEl = document.createElement('style');\n styleEl.textContent = styles.join('\\n');\n styleEl.setAttribute('data-wu-app', appName);\n container.appendChild(styleEl);\n }\n\n // Crear wrapper\n const wrapper = document.createElement('div');\n wrapper.setAttribute('data-wu-template', appName);\n\n // Renderizar template\n if (typeof template === 'function') {\n wrapper.innerHTML = template(data);\n } else {\n wrapper.innerHTML = template;\n }\n\n container.appendChild(wrapper);\n\n // Ejecutar scripts\n scripts.forEach(scriptFn => {\n if (typeof scriptFn === 'function') {\n scriptFn(container, data);\n }\n });\n\n adapterState.apps.set(appName, { container, template, data });\n\n console.log(`[WuVanilla] ✅ ${appName} (template) mounted successfully`);\n\n if (onMount) {\n onMount(container, data);\n }\n } catch (error) {\n console.error(`[WuVanilla] Mount error for ${appName}:`, error);\n throw error;\n }\n };\n\n const unmountApp = (container) => {\n const appData = adapterState.apps.get(appName);\n\n if (appData) {\n if (onUnmount) {\n onUnmount(appData.container, appData.data);\n }\n\n appData.container.innerHTML = '';\n adapterState.apps.delete(appName);\n\n console.log(`[WuVanilla] ✅ ${appName} (template) unmounted successfully`);\n }\n\n if (container) {\n container.innerHTML = '';\n }\n };\n\n try {\n const wu = await waitForWu(3000);\n\n wu.define(appName, {\n mount: mountApp,\n unmount: unmountApp\n });\n\n console.log(`[WuVanilla] ✅ ${appName} (template) registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuVanilla] Wu Framework not available for ${appName}`);\n\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n if (containerElement) {\n console.log(`[WuVanilla] Running ${appName} in standalone mode`);\n mountApp(containerElement);\n return true;\n }\n }\n\n return false;\n }\n}\n\n/**\n * Helper para crear un componente reactivo simple\n *\n * @param {Object} config - Configuración del componente\n * @returns {Object} Componente con métodos de estado\n *\n * @example\n * const Counter = wuVanilla.createComponent({\n * state: { count: 0 },\n * template: (state) => `\n * <div>\n * <h1>Count: ${state.count}</h1>\n * <button data-action=\"increment\">+</button>\n * <button data-action=\"decrement\">-</button>\n * </div>\n * `,\n * actions: {\n * increment: (state) => ({ count: state.count + 1 }),\n * decrement: (state) => ({ count: state.count - 1 })\n * }\n * });\n *\n * wuVanilla.register('counter', Counter);\n */\nfunction createComponent(config) {\n const { state: initialState = {}, template, actions = {}, onInit, onDestroy } = config;\n\n let currentState = { ...initialState };\n let container = null;\n let mounted = false;\n\n const setState = (newState) => {\n currentState = { ...currentState, ...newState };\n if (mounted && container) {\n render(container, currentState);\n }\n };\n\n const render = (cont, state) => {\n const html = template(state);\n\n // Preservar focus si es posible\n const activeId = document.activeElement?.id;\n\n cont.innerHTML = html;\n\n // Restaurar focus\n if (activeId) {\n const el = cont.querySelector(`#${activeId}`);\n if (el) el.focus();\n }\n\n // Bind actions\n cont.querySelectorAll('[data-action]').forEach(el => {\n const actionName = el.getAttribute('data-action');\n if (actions[actionName]) {\n el.addEventListener('click', () => {\n const result = actions[actionName](currentState, el);\n if (result) {\n setState(result);\n }\n });\n }\n });\n };\n\n return {\n state: currentState,\n\n init: (cont) => {\n container = cont;\n if (onInit) onInit(cont, currentState);\n },\n\n render: (cont, state) => {\n container = cont;\n currentState = state || currentState;\n mounted = true;\n render(cont, currentState);\n },\n\n destroy: (cont) => {\n if (onDestroy) onDestroy(cont, currentState);\n mounted = false;\n container = null;\n cont.innerHTML = '';\n },\n\n // Exponer setState para uso externo\n setState,\n getState: () => currentState\n };\n}\n\n/**\n * Helper para usar eventos de Wu Framework\n */\nfunction useWuEvents() {\n const subscriptions = [];\n\n return {\n emit: (event, data, options) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n wu.eventBus.emit(event, data, options);\n }\n },\n\n 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 once: (event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n return wu.eventBus.once(event, callback);\n }\n return () => {};\n },\n\n off: (event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n wu.eventBus.off(event, callback);\n }\n },\n\n cleanup: () => {\n subscriptions.forEach(unsub => unsub());\n subscriptions.length = 0;\n }\n };\n}\n\n/**\n * Helper para usar el Store de Wu Framework\n */\nfunction useWuStore(namespace = '') {\n return {\n get: (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 },\n\n set: (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 },\n\n onChange: (pattern, callback) => {\n const wu = getWuInstance();\n if (wu?.store) {\n const fullPattern = namespace ? `${namespace}.${pattern}` : pattern;\n return wu.store.on(fullPattern, callback);\n }\n return () => {};\n }\n };\n}\n\n/**\n * Crea un WuSlot en JavaScript puro\n */\nfunction createWuSlot(target, props) {\n const { name, url, fallbackText = null, onLoad = null, onError = null } = props;\n\n const container = document.createElement('div');\n container.className = 'wu-slot';\n container.style.cssText = 'min-height: 100px; position: relative;';\n container.setAttribute('data-wu-app', name);\n container.setAttribute('data-wu-url', url);\n\n // Loading state\n container.innerHTML = `\n <div style=\"display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;\">\n ${fallbackText || `Loading ${name}...`}\n </div>\n `;\n\n target.appendChild(container);\n\n let appInstance = null;\n\n const mount = async () => {\n try {\n const wu = getWuInstance();\n if (!wu) throw new Error('Wu Framework not initialized');\n\n const containerId = `wu-slot-${name}-${Date.now()}`;\n const innerContainer = document.createElement('div');\n innerContainer.id = containerId;\n innerContainer.style.cssText = 'width: 100%; height: 100%;';\n\n container.innerHTML = '';\n container.appendChild(innerContainer);\n\n const app = wu.app(name, {\n url,\n container: `#${containerId}`,\n autoInit: true\n });\n\n appInstance = app;\n await app.mount();\n\n if (onLoad) onLoad({ name, url });\n\n } catch (err) {\n container.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}</p>\n </div>\n `;\n if (onError) onError(err);\n }\n };\n\n const destroy = async () => {\n if (appInstance) {\n try {\n await appInstance.unmount();\n } catch (e) {}\n appInstance = null;\n }\n container.remove();\n };\n\n mount();\n\n return { container, destroy };\n}\n\n// ============================================\n// AI INTEGRATION\n// ============================================\nimport { useWuAI } from './ai.js';\n\n// API pública del adapter\nexport const wuVanilla = {\n register,\n registerClass,\n registerTemplate,\n createComponent,\n createWuSlot,\n useWuEvents,\n useWuStore,\n useWuAI,\n getWuInstance,\n waitForWu\n};\n\nexport {\n register,\n registerClass,\n registerTemplate,\n createComponent,\n createWuSlot,\n useWuEvents,\n useWuStore,\n useWuAI,\n getWuInstance,\n waitForWu\n};\n\nexport default wuVanilla;\n"],"names":["useWuAI","options","namespace","state","messages","isStreaming","error","send","text","trim","wu","window","parent","top","ai","push","id","Date","now","role","content","timestamp","res","err","message","clear","length","getMessages","getError","adapterState","apps","Map","instances","register","appName","config","render","destroy","init","onMount","onUnmount","Error","registerFn","createWuAdapter","name","mount","container","props","appState","innerHTML","set","unmount","appData","get","delete","update","target","_om","_ou","rest","standaloneContainer","async","registerClass","AppClass","constructorArgs","standalone","mountApp","has","console","warn","unmountApp","instance","log","waitForWu","define","containerElement","document","querySelector","registerTemplate","template","data","scripts","styles","styleEl","createElement","textContent","join","setAttribute","appendChild","wrapper","forEach","scriptFn","createComponent","initialState","actions","onInit","onDestroy","currentState","mounted","setState","newState","cont","html","activeId","activeElement","el","focus","querySelectorAll","actionName","getAttribute","addEventListener","result","getState","useWuEvents","subscriptions","emit","event","getWuInstance","eventBus","on","callback","unsubscribe","once","off","cleanup","unsub","useWuStore","path","store","fullPath","value","onChange","pattern","fullPattern","createWuSlot","url","fallbackText","onLoad","onError","className","style","cssText","appInstance","containerId","innerContainer","app","autoInit","e","remove","wuVanilla"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=new class{constructor(){this.isDevelopment=this.detectEnvironment(),this.logLevel=this.isDevelopment?"warn":"error",this.levels={debug:0,info:1,warn:2,error:3,silent:4}}detectEnvironment(){if("undefined"!=typeof window&&!0===window.WU_DEBUG)return!0;if("undefined"!=typeof window&&!1===window.WU_DEBUG)return!1;if("undefined"!=typeof process&&"production"===process.env?.NODE_ENV)return!1;if("undefined"!=typeof process&&"development"===process.env?.NODE_ENV)return!0;if("undefined"!=typeof window&&window.location){const e=window.location.hostname;if("localhost"===e||"127.0.0.1"===e||"[::1]"===e)return!0;try{if(new URLSearchParams(window.location.search).has("wu-debug"))return!0}catch{}}return!1}setLevel(e){return this.logLevel=e,this}setDevelopment(e){return this.isDevelopment=e,this.logLevel=e?"debug":"error",this}shouldLog(e){return this.levels[e]>=this.levels[this.logLevel]}debug(...e){this.shouldLog("debug")&&console.log(...e)}info(...e){this.shouldLog("info")&&console.info(...e)}warn(...e){this.shouldLog("warn")&&console.warn(...e)}error(...e){this.shouldLog("error")&&console.error(...e)}wu(e,...n){if(this.shouldLog(e)){console["debug"===e?"log":e]("[Wu]",...n)}}wuDebug(...e){this.wu("debug",...e)}wuInfo(...e){this.wu("info",...e)}wuWarn(...e){this.wu("warn",...e)}wuError(...e){this.wu("error",...e)}};function n(){return"undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null}function t(e){const{ref:t}=e;return function(e={}){const{namespace:o="default"}=e,r=t([]),a=t(!1),i=t(null);return{messages:r,isStreaming:a,error:i,send:async function(e){if(!e?.trim())return;const t=n();if(t?.ai){r.value=[...r.value,{id:`user-${Date.now()}`,role:"user",content:e,timestamp:Date.now()}],i.value=null,a.value=!0;try{const n=await t.ai.send(e,{namespace:o});r.value=[...r.value,{id:`assistant-${Date.now()}`,role:"assistant",content:n.content,timestamp:Date.now()}]}catch(e){i.value=e.message||"AI request failed"}a.value=!1}else i.value="Wu AI not available"},clear:function(){r.value=[],i.value=null}}}}function o(e={}){const{namespace:t="default"}=e,o={messages:[],isStreaming:!1,error:null};return{...o,async send(e){if(!e?.trim())return null;const r=n();if(!r?.ai)return o.error="Wu AI not available",null;o.messages.push({id:`user-${Date.now()}`,role:"user",content:e,timestamp:Date.now()}),o.isStreaming=!0,o.error=null;try{const n=await r.ai.send(e,{namespace:t});return o.messages.push({id:`assistant-${Date.now()}`,role:"assistant",content:n.content,timestamp:Date.now()}),o.isStreaming=!1,n}catch(e){return o.error=e.message,o.isStreaming=!1,null}},clear(){o.messages.length=0,o.error=null}}}const r={apps:new Map,Vue:null,createApp:null,initialized:!1};function a(){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=a();if(o)return void n(o);const r=Date.now(),i=()=>{s(),n(a())};window.addEventListener("wu:ready",i),window.addEventListener("wu:app:ready",i);const u=setInterval(()=>{const o=a();if(o)return s(),void n(o);Date.now()-r>e&&(s(),t(new Error(`Wu Framework not found after ${e}ms`)))},200);function s(){clearInterval(u),window.removeEventListener("wu:ready",i),window.removeEventListener("wu:app:ready",i)}})}async function u(n,t,o={}){const{setup:u=null,props:s={},onMount:l=null,onUnmount:c=null,standalone:d=!0,standaloneContainer:p="#app"}=o;if(!await async function(){if(r.initialized)return!0;try{if("undefined"!=typeof window&&window.Vue)return r.Vue=window.Vue,r.createApp=window.Vue.createApp,r.initialized=!0,!0;const e=await import("vue");return r.Vue=e,r.createApp=e.createApp,r.initialized=!0,!0}catch(e){return console.error("[WuVue] Failed to load Vue:",e),!1}}())return console.error(`[WuVue] Cannot register ${n}: Vue not available`),!1;const{createApp:w}=r,f=o=>{if(o){r.apps.has(n)&&(e.warn(`[WuVue] ${n} already mounted, unmounting first`),m());try{let i=null,c=o;for(;c&&c!==document.body;){if(c.getRootNode&&c.getRootNode()instanceof ShadowRoot){i=c.getRootNode();break}c=c.parentElement||c.host}const d=w(t,s);u&&"function"==typeof u&&u(d),d.config.errorHandler=(e,t,o)=>{console.error(`[WuVue] ${n} error in ${o}:`,e)},d.config.warnHandler=(e,t,o)=>{console.warn(`[WuVue] ${n} warn:`,e)},d.provide("wuAppName",n),d.provide("wuInstance",a()),d.mount(o),i&&setTimeout(()=>{document.querySelectorAll('style[data-vite-dev-id*="/'+n+'/"], style[data-vite-dev-id*="\\'+n+'\\"]').forEach(n=>{const t=n.getAttribute("data-vite-dev-id");if(t&&!i.querySelector(`style[data-vite-dev-id="${t}"]`)){const o=n.cloneNode(!0);i.insertBefore(o,i.firstChild),e.debug(`[WuVue] ✅ Injected style into Shadow DOM: ${t}`)}});document.querySelectorAll("style[data-vite-dev-id]").forEach(t=>{const o=t.getAttribute("data-vite-dev-id");if(o&&(o.includes(`/${n}/`)||o.includes(`\\${n}\\`))&&!i.querySelector(`style[data-vite-dev-id="${o}"]`)){const n=t.cloneNode(!0);i.insertBefore(n,i.firstChild),e.debug(`[WuVue] ✅ Injected app style into Shadow DOM: ${o}`)}})},100),r.apps.set(n,{app:d,container:o}),e.debug(`[WuVue] ✅ ${n} mounted successfully`),l&&l(o,d)}catch(e){throw console.error(`[WuVue] Mount error for ${n}:`,e),e}}else console.error(`[WuVue] Mount failed for ${n}: container is null`)},m=t=>{const o=r.apps.get(n);if(o)try{c&&c(o.container,o.app),o.app.unmount(),r.apps.delete(n),e.debug(`[WuVue] ✅ ${n} unmounted successfully`)}catch(e){console.error(`[WuVue] Unmount error for ${n}:`,e)}t&&(t.innerHTML="")};try{return(await i(3e3)).define(n,{mount:f,unmount:m}),e.debug(`[WuVue] ✅ ${n} registered with Wu Framework`),!0}catch(t){if(e.warn(`[WuVue] Wu Framework not available for ${n}`),d){const t=document.querySelector(p);if(t)return e.debug(`[WuVue] Running ${n} in standalone mode`),f(t),!0;e.warn(`[WuVue] Standalone container ${p} not found`)}return!1}}const s={name:"WuSlot",props:{name:{type:String,required:!0},url:{type:String,required:!0},appName:{type:String,default:null},fallbackText:{type:String,default:"Loading..."}},emits:["load","error","mount","unmount"],data:()=>({loading:!0,error:null,appInstance:null,containerId:null}),computed:{actualAppName(){return this.appName||this.name}},async mounted(){await this.mountMicrofrontend()},beforeUnmount(){this.unmountMicrofrontend()},methods:{async mountMicrofrontend(){try{this.loading=!0,this.error=null;const e=a();if(!e)throw new Error("Wu Framework not initialized");this.containerId=`wu-slot-${this.actualAppName}-${Date.now()}`;const n=document.createElement("div");n.id=this.containerId,n.style.width="100%",n.style.height="100%",this.$refs.container.innerHTML="",this.$refs.container.appendChild(n);const t=e.app(this.actualAppName,{url:this.url,container:`#${this.containerId}`,autoInit:!0});this.appInstance=t,await t.mount(),this.loading=!1,this.$emit("load",{name:this.actualAppName,url:this.url}),this.$emit("mount",{name:this.actualAppName,container:n})}catch(e){console.error(`[WuSlot] Error loading ${this.actualAppName}:`,e),this.error=e.message||"Failed to load microfrontend",this.loading=!1,this.$emit("error",e)}},async unmountMicrofrontend(){if(this.appInstance){this.$emit("unmount",{name:this.actualAppName});try{await this.appInstance.unmount()}catch(n){e.warn(`[WuSlot] Error unmounting ${this.actualAppName}:`,n)}this.appInstance=null}}},template:'\n <div\n ref="container"\n class="wu-slot"\n :class="{ \'wu-slot-loading\': loading, \'wu-slot-error\': error }"\n :data-wu-app="actualAppName"\n :data-wu-url="url"\n style="min-height: 100px; position: relative;"\n >\n <div v-if="error" class="wu-slot-error-message" 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 <div v-else-if="loading" class="wu-slot-loading-message" style="display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;">\n {{ fallbackText || \'Loading \' + name + \'...\' }}\n </div>\n </div>\n '};function l(){const n=[];return{emit:(n,t,o)=>{const r=a();r?.eventBus?r.eventBus.emit(n,t,o):e.warn("[useWuEvents] Wu Framework not available")},on:(t,o)=>{const r=a();if(r?.eventBus){const e=r.eventBus.on(t,o);return n.push(e),e}return e.warn("[useWuEvents] Wu Framework not available"),()=>{}},once:(n,t)=>{const o=a();return o?.eventBus?o.eventBus.once(n,t):(e.warn("[useWuEvents] Wu Framework not available"),()=>{})},off:(e,n)=>{const t=a();t?.eventBus&&t.eventBus.off(e,n)},cleanup:()=>{n.forEach(e=>e()),n.length=0}}}function c(e=""){const n=r.Vue;let t,o=null;if(n?.ref){const r=a(),i=r?.store?.get(e)||null;if(t=n.ref(i),r?.store){const n=e?`${e}.*`:"*";o=r.store.on(n,()=>{t.value=r.store.get(e)})}}else t={value:null};return{state:t,setState:(n,t)=>{const o=a();if(o?.store){const r=e?`${e}.${n}`:n;o.store.set(r,t)}},getState:(n="")=>{const t=a();if(t?.store){const o=e?n?`${e}.${n}`:e:n;return t.store.get(o)}return null},cleanup:()=>{o&&(o(),o=null)}}}const d={install(n,t={}){n.component("WuSlot",s),n.provide("wu",a()),n.config.globalProperties.$wu=a(),n.config.globalProperties.$wuEvents=l(),n.config.globalProperties.$wuStore=e=>c(e),e.debug("[WuVue] Plugin installed")}},p={register:u,WuSlot:s,useWuEvents:l,useWuStore:c,wuVuePlugin:d,createUseWuAI:t,useWuAI:o,getWuInstance:a,waitForWu:i};export{s as WuSlot,t as createUseWuAI,p as default,a as getWuInstance,u as register,o as useWuAI,l as useWuEvents,c as useWuStore,i as waitForWu,p as wuVue,d as wuVuePlugin};
1
+ const e=new class{constructor(){this.isDevelopment=this.detectEnvironment(),this.logLevel=this.isDevelopment?"warn":"error",this.levels={debug:0,info:1,warn:2,error:3,silent:4}}detectEnvironment(){if("undefined"!=typeof window&&!0===window.WU_DEBUG)return!0;if("undefined"!=typeof window&&!1===window.WU_DEBUG)return!1;if("undefined"!=typeof process&&"production"===process.env?.NODE_ENV)return!1;if("undefined"!=typeof process&&"development"===process.env?.NODE_ENV)return!0;if("undefined"!=typeof window&&window.location){const e=window.location.hostname;if("localhost"===e||"127.0.0.1"===e||"[::1]"===e)return!0;try{if(new URLSearchParams(window.location.search).has("wu-debug"))return!0}catch{}}return!1}setLevel(e){return this.logLevel=e,this}setDevelopment(e){return this.isDevelopment=e,this.logLevel=e?"debug":"error",this}shouldLog(e){return this.levels[e]>=this.levels[this.logLevel]}debug(...e){this.shouldLog("debug")&&console.log(...e)}info(...e){this.shouldLog("info")&&console.info(...e)}warn(...e){this.shouldLog("warn")&&console.warn(...e)}error(...e){this.shouldLog("error")&&console.error(...e)}wu(e,...t){if(this.shouldLog(e)){console["debug"===e?"log":e]("[Wu]",...t)}}wuDebug(...e){this.wu("debug",...e)}wuInfo(...e){this.wu("info",...e)}wuWarn(...e){this.wu("warn",...e)}wuError(...e){this.wu("error",...e)}};function t(){return"undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null}function n(e){const{ref:n}=e;return function(e={}){const{namespace:o="default"}=e,r=n([]),u=n(!1),a=n(null);return{messages:r,isStreaming:u,error:a,send:async function(e){if(!e?.trim())return;const n=t();if(n?.ai){r.value=[...r.value,{id:`user-${Date.now()}`,role:"user",content:e,timestamp:Date.now()}],a.value=null,u.value=!0;try{const t=await n.ai.send(e,{namespace:o});r.value=[...r.value,{id:`assistant-${Date.now()}`,role:"assistant",content:t.content,timestamp:Date.now()}]}catch(e){a.value=e.message||"AI request failed"}u.value=!1}else a.value="Wu AI not available"},clear:function(){r.value=[],a.value=null}}}}function o(e={}){const{namespace:n="default"}=e,o={messages:[],isStreaming:!1,error:null};return{...o,async send(e){if(!e?.trim())return null;const r=t();if(!r?.ai)return o.error="Wu AI not available",null;o.messages.push({id:`user-${Date.now()}`,role:"user",content:e,timestamp:Date.now()}),o.isStreaming=!0,o.error=null;try{const t=await r.ai.send(e,{namespace:n});return o.messages.push({id:`assistant-${Date.now()}`,role:"assistant",content:t.content,timestamp:Date.now()}),o.isStreaming=!1,t}catch(e){return o.error=e.message,o.isStreaming=!1,null}},clear(){o.messages.length=0,o.error=null}}}const r={apps:new Map,Vue:null,createApp:null,initialized:!1};async function u(){if(r.initialized)return!0;try{if("undefined"!=typeof window&&window.Vue)return r.Vue=window.Vue,r.createApp=window.Vue.createApp,r.initialized=!0,!0;const e=await import("vue");return r.Vue=e,r.createApp=e.createApp,r.initialized=!0,!0}catch(e){return console.error("[WuVue] Failed to load Vue:",e),!1}}function a(){return r.Vue?.h?r.Vue.h:"undefined"!=typeof window&&window.Vue?.h?window.Vue.h:null}function i(){return"undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null}function s(e=5e3){return new Promise((t,n)=>{const o=i();if(o)return void t(o);const r=Date.now(),u=()=>{s(),t(i())};window.addEventListener("wu:ready",u),window.addEventListener("wu:app:ready",u);const a=setInterval(()=>{const o=i();if(o)return s(),void t(o);Date.now()-r>e&&(s(),n(new Error(`Wu Framework not found after ${e}ms`)))},200);function s(){clearInterval(a),window.removeEventListener("wu:ready",u),window.removeEventListener("wu:app:ready",u)}})}async function l(t,n,o={}){const{setup:a=null,props:l={},onMount:c=null,onUnmount:d=null,standalone:p=!0,standaloneContainer:w="#app"}=o;if(!await u())return console.error(`[WuVue] Cannot register ${t}: Vue not available`),!1;const{createApp:f}=r,h=r.Vue?.reactive?r.Vue.reactive({...l}):{...l},m=o=>{if(o){r.apps.has(t)&&(e.warn(`[WuVue] ${t} already mounted, unmounting first`),g());try{let u=null,s=o;for(;s&&s!==document.body;){if(s.getRootNode&&s.getRootNode()instanceof ShadowRoot){u=s.getRootNode();break}s=s.parentElement||s.host}const l=f(n,h);a&&"function"==typeof a&&a(l),l.config.errorHandler=(e,n,o)=>{console.error(`[WuVue] ${t} error in ${o}:`,e)},l.config.warnHandler=(e,n,o)=>{console.warn(`[WuVue] ${t} warn:`,e)},l.provide("wuAppName",t),l.provide("wuInstance",i()),l.mount(o),u&&setTimeout(()=>{document.querySelectorAll('style[data-vite-dev-id*="/'+t+'/"], style[data-vite-dev-id*="\\'+t+'\\"]').forEach(t=>{const n=t.getAttribute("data-vite-dev-id");if(n&&!u.querySelector(`style[data-vite-dev-id="${n}"]`)){const o=t.cloneNode(!0);u.insertBefore(o,u.firstChild),e.debug(`[WuVue] ✅ Injected style into Shadow DOM: ${n}`)}});document.querySelectorAll("style[data-vite-dev-id]").forEach(n=>{const o=n.getAttribute("data-vite-dev-id");if(o&&(o.includes(`/${t}/`)||o.includes(`\\${t}\\`))&&!u.querySelector(`style[data-vite-dev-id="${o}"]`)){const t=n.cloneNode(!0);u.insertBefore(t,u.firstChild),e.debug(`[WuVue] ✅ Injected app style into Shadow DOM: ${o}`)}})},100),r.apps.set(t,{app:l,container:o}),e.debug(`[WuVue] ✅ ${t} mounted successfully`),c&&c(o,l)}catch(e){throw console.error(`[WuVue] Mount error for ${t}:`,e),e}}else console.error(`[WuVue] Mount failed for ${t}: container is null`)},g=n=>{const o=r.apps.get(t);if(o)try{d&&d(o.container,o.app),o.app.unmount(),r.apps.delete(t),e.debug(`[WuVue] ✅ ${t} unmounted successfully`)}catch(e){console.error(`[WuVue] Unmount error for ${t}:`,e)}n&&(n.innerHTML="")},v=r.Vue?.reactive?(e,t)=>{Object.assign(h,t||{})}:void 0;try{const n=await s(3e3),o={mount:m,unmount:g};return v&&(o.update=v),n.define(t,o),e.debug(`[WuVue] ✅ ${t} registered with Wu Framework`),!0}catch(n){if(e.warn(`[WuVue] Wu Framework not available for ${t}`),p){const n=document.querySelector(w);if(n)return e.debug(`[WuVue] Running ${t} in standalone mode`),m(n),!0;e.warn(`[WuVue] Standalone container ${w} not found`)}return!1}}const c={name:"WuSlot",props:{name:{type:String,required:!0},url:{type:String,required:!0},appName:{type:String,default:null},fallbackText:{type:String,default:"Loading..."}},emits:["load","error","mount","unmount"],data:()=>({loading:!0,error:null,appInstance:null,containerId:null,vueReady:!!a()}),computed:{actualAppName(){return this.appName||this.name}},created(){this.vueReady||u().then(()=>{this.vueReady=!0})},async mounted(){await this.mountMicrofrontend()},beforeUnmount(){this.unmountMicrofrontend()},methods:{async mountMicrofrontend(){try{this.loading=!0,this.error=null;const e=i();if(!e)throw new Error("Wu Framework not initialized");if(this.$refs.container||(await u(),this.vueReady=!0,await this.$nextTick()),!this.$refs.container)throw new Error("WuSlot container not available");this.containerId=`wu-slot-${this.actualAppName}-${Date.now()}`;const t=document.createElement("div");t.id=this.containerId,t.style.width="100%",t.style.height="100%",this.$refs.container.innerHTML="",this.$refs.container.appendChild(t);const n=e.app(this.actualAppName,{url:this.url,container:`#${this.containerId}`,autoInit:!0});this.appInstance=n,await n.mount(),this.loading=!1,this.$emit("load",{name:this.actualAppName,url:this.url}),this.$emit("mount",{name:this.actualAppName,container:t})}catch(e){console.error(`[WuSlot] Error loading ${this.actualAppName}:`,e),this.error=e.message||"Failed to load microfrontend",this.loading=!1,this.$emit("error",e)}},async unmountMicrofrontend(){if(this.appInstance){this.$emit("unmount",{name:this.actualAppName});try{await this.appInstance.unmount()}catch(t){e.warn(`[WuSlot] Error unmounting ${this.actualAppName}:`,t)}this.appInstance=null}}},render(){const e=this.vueReady?a():null;if(!e)return this.vueReady&&console.error('[WuSlot] Cannot resolve Vue\'s h(): no importable "vue", no window.Vue. Pass your Vue namespace via app.use(wuVuePlugin, { Vue }).'),null;const t=[];return this.error?t.push(e("div",{class:"wu-slot-error-message",style:"padding: 1rem; border: 1px solid #f5c6cb; border-radius: 4px; background: #f8d7da; color: #721c24;"},[e("strong",`Error loading ${this.name}`),e("p",{style:"margin: 0.5rem 0 0 0;"},this.error)])):this.loading&&t.push(e("div",{class:"wu-slot-loading-message",style:"display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;"},this.fallbackText||`Loading ${this.name}...`)),e("div",{ref:"container",class:["wu-slot",{"wu-slot-loading":this.loading,"wu-slot-error":!!this.error}],"data-wu-app":this.actualAppName,"data-wu-url":this.url,style:"min-height: 100px; position: relative;"},t)}};function d(){const t=[];return{emit:(t,n,o)=>{const r=i();r?.eventBus?r.eventBus.emit(t,n,o):e.warn("[useWuEvents] Wu Framework not available")},on:(n,o)=>{const r=i();if(r?.eventBus){const e=r.eventBus.on(n,o);return t.push(e),e}return e.warn("[useWuEvents] Wu Framework not available"),()=>{}},once:(n,o)=>{const r=i();if(r?.eventBus){const e=r.eventBus.once(n,o);return t.push(e),e}return e.warn("[useWuEvents] Wu Framework not available"),()=>{}},off:(e,t)=>{const n=i();n?.eventBus&&n.eventBus.off(e,t)},cleanup:()=>{t.forEach(e=>e()),t.length=0}}}function p(e=""){const t=r.Vue;let n,o=null;if(t?.ref){const r=i(),u=r?.store?.get(e)||null;n=t.ref(u),r?.store&&(o=r.store.on(e||"*",()=>{n.value=r.store.get(e)}))}else n={value:null};return{state:n,setState:(t,n)=>{const o=i();if(o?.store){const r=e?`${e}.${t}`:t;o.store.set(r,n)}},getState:(t="")=>{const n=i();if(n?.store){const o=e?t?`${e}.${t}`:e:t;return n.store.get(o)}return null},cleanup:()=>{o&&(o(),o=null)}}}const w={install(t,n={}){n.Vue?.h&&!r.Vue&&(r.Vue=n.Vue),t.component("WuSlot",c),t.provide("wu",i()),t.config.globalProperties.$wu=i();const o=d();t.config.globalProperties.$wuEvents=o,t.config.globalProperties.$wuStore=e=>p(e);const u=t.unmount;t.unmount=function(...e){return o.cleanup(),u.apply(this,e)},e.debug("[WuVue] Plugin installed")}},f={register:l,WuSlot:c,useWuEvents:d,useWuStore:p,wuVuePlugin:w,createUseWuAI:n,useWuAI:o,getWuInstance:i,waitForWu:s};export{c as WuSlot,n as createUseWuAI,f as default,i as getWuInstance,l as register,o as useWuAI,d as useWuEvents,p as useWuStore,s as waitForWu,f as wuVue,w as wuVuePlugin};
2
2
  //# sourceMappingURL=index.js.map