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
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  <p align="center">
12
12
  <a href="https://www.npmjs.com/package/wu-framework"><img src="https://img.shields.io/npm/v/wu-framework.svg?color=6366f1&label=npm" alt="npm version" /></a>
13
13
  <a href="https://github.com/LuisPadre25/wu-framework/actions"><img src="https://img.shields.io/github/actions/workflow/status/LuisPadre25/wu-framework/ci.yml?label=tests&color=14b8a6" alt="tests" /></a>
14
- <img src="https://img.shields.io/badge/tests-702%20passed-14b8a6" alt="702 tests" />
14
+ <img src="https://img.shields.io/badge/tests-742%20passed-14b8a6" alt="742 tests" />
15
15
  <img src="https://img.shields.io/badge/dependencies-0-6366f1" alt="zero deps" />
16
16
  <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT License" /></a>
17
17
  </p>
@@ -33,6 +33,11 @@ Add AI to any app with one line. Connect your own LLM (OpenAI, Anthropic, Ollama
33
33
  npm install wu-framework
34
34
  ```
35
35
 
36
+ > **v2.2**: live props without remounting — `wu.update(name, props)` (React,
37
+ > Preact, Vue, Svelte, Lit, Vanilla) · `createWuAdapter()` to author adapters ·
38
+ > DevTools: `wu.inspect()` + `wu.showInspector()` + `window.__WU_DEVTOOLS__`.
39
+ > All additive. See [CHANGELOG.md](./CHANGELOG.md#220---2026-06-11---live-props-adapter-core--devtools).
40
+ >
36
41
  > **v2.1**: honest sandbox modes + reference-counted mount/unmount for robust
37
42
  > StrictMode + Suspense flows. New: `wu.getSandboxInfo(name)`, `strictFallback`
38
43
  > option, `wu.tagStyleAsApp(el, name)`, styleMode aliases `none` / `own-only`.
@@ -2,7 +2,7 @@
2
2
  * WU-FRAMEWORK ALPINE.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
  * Alpine.js app configuration
@@ -2,7 +2,7 @@
2
2
  * 🚀 WU-FRAMEWORK ANGULAR 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
  // Angular types (generics to avoid hard dependency)
8
8
  type NgModuleRef<T> = any;
@@ -2,7 +2,7 @@
2
2
  * WU-FRAMEWORK HTMX 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
  * HTMX app configuration
@@ -2,7 +2,7 @@
2
2
  * 🚀 WU-FRAMEWORK LIT 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
  // Lit types (generics to avoid hard dependency)
8
8
  type LitElement = any;
@@ -1,4 +1,4 @@
1
- function t(t){return class extends t{constructor(){super(),this._wuAINamespace="default"}get wuAI(){return("undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null)?.ai||null}async wuAISend(t,e={}){const n=this.wuAI;return n?n.send(t,{namespace:this._wuAINamespace,...e}):(console.warn("[WuAIMixin] wu.ai not available"),null)}wuAISetNamespace(t){this._wuAINamespace=t}}}const e={apps:new Map,elements:new Map,lit:null,initialized:!1};function n(){return"undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null}function o(t=5e3){return new Promise((e,o)=>{const s=n();if(s)return void e(s);const r=Date.now(),a=()=>{u(),e(n())};window.addEventListener("wu:ready",a),window.addEventListener("wu:app:ready",a);const i=setInterval(()=>{const s=n();if(s)return u(),void e(s);Date.now()-r>t&&(u(),o(new Error(`Wu Framework not found after ${t}ms`)))},200);function u(){clearInterval(i),window.removeEventListener("wu:ready",a),window.removeEventListener("wu:app:ready",a)}})}async function s(t,s,r={}){const{tagName:a=null,properties:i={},onMount:u=null,onUnmount:c=null,standalone:l=!0,standaloneContainer:d="#root"}=r,p=a||function(t){return t.includes("-")?`wu-${t}`:`wu-app-${t}`}(t);if(!customElements.get(p))try{customElements.define(p,s),console.log(`[WuLit] Custom element <${p}> defined`)}catch(t){throw console.error("[WuLit] Failed to define custom element:",t),t}e.elements.set(t,{ElementClass:s,tagName:p});const w=o=>{if(o){e.apps.has(t)&&(console.warn(`[WuLit] ${t} already mounted, unmounting first`),m());try{o.innerHTML="";const s=document.createElement(p);Object.entries(i).forEach(([t,e])=>{s[t]=e}),s.wuAppName=t,s.wuInstance=n(),o.appendChild(s),e.apps.set(t,{element:s,container:o,tagName:p}),console.log(`[WuLit] ✅ ${t} (<${p}>) mounted successfully`),u&&u(o,s)}catch(e){throw console.error(`[WuLit] Mount error for ${t}:`,e),e}}else console.error(`[WuLit] Mount failed for ${t}: container is null`)},m=n=>{const o=e.apps.get(t);if(o)try{c&&c(o.container,o.element),o.element&&o.element.parentNode&&o.element.remove(),o.container.innerHTML="",e.apps.delete(t),console.log(`[WuLit] ✅ ${t} unmounted successfully`)}catch(e){console.error(`[WuLit] Unmount error for ${t}:`,e)}n&&(n.innerHTML="")};try{return(await o(3e3)).define(t,{mount:w,unmount:m}),console.log(`[WuLit] ✅ ${t} registered with Wu Framework`),!0}catch(e){if(console.warn(`[WuLit] Wu Framework not available for ${t}`),l){const e=document.querySelector(d);if(e)return console.log(`[WuLit] Running ${t} in standalone mode`),w(e),!0}return!1}}async function r(t,e,n={}){return s(t,e,n)}function a(t,e,o){class s extends t{static properties={name:{type:String},url:{type:String},appName:{type:String,attribute:"app-name"},fallbackText:{type:String,attribute:"fallback-text"},loading:{type:Boolean,state:!0},error:{type:String,state:!0}};static styles=o?o`
1
+ function t(t){return class extends t{constructor(){super(),this._wuAINamespace="default"}get wuAI(){return("undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null)?.ai||null}async wuAISend(t,e={}){const n=this.wuAI;return n?n.send(t,{namespace:this._wuAINamespace,...e}):(console.warn("[WuAIMixin] wu.ai not available"),null)}wuAISetNamespace(t){this._wuAINamespace=t}}}const e={apps:new Map,elements:new Map,lit:null,initialized:!1};function n(){return"undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null}function o(t=5e3){return new Promise((e,o)=>{const s=n();if(s)return void e(s);const r=Date.now(),a=()=>{u(),e(n())};window.addEventListener("wu:ready",a),window.addEventListener("wu:app:ready",a);const i=setInterval(()=>{const s=n();if(s)return u(),void e(s);Date.now()-r>t&&(u(),o(new Error(`Wu Framework not found after ${t}ms`)))},200);function u(){clearInterval(i),window.removeEventListener("wu:ready",a),window.removeEventListener("wu:app:ready",a)}})}async function s(t,s,r={}){const{tagName:a=null,properties:i={},onMount:u=null,onUnmount:c=null,standalone:l=!0,standaloneContainer:d="#root"}=r,p=a||function(t){return t.includes("-")?`wu-${t}`:`wu-app-${t}`}(t);if(!customElements.get(p))try{customElements.define(p,s),console.log(`[WuLit] Custom element <${p}> defined`)}catch(t){throw console.error("[WuLit] Failed to define custom element:",t),t}e.elements.set(t,{ElementClass:s,tagName:p});const w=o=>{if(o){e.apps.has(t)&&(console.warn(`[WuLit] ${t} already mounted, unmounting first`),m());try{o.innerHTML="";const s=document.createElement(p);Object.entries(i).forEach(([t,e])=>{s[t]=e}),s.wuAppName=t,s.wuInstance=n(),o.appendChild(s),e.apps.set(t,{element:s,container:o,tagName:p}),console.log(`[WuLit] ✅ ${t} (<${p}>) mounted successfully`),u&&u(o,s)}catch(e){throw console.error(`[WuLit] Mount error for ${t}:`,e),e}}else console.error(`[WuLit] Mount failed for ${t}: container is null`)},m=n=>{const o=e.apps.get(t);if(o)try{c&&c(o.container,o.element),o.element&&o.element.parentNode&&o.element.remove(),o.container.innerHTML="",e.apps.delete(t),console.log(`[WuLit] ✅ ${t} unmounted successfully`)}catch(e){console.error(`[WuLit] Unmount error for ${t}:`,e)}n&&(n.innerHTML="")},h=(n,o)=>{const s=e.apps.get(t);s?.element&&o&&Object.entries(o).forEach(([t,e])=>{s.element[t]=e})};try{return(await o(3e3)).define(t,{mount:w,unmount:m,update:h}),console.log(`[WuLit] ✅ ${t} registered with Wu Framework`),!0}catch(e){if(console.warn(`[WuLit] Wu Framework not available for ${t}`),l){const e=document.querySelector(d);if(e)return console.log(`[WuLit] Running ${t} in standalone mode`),w(e),!0}return!1}}async function r(t,e,n={}){return s(t,e,n)}function a(t,e,o){class s extends t{static properties={name:{type:String},url:{type:String},appName:{type:String,attribute:"app-name"},fallbackText:{type:String,attribute:"fallback-text"},loading:{type:Boolean,state:!0},error:{type:String,state:!0}};static styles=o?o`
2
2
  :host {
3
3
  display: block;
4
4
  min-height: 100px;
@@ -40,5 +40,5 @@ function t(t){return class extends t{constructor(){super(),this._wuAINamespace="
40
40
  ${this.fallbackText||`Loading ${this.name}...`}
41
41
  </div>
42
42
  <div class="wu-slot-content"></div>
43
- `:e`<div class="wu-slot-content"></div>`}}return customElements.get("wu-slot")||customElements.define("wu-slot",s),s}function i(t){return class extends t{constructor(){super(),this._wuSubscriptions=[]}get wu(){return n()}wuEmit(t,e,n){const o=this.wu;o?.eventBus&&o.eventBus.emit(t,e,n)}wuOn(t,e){const n=this.wu;if(n?.eventBus){const o=n.eventBus.on(t,e);return this._wuSubscriptions.push(o),o}return()=>{}}wuOnce(t,e){const n=this.wu;return n?.eventBus?n.eventBus.once(t,e):()=>{}}wuGetState(t){const e=this.wu;return e?.store?.get(t)||null}wuSetState(t,e){const n=this.wu;n?.store&&n.store.set(t,e)}wuOnStateChange(t,e){const n=this.wu;if(n?.store){const o=n.store.on(t,e);return this._wuSubscriptions.push(o),o}return()=>{}}disconnectedCallback(){super.disconnectedCallback(),this._wuSubscriptions.forEach(t=>t()),this._wuSubscriptions=[]}}}function u(t){return function(e,o){const s=`_wu_${o}`;let r=null;Object.defineProperty(e,o,{get(){return this[s]},set(e){const o=n();o?.store&&o.store.set(t,e)},configurable:!0,enumerable:!0});const a=e.connectedCallback;e.connectedCallback=function(){a&&a.call(this);const e=n();e?.store&&(this[s]=e.store.get(t),r=e.store.on(t,t=>{this[s]=t,this.requestUpdate()}))};const i=e.disconnectedCallback;e.disconnectedCallback=function(){i&&i.call(this),r&&(r(),r=null)}}}function c(t){const{name:e,template:n,styles:o="",shadow:s=!0,...r}=t;class a extends HTMLElement{constructor(){super(),s&&this.attachShadow({mode:"open"})}connectedCallback(){const t=this.shadowRoot||this;if(o){const e=document.createElement("style");e.textContent=o,t.appendChild(e)}t.innerHTML+="function"==typeof n?n(this):n,r.connectedCallback&&r.connectedCallback.call(this)}disconnectedCallback(){r.disconnectedCallback&&r.disconnectedCallback.call(this)}attributeChangedCallback(t,e,n){r.attributeChangedCallback&&r.attributeChangedCallback.call(this,t,e,n)}}return r.observedAttributes&&(a.observedAttributes=r.observedAttributes),customElements.get(e)||customElements.define(e,a),a}const l={register:s,registerWebComponent:r,createWuSlotElement:a,WuMixin:i,WuAIMixin:t,wuProperty:u,createSimpleElement:c,getWuInstance:n,waitForWu:o};export{t as WuAIMixin,i as WuMixin,c as createSimpleElement,a as createWuSlotElement,l as default,n as getWuInstance,s as register,r as registerWebComponent,o as waitForWu,l as wuLit,u as wuProperty};
43
+ `:e`<div class="wu-slot-content"></div>`}}return customElements.get("wu-slot")||customElements.define("wu-slot",s),s}function i(t){return class extends t{constructor(){super(),this._wuSubscriptions=[]}get wu(){return n()}wuEmit(t,e,n){const o=this.wu;o?.eventBus&&o.eventBus.emit(t,e,n)}wuOn(t,e){const n=this.wu;if(n?.eventBus){const o=n.eventBus.on(t,e);return this._wuSubscriptions.push(o),o}return()=>{}}wuOnce(t,e){const n=this.wu;return n?.eventBus?n.eventBus.once(t,e):()=>{}}wuGetState(t){const e=this.wu;return e?.store?.get(t)||null}wuSetState(t,e){const n=this.wu;n?.store&&n.store.set(t,e)}wuOnStateChange(t,e){const n=this.wu;if(n?.store){const o=n.store.on(t,e);return this._wuSubscriptions.push(o),o}return()=>{}}disconnectedCallback(){super.disconnectedCallback(),this._wuSubscriptions.forEach(t=>t()),this._wuSubscriptions=[]}}}function u(t){return function(e,o){const s=`_wu_${o}`,r=`_wu_unsub_${o}`;Object.defineProperty(e,o,{get(){return this[s]},set(e){const o=n();o?.store&&o.store.set(t,e)},configurable:!0,enumerable:!0});const a=e.connectedCallback;e.connectedCallback=function(){a&&a.call(this);const e=n();e?.store&&(this[s]=e.store.get(t),this[r]=e.store.on(t,t=>{this[s]=t,this.requestUpdate()}))};const i=e.disconnectedCallback;e.disconnectedCallback=function(){i&&i.call(this),this[r]&&(this[r](),this[r]=null)}}}function c(t){const{name:e,template:n,styles:o="",shadow:s=!0,...r}=t;class a extends HTMLElement{constructor(){super(),s&&this.attachShadow({mode:"open"})}connectedCallback(){const t=this.shadowRoot||this;if(o){const e=document.createElement("style");e.textContent=o,t.appendChild(e)}t.innerHTML+="function"==typeof n?n(this):n,r.connectedCallback&&r.connectedCallback.call(this)}disconnectedCallback(){r.disconnectedCallback&&r.disconnectedCallback.call(this)}attributeChangedCallback(t,e,n){r.attributeChangedCallback&&r.attributeChangedCallback.call(this,t,e,n)}}return r.observedAttributes&&(a.observedAttributes=r.observedAttributes),customElements.get(e)||customElements.define(e,a),a}const l={register:s,registerWebComponent:r,createWuSlotElement:a,WuMixin:i,WuAIMixin:t,wuProperty:u,createSimpleElement:c,getWuInstance:n,waitForWu:o};export{t as WuAIMixin,i as WuMixin,c as createSimpleElement,a as createWuSlotElement,l as default,n as getWuInstance,s as register,r as registerWebComponent,o as waitForWu,l as wuLit,u as wuProperty};
44
44
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/adapters/lit/ai.js","../../../src/adapters/lit/index.js"],"sourcesContent":["/**\n * WU-FRAMEWORK LIT 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 WuAIMixin(Base) {\n return class extends Base {\n constructor() { super(); this._wuAINamespace = 'default'; }\n get wuAI() { return getWuInstance()?.ai || null; }\n async wuAISend(text, options = {}) {\n const ai = this.wuAI;\n if (!ai) { console.warn('[WuAIMixin] wu.ai not available'); return null; }\n return ai.send(text, { namespace: this._wuAINamespace, ...options });\n }\n wuAISetNamespace(ns) { this._wuAINamespace = ns; }\n };\n}\n","/**\n * 🚀 WU-FRAMEWORK LIT ADAPTER\n *\n * Simplifica la integración de Lit (Web Components) con Wu Framework.\n * Aprovecha los Web Components nativos con Shadow DOM incluido.\n *\n * @example\n * // Microfrontend (main.js)\n * import { wuLit } from 'wu-framework/adapters/lit';\n * import { MyApp } from './my-app';\n *\n * wuLit.register('my-app', MyApp);\n *\n * @example\n * // Usando LitElement\n * import { LitElement, html, css } from 'lit';\n *\n * class MyApp extends LitElement {\n * static styles = css`:host { display: block; }`;\n *\n * render() {\n * return html`<h1>Hello from Lit!</h1>`;\n * }\n * }\n *\n * wuLit.register('my-app', MyApp);\n */\n\n// Estado global del adapter\nconst adapterState = {\n apps: new Map(),\n elements: new Map(),\n lit: null,\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 * Genera un nombre de tag válido para Custom Elements\n */\nfunction generateTagName(appName) {\n // Custom elements deben tener un guión\n if (appName.includes('-')) {\n return `wu-${appName}`;\n }\n return `wu-app-${appName}`;\n}\n\n/**\n * Registra un LitElement como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend\n * @param {typeof LitElement} ElementClass - Clase que extiende LitElement\n * @param {Object} options - Opciones adicionales\n * @param {string} options.tagName - Nombre del custom element (auto-generado si no se provee)\n * @param {Object} options.properties - Propiedades iniciales\n * @param {Function} options.onMount - Callback después de montar\n * @param {Function} options.onUnmount - Callback antes de desmontar\n * @param {boolean} options.standalone - Permitir ejecución standalone (default: true)\n * @param {string} options.standaloneContainer - Selector para modo standalone (default: '#root')\n *\n * @example\n * import { LitElement, html } from 'lit';\n *\n * class HeaderApp extends LitElement {\n * render() {\n * return html`<header><h1>My Header</h1></header>`;\n * }\n * }\n *\n * wuLit.register('header', HeaderApp);\n */\nasync function register(appName, ElementClass, options = {}) {\n const {\n tagName = null,\n properties = {},\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#root'\n } = options;\n\n // Generar nombre de tag\n const customTagName = tagName || generateTagName(appName);\n\n // Registrar el Custom Element si no existe\n if (!customElements.get(customTagName)) {\n try {\n customElements.define(customTagName, ElementClass);\n console.log(`[WuLit] Custom element <${customTagName}> defined`);\n } catch (error) {\n console.error(`[WuLit] Failed to define custom element:`, error);\n throw error;\n }\n }\n\n // Guardar referencia de la clase\n adapterState.elements.set(appName, {\n ElementClass,\n tagName: customTagName\n });\n\n // Función de mount\n const mountApp = (container) => {\n if (!container) {\n console.error(`[WuLit] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Evitar doble mount\n if (adapterState.apps.has(appName)) {\n console.warn(`[WuLit] ${appName} already mounted, unmounting first`);\n unmountApp();\n }\n\n try {\n // Limpiar container\n container.innerHTML = '';\n\n // Crear elemento\n const element = document.createElement(customTagName);\n\n // Aplicar propiedades\n Object.entries(properties).forEach(([key, value]) => {\n element[key] = value;\n });\n\n // Inyectar información de Wu\n element.wuAppName = appName;\n element.wuInstance = getWuInstance();\n\n // Agregar al container\n container.appendChild(element);\n\n // Guardar referencia\n adapterState.apps.set(appName, {\n element,\n container,\n tagName: customTagName\n });\n\n console.log(`[WuLit] ✅ ${appName} (<${customTagName}>) mounted successfully`);\n\n if (onMount) {\n onMount(container, element);\n }\n } catch (error) {\n console.error(`[WuLit] 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.element);\n }\n\n // Remover elemento\n if (appData.element && appData.element.parentNode) {\n appData.element.remove();\n }\n\n // Limpiar container\n appData.container.innerHTML = '';\n\n adapterState.apps.delete(appName);\n\n console.log(`[WuLit] ✅ ${appName} unmounted successfully`);\n } catch (error) {\n console.error(`[WuLit] 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(`[WuLit] ✅ ${appName} registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuLit] Wu Framework not available for ${appName}`);\n\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n\n if (containerElement) {\n console.log(`[WuLit] Running ${appName} in standalone mode`);\n mountApp(containerElement);\n return true;\n }\n }\n\n return false;\n }\n}\n\n/**\n * Registra un Web Component vanilla (sin Lit) como microfrontend\n *\n * @param {string} appName - Nombre del microfrontend\n * @param {typeof HTMLElement} ElementClass - Clase que extiende HTMLElement\n * @param {Object} options - Opciones\n *\n * @example\n * class MyWebComponent extends HTMLElement {\n * connectedCallback() {\n * this.attachShadow({ mode: 'open' });\n * this.shadowRoot.innerHTML = '<h1>Hello!</h1>';\n * }\n * }\n *\n * wuLit.registerWebComponent('my-component', MyWebComponent);\n */\nasync function registerWebComponent(appName, ElementClass, options = {}) {\n // Usar el mismo registro pero para HTMLElement vanilla\n return register(appName, ElementClass, options);\n}\n\n/**\n * Crea un LitElement wrapper que carga un microfrontend\n *\n * @example\n * import { html, LitElement } from 'lit';\n * import { createWuSlotElement } from 'wu-framework/adapters/lit';\n *\n * const WuSlot = createWuSlotElement(LitElement, html);\n *\n * // Uso en otro componente\n * render() {\n * return html`<wu-slot name=\"header\" url=\"http://localhost:3001\"></wu-slot>`;\n * }\n */\nfunction createWuSlotElement(LitElement, html, css) {\n class WuSlotElement extends LitElement {\n static properties = {\n name: { type: String },\n url: { type: String },\n appName: { type: String, attribute: 'app-name' },\n fallbackText: { type: String, attribute: 'fallback-text' },\n loading: { type: Boolean, state: true },\n error: { type: String, state: true }\n };\n\n static styles = css ? css`\n :host {\n display: block;\n min-height: 100px;\n position: relative;\n }\n\n .wu-slot-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n color: #666;\n }\n\n .wu-slot-error {\n padding: 1rem;\n border: 1px solid #f5c6cb;\n border-radius: 4px;\n background: #f8d7da;\n color: #721c24;\n }\n\n .wu-slot-error strong {\n display: block;\n margin-bottom: 0.5rem;\n }\n\n .wu-slot-content {\n width: 100%;\n height: 100%;\n }\n ` : [];\n\n constructor() {\n super();\n this.name = '';\n this.url = '';\n this.appName = null;\n this.fallbackText = null;\n this.loading = true;\n this.error = null;\n this._appInstance = null;\n }\n\n get actualAppName() {\n return this.appName || this.name;\n }\n\n async connectedCallback() {\n super.connectedCallback();\n await this.mountMicrofrontend();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.unmountMicrofrontend();\n }\n\n async mountMicrofrontend() {\n try {\n this.loading = true;\n this.error = null;\n\n const wu = getWuInstance();\n if (!wu) {\n throw new Error('Wu Framework not initialized');\n }\n\n // Esperar a que el componente se renderice\n await this.updateComplete;\n\n const contentSlot = this.shadowRoot.querySelector('.wu-slot-content');\n if (!contentSlot) return;\n\n const containerId = `wu-slot-${this.actualAppName}-${Date.now()}`;\n const innerContainer = document.createElement('div');\n innerContainer.id = containerId;\n innerContainer.style.cssText = 'width: 100%; height: 100%;';\n\n contentSlot.innerHTML = '';\n contentSlot.appendChild(innerContainer);\n\n const app = wu.app(this.actualAppName, {\n url: this.url,\n container: `#${containerId}`,\n autoInit: true\n });\n\n this._appInstance = app;\n await app.mount();\n\n this.loading = false;\n this.dispatchEvent(new CustomEvent('wu-load', {\n detail: { name: this.actualAppName, url: this.url },\n bubbles: true,\n composed: true\n }));\n\n } catch (err) {\n console.error(`[WuSlot] Error loading ${this.actualAppName}:`, err);\n this.error = err.message || 'Failed to load microfrontend';\n this.loading = false;\n this.dispatchEvent(new CustomEvent('wu-error', {\n detail: err,\n bubbles: true,\n composed: true\n }));\n }\n }\n\n async unmountMicrofrontend() {\n if (this._appInstance) {\n this.dispatchEvent(new CustomEvent('wu-unmount', {\n detail: { name: this.actualAppName },\n bubbles: true,\n composed: true\n }));\n\n try {\n await this._appInstance.unmount();\n } catch (e) {}\n\n this._appInstance = null;\n }\n }\n\n render() {\n if (this.error) {\n return html`\n <div class=\"wu-slot-error\">\n <strong>Error loading ${this.name}</strong>\n <span>${this.error}</span>\n </div>\n `;\n }\n\n if (this.loading) {\n return html`\n <div class=\"wu-slot-loading\">\n ${this.fallbackText || `Loading ${this.name}...`}\n </div>\n <div class=\"wu-slot-content\"></div>\n `;\n }\n\n return html`<div class=\"wu-slot-content\"></div>`;\n }\n }\n\n // Registrar el elemento\n if (!customElements.get('wu-slot')) {\n customElements.define('wu-slot', WuSlotElement);\n }\n\n return WuSlotElement;\n}\n\n/**\n * Mixin para agregar capacidades de Wu a cualquier LitElement\n *\n * @example\n * import { LitElement } from 'lit';\n * import { WuMixin } from 'wu-framework/adapters/lit';\n *\n * class MyElement extends WuMixin(LitElement) {\n * connectedCallback() {\n * super.connectedCallback();\n *\n * // Usar eventos de Wu\n * this.wuOn('user:login', (data) => {\n * console.log('User logged in:', data);\n * });\n * }\n *\n * handleClick() {\n * this.wuEmit('button:clicked', { id: this.id });\n * }\n * }\n */\nfunction WuMixin(Base) {\n return class extends Base {\n constructor() {\n super();\n this._wuSubscriptions = [];\n }\n\n get wu() {\n return getWuInstance();\n }\n\n // Event Bus methods\n wuEmit(event, data, options) {\n const wu = this.wu;\n if (wu?.eventBus) {\n wu.eventBus.emit(event, data, options);\n }\n }\n\n wuOn(event, callback) {\n const wu = this.wu;\n if (wu?.eventBus) {\n const unsubscribe = wu.eventBus.on(event, callback);\n this._wuSubscriptions.push(unsubscribe);\n return unsubscribe;\n }\n return () => {};\n }\n\n wuOnce(event, callback) {\n const wu = this.wu;\n if (wu?.eventBus) {\n return wu.eventBus.once(event, callback);\n }\n return () => {};\n }\n\n // Store methods\n wuGetState(path) {\n const wu = this.wu;\n return wu?.store?.get(path) || null;\n }\n\n wuSetState(path, value) {\n const wu = this.wu;\n if (wu?.store) {\n wu.store.set(path, value);\n }\n }\n\n wuOnStateChange(pattern, callback) {\n const wu = this.wu;\n if (wu?.store) {\n const unsubscribe = wu.store.on(pattern, callback);\n this._wuSubscriptions.push(unsubscribe);\n return unsubscribe;\n }\n return () => {};\n }\n\n // Cleanup\n disconnectedCallback() {\n super.disconnectedCallback();\n this._wuSubscriptions.forEach(unsub => unsub());\n this._wuSubscriptions = [];\n }\n };\n}\n\n/**\n * Decorador reactivo para propiedades conectadas al store de Wu\n *\n * @example\n * import { LitElement } from 'lit';\n * import { wuProperty } from 'wu-framework/adapters/lit';\n *\n * class MyElement extends LitElement {\n * @wuProperty('user.name')\n * userName;\n *\n * render() {\n * return html`<p>Hello, ${this.userName}</p>`;\n * }\n * }\n */\nfunction wuProperty(storePath) {\n return function(target, propertyKey) {\n const privateKey = `_wu_${propertyKey}`;\n let unsubscribe = null;\n\n Object.defineProperty(target, propertyKey, {\n get() {\n return this[privateKey];\n },\n set(value) {\n const wu = getWuInstance();\n if (wu?.store) {\n wu.store.set(storePath, value);\n }\n },\n configurable: true,\n enumerable: true\n });\n\n // Hook into connectedCallback\n const originalConnected = target.connectedCallback;\n target.connectedCallback = function() {\n if (originalConnected) originalConnected.call(this);\n\n const wu = getWuInstance();\n if (wu?.store) {\n // Set initial value\n this[privateKey] = wu.store.get(storePath);\n\n // Subscribe to changes\n unsubscribe = wu.store.on(storePath, (value) => {\n this[privateKey] = value;\n this.requestUpdate();\n });\n }\n };\n\n // Hook into disconnectedCallback\n const originalDisconnected = target.disconnectedCallback;\n target.disconnectedCallback = function() {\n if (originalDisconnected) originalDisconnected.call(this);\n if (unsubscribe) {\n unsubscribe();\n unsubscribe = null;\n }\n };\n };\n}\n\n/**\n * Helper para crear un Web Component simple sin Lit\n *\n * @example\n * const MyComponent = createSimpleElement({\n * name: 'my-component',\n * template: '<h1>Hello!</h1>',\n * styles: ':host { display: block; color: blue; }',\n * connectedCallback() {\n * console.log('Connected!');\n * }\n * });\n */\nfunction createSimpleElement(config) {\n const {\n name,\n template,\n styles = '',\n shadow = true,\n ...callbacks\n } = config;\n\n class SimpleElement extends HTMLElement {\n constructor() {\n super();\n if (shadow) {\n this.attachShadow({ mode: 'open' });\n }\n }\n\n connectedCallback() {\n const root = this.shadowRoot || this;\n\n if (styles) {\n const styleEl = document.createElement('style');\n styleEl.textContent = styles;\n root.appendChild(styleEl);\n }\n\n if (typeof template === 'function') {\n root.innerHTML += template(this);\n } else {\n root.innerHTML += template;\n }\n\n if (callbacks.connectedCallback) {\n callbacks.connectedCallback.call(this);\n }\n }\n\n disconnectedCallback() {\n if (callbacks.disconnectedCallback) {\n callbacks.disconnectedCallback.call(this);\n }\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (callbacks.attributeChangedCallback) {\n callbacks.attributeChangedCallback.call(this, name, oldVal, newVal);\n }\n }\n }\n\n if (callbacks.observedAttributes) {\n SimpleElement.observedAttributes = callbacks.observedAttributes;\n }\n\n if (!customElements.get(name)) {\n customElements.define(name, SimpleElement);\n }\n\n return SimpleElement;\n}\n\n// ============================================\n// AI INTEGRATION\n// ============================================\nimport { WuAIMixin } from './ai.js';\n\n// API pública del adapter\nexport const wuLit = {\n register,\n registerWebComponent,\n createWuSlotElement,\n WuMixin,\n WuAIMixin,\n wuProperty,\n createSimpleElement,\n getWuInstance,\n waitForWu\n};\n\nexport {\n register,\n registerWebComponent,\n createWuSlotElement,\n WuMixin,\n WuAIMixin,\n wuProperty,\n createSimpleElement,\n getWuInstance,\n waitForWu\n};\n\nexport default wuLit;\n"],"names":["WuAIMixin","Base","constructor","super","this","_wuAINamespace","wuAI","window","wu","parent","top","ai","wuAISend","text","options","send","namespace","console","warn","wuAISetNamespace","ns","adapterState","apps","Map","elements","lit","initialized","getWuInstance","waitForWu","timeout","Promise","resolve","reject","startTime","Date","now","handleWuReady","cleanup","addEventListener","checkInterval","setInterval","Error","clearInterval","removeEventListener","async","register","appName","ElementClass","tagName","properties","onMount","onUnmount","standalone","standaloneContainer","customTagName","includes","generateTagName","customElements","get","define","log","error","set","mountApp","container","has","unmountApp","innerHTML","element","document","createElement","Object","entries","forEach","key","value","wuAppName","wuInstance","appendChild","appData","parentNode","remove","delete","mount","unmount","containerElement","querySelector","registerWebComponent","createWuSlotElement","LitElement","html","css","WuSlotElement","static","name","type","String","url","attribute","fallbackText","loading","Boolean","state","_appInstance","actualAppName","connectedCallback","mountMicrofrontend","disconnectedCallback","unmountMicrofrontend","updateComplete","contentSlot","shadowRoot","containerId","innerContainer","id","style","cssText","app","autoInit","dispatchEvent","CustomEvent","detail","bubbles","composed","err","message","e","render","WuMixin","_wuSubscriptions","wuEmit","event","data","eventBus","emit","wuOn","callback","unsubscribe","on","push","wuOnce","once","wuGetState","path","store","wuSetState","wuOnStateChange","pattern","unsub","wuProperty","storePath","target","propertyKey","privateKey","defineProperty","configurable","enumerable","originalConnected","call","requestUpdate","originalDisconnected","createSimpleElement","config","template","styles","shadow","callbacks","SimpleElement","HTMLElement","attachShadow","mode","root","styleEl","textContent","attributeChangedCallback","oldVal","newVal","observedAttributes","wuLit"],"mappings":"AAQO,SAASA,EAAUC,GACxB,OAAO,cAAcA,EACnB,WAAAC,GAAgBC,QAASC,KAAKC,eAAiB,SAAW,CAC1D,QAAIC,GAAS,OAPO,oBAAXC,OAA+B,KACnCA,OAAOC,IAAMD,OAAOE,QAAQD,IAAMD,OAAOG,KAAKF,IAAM,OAMpBG,IAAM,IAAM,CACjD,cAAMC,CAASC,EAAMC,EAAU,IAC7B,MAAMH,EAAKP,KAAKE,KAChB,OAAKK,EACEA,EAAGI,KAAKF,EAAM,CAAEG,UAAWZ,KAAKC,kBAAmBS,KAD/CG,QAAQC,KAAK,mCAA2C,KAErE,CACA,gBAAAC,CAAiBC,GAAMhB,KAAKC,eAAiBe,CAAI,EAErD,CCUA,MAAMC,EAAe,CACnBC,KAAM,IAAIC,IACVC,SAAU,IAAID,IACdE,IAAK,KACLC,aAAa,GAMf,SAASC,IACP,MAAsB,oBAAXpB,OAA+B,KAEnCA,OAAOC,IACTD,OAAOE,QAAQD,IACfD,OAAOG,KAAKF,IACZ,IACP,CAKA,SAASoB,EAAUC,EAAU,KAC3B,OAAO,IAAIC,QAAQ,CAACC,EAASC,KAC3B,MAAMxB,EAAKmB,IACX,GAAInB,EAEF,YADAuB,EAAQvB,GAIV,MAAMyB,EAAYC,KAAKC,MAEjBC,EAAgB,KACpBC,IACAN,EAAQJ,MAGVpB,OAAO+B,iBAAiB,WAAYF,GACpC7B,OAAO+B,iBAAiB,eAAgBF,GAExC,MAAMG,EAAgBC,YAAY,KAChC,MAAMhC,EAAKmB,IACX,GAAInB,EAGF,OAFA6B,SACAN,EAAQvB,GAIN0B,KAAKC,MAAQF,EAAYJ,IAC3BQ,IACAL,EAAO,IAAIS,MAAM,gCAAgCZ,UAElD,KAEH,SAASQ,IACPK,cAAcH,GACdhC,OAAOoC,oBAAoB,WAAYP,GACvC7B,OAAOoC,oBAAoB,eAAgBP,EAC7C,GAEJ,CAqCAQ,eAAeC,EAASC,EAASC,EAAcjC,EAAU,CAAA,GACvD,MAAMkC,QACJA,EAAU,KAAIC,WACdA,EAAa,CAAA,EAAEC,QACfA,EAAU,KAAIC,UACdA,EAAY,KAAIC,WAChBA,GAAa,EAAIC,oBACjBA,EAAsB,SACpBvC,EAGEwC,EAAgBN,GA3CxB,SAAyBF,GAEvB,OAAIA,EAAQS,SAAS,KACZ,MAAMT,IAER,UAAUA,GACnB,CAqCmCU,CAAgBV,GAGjD,IAAKW,eAAeC,IAAIJ,GACtB,IACEG,eAAeE,OAAOL,EAAeP,GACrC9B,QAAQ2C,IAAI,2BAA2BN,aACzC,CAAE,MAAOO,GAEP,MADA5C,QAAQ4C,MAAM,2CAA4CA,GACpDA,CACR,CAIFxC,EAAaG,SAASsC,IAAIhB,EAAS,CACjCC,eACAC,QAASM,IAIX,MAAMS,EAAYC,IAChB,GAAKA,EAAL,CAMI3C,EAAaC,KAAK2C,IAAInB,KACxB7B,QAAQC,KAAK,WAAW4B,uCACxBoB,KAGF,IAEEF,EAAUG,UAAY,GAGtB,MAAMC,EAAUC,SAASC,cAAchB,GAGvCiB,OAAOC,QAAQvB,GAAYwB,QAAQ,EAAEC,EAAKC,MACxCP,EAAQM,GAAOC,IAIjBP,EAAQQ,UAAY9B,EACpBsB,EAAQS,WAAalD,IAGrBqC,EAAUc,YAAYV,GAGtB/C,EAAaC,KAAKwC,IAAIhB,EAAS,CAC7BsB,UACAJ,YACAhB,QAASM,IAGXrC,QAAQ2C,IAAI,aAAad,OAAaQ,4BAElCJ,GACFA,EAAQc,EAAWI,EAEvB,CAAE,MAAOP,GAEP,MADA5C,QAAQ4C,MAAM,2BAA2Bf,KAAYe,GAC/CA,CACR,CA1CA,MAFE5C,QAAQ4C,MAAM,4BAA4Bf,yBAgDxCoB,EAAcF,IAClB,MAAMe,EAAU1D,EAAaC,KAAKoC,IAAIZ,GAEtC,GAAIiC,EACF,IACM5B,GACFA,EAAU4B,EAAQf,UAAWe,EAAQX,SAInCW,EAAQX,SAAWW,EAAQX,QAAQY,YACrCD,EAAQX,QAAQa,SAIlBF,EAAQf,UAAUG,UAAY,GAE9B9C,EAAaC,KAAK4D,OAAOpC,GAEzB7B,QAAQ2C,IAAI,aAAad,2BAC3B,CAAE,MAAOe,GACP5C,QAAQ4C,MAAM,6BAA6Bf,KAAYe,EACzD,CAGEG,IACFA,EAAUG,UAAY,KAK1B,IASE,aARiBvC,EAAU,MAExB+B,OAAOb,EAAS,CACjBqC,MAAOpB,EACPqB,QAASlB,IAGXjD,QAAQ2C,IAAI,aAAad,mCAClB,CAET,CAAE,MAAOe,GAGP,GAFA5C,QAAQC,KAAK,0CAA0C4B,KAEnDM,EAAY,CACd,MAAMiC,EAAmBhB,SAASiB,cAAcjC,GAEhD,GAAIgC,EAGF,OAFApE,QAAQ2C,IAAI,mBAAmBd,wBAC/BiB,EAASsB,IACF,CAEX,CAEA,OAAO,CACT,CACF,CAmBAzC,eAAe2C,EAAqBzC,EAASC,EAAcjC,EAAU,CAAA,GAEnE,OAAO+B,EAASC,EAASC,EAAcjC,EACzC,CAgBA,SAAS0E,EAAoBC,EAAYC,EAAMC,GAC7C,MAAMC,UAAsBH,EAC1BI,kBAAoB,CAClBC,KAAM,CAAEC,KAAMC,QACdC,IAAK,CAAEF,KAAMC,QACblD,QAAS,CAAEiD,KAAMC,OAAQE,UAAW,YACpCC,aAAc,CAAEJ,KAAMC,OAAQE,UAAW,iBACzCE,QAAS,CAAEL,KAAMM,QAASC,OAAO,GACjCzC,MAAO,CAAEkC,KAAMC,OAAQM,OAAO,IAGhCT,cAAgBF,EAAMA,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAgCrB,GAEJ,WAAAzF,GACEC,QACAC,KAAK0F,KAAO,GACZ1F,KAAK6F,IAAM,GACX7F,KAAK0C,QAAU,KACf1C,KAAK+F,aAAe,KACpB/F,KAAKgG,SAAU,EACfhG,KAAKyD,MAAQ,KACbzD,KAAKmG,aAAe,IACtB,CAEA,iBAAIC,GACF,OAAOpG,KAAK0C,SAAW1C,KAAK0F,IAC9B,CAEA,uBAAMW,GACJtG,MAAMsG,0BACArG,KAAKsG,oBACb,CAEA,oBAAAC,GACExG,MAAMwG,uBACNvG,KAAKwG,sBACP,CAEA,wBAAMF,GACJ,IACEtG,KAAKgG,SAAU,EACfhG,KAAKyD,MAAQ,KAEb,MAAMrD,EAAKmB,IACX,IAAKnB,EACH,MAAM,IAAIiC,MAAM,sCAIZrC,KAAKyG,eAEX,MAAMC,EAAc1G,KAAK2G,WAAWzB,cAAc,oBAClD,IAAKwB,EAAa,OAElB,MAAME,EAAc,WAAW5G,KAAKoG,iBAAiBtE,KAAKC,QACpD8E,EAAiB5C,SAASC,cAAc,OAC9C2C,EAAeC,GAAKF,EACpBC,EAAeE,MAAMC,QAAU,6BAE/BN,EAAY3C,UAAY,GACxB2C,EAAYhC,YAAYmC,GAExB,MAAMI,EAAM7G,EAAG6G,IAAIjH,KAAKoG,cAAe,CACrCP,IAAK7F,KAAK6F,IACVjC,UAAW,IAAIgD,IACfM,UAAU,IAGZlH,KAAKmG,aAAec,QACdA,EAAIlC,QAEV/E,KAAKgG,SAAU,EACfhG,KAAKmH,cAAc,IAAIC,YAAY,UAAW,CAC5CC,OAAQ,CAAE3B,KAAM1F,KAAKoG,cAAeP,IAAK7F,KAAK6F,KAC9CyB,SAAS,EACTC,UAAU,IAGd,CAAE,MAAOC,GACP3G,QAAQ4C,MAAM,0BAA0BzD,KAAKoG,iBAAkBoB,GAC/DxH,KAAKyD,MAAQ+D,EAAIC,SAAW,+BAC5BzH,KAAKgG,SAAU,EACfhG,KAAKmH,cAAc,IAAIC,YAAY,WAAY,CAC7CC,OAAQG,EACRF,SAAS,EACTC,UAAU,IAEd,CACF,CAEA,0BAAMf,GACJ,GAAIxG,KAAKmG,aAAc,CACrBnG,KAAKmH,cAAc,IAAIC,YAAY,aAAc,CAC/CC,OAAQ,CAAE3B,KAAM1F,KAAKoG,eACrBkB,SAAS,EACTC,UAAU,KAGZ,UACQvH,KAAKmG,aAAanB,SAC1B,CAAE,MAAO0C,GAAI,CAEb1H,KAAKmG,aAAe,IACtB,CACF,CAEA,MAAAwB,GACE,OAAI3H,KAAKyD,MACA6B,CAAI;;oCAEiBtF,KAAK0F;oBACrB1F,KAAKyD;;UAKfzD,KAAKgG,QACAV,CAAI;;cAELtF,KAAK+F,cAAgB,WAAW/F,KAAK0F;;;UAMtCJ,CAAI,qCACb,EAQF,OAJKjC,eAAeC,IAAI,YACtBD,eAAeE,OAAO,UAAWiC,GAG5BA,CACT,CAwBA,SAASoC,EAAQ/H,GACf,OAAO,cAAcA,EACnB,WAAAC,GACEC,QACAC,KAAK6H,iBAAmB,EAC1B,CAEA,MAAIzH,GACF,OAAOmB,GACT,CAGA,MAAAuG,CAAOC,EAAOC,EAAMtH,GAClB,MAAMN,EAAKJ,KAAKI,GACZA,GAAI6H,UACN7H,EAAG6H,SAASC,KAAKH,EAAOC,EAAMtH,EAElC,CAEA,IAAAyH,CAAKJ,EAAOK,GACV,MAAMhI,EAAKJ,KAAKI,GAChB,GAAIA,GAAI6H,SAAU,CAChB,MAAMI,EAAcjI,EAAG6H,SAASK,GAAGP,EAAOK,GAE1C,OADApI,KAAK6H,iBAAiBU,KAAKF,GACpBA,CACT,CACA,MAAO,MACT,CAEA,MAAAG,CAAOT,EAAOK,GACZ,MAAMhI,EAAKJ,KAAKI,GAChB,OAAIA,GAAI6H,SACC7H,EAAG6H,SAASQ,KAAKV,EAAOK,GAE1B,MACT,CAGA,UAAAM,CAAWC,GACT,MAAMvI,EAAKJ,KAAKI,GAChB,OAAOA,GAAIwI,OAAOtF,IAAIqF,IAAS,IACjC,CAEA,UAAAE,CAAWF,EAAMpE,GACf,MAAMnE,EAAKJ,KAAKI,GACZA,GAAIwI,OACNxI,EAAGwI,MAAMlF,IAAIiF,EAAMpE,EAEvB,CAEA,eAAAuE,CAAgBC,EAASX,GACvB,MAAMhI,EAAKJ,KAAKI,GAChB,GAAIA,GAAIwI,MAAO,CACb,MAAMP,EAAcjI,EAAGwI,MAAMN,GAAGS,EAASX,GAEzC,OADApI,KAAK6H,iBAAiBU,KAAKF,GACpBA,CACT,CACA,MAAO,MACT,CAGA,oBAAA9B,GACExG,MAAMwG,uBACNvG,KAAK6H,iBAAiBxD,QAAQ2E,GAASA,KACvChJ,KAAK6H,iBAAmB,EAC1B,EAEJ,CAkBA,SAASoB,EAAWC,GAClB,OAAO,SAASC,EAAQC,GACtB,MAAMC,EAAa,OAAOD,IAC1B,IAAIf,EAAc,KAElBlE,OAAOmF,eAAeH,EAAQC,EAAa,CACzC,GAAA9F,GACE,OAAOtD,KAAKqJ,EACd,EACA,GAAA3F,CAAIa,GACF,MAAMnE,EAAKmB,IACPnB,GAAIwI,OACNxI,EAAGwI,MAAMlF,IAAIwF,EAAW3E,EAE5B,EACAgF,cAAc,EACdC,YAAY,IAId,MAAMC,EAAoBN,EAAO9C,kBACjC8C,EAAO9C,kBAAoB,WACrBoD,GAAmBA,EAAkBC,KAAK1J,MAE9C,MAAMI,EAAKmB,IACPnB,GAAIwI,QAEN5I,KAAKqJ,GAAcjJ,EAAGwI,MAAMtF,IAAI4F,GAGhCb,EAAcjI,EAAGwI,MAAMN,GAAGY,EAAY3E,IACpCvE,KAAKqJ,GAAc9E,EACnBvE,KAAK2J,kBAGX,EAGA,MAAMC,EAAuBT,EAAO5C,qBACpC4C,EAAO5C,qBAAuB,WACxBqD,GAAsBA,EAAqBF,KAAK1J,MAChDqI,IACFA,IACAA,EAAc,KAElB,CACF,CACF,CAeA,SAASwB,EAAoBC,GAC3B,MAAMpE,KACJA,EAAIqE,SACJA,EAAQC,OACRA,EAAS,GAAEC,OACXA,GAAS,KACNC,GACDJ,EAEJ,MAAMK,UAAsBC,YAC1B,WAAAtK,GACEC,QACIkK,GACFjK,KAAKqK,aAAa,CAAEC,KAAM,QAE9B,CAEA,iBAAAjE,GACE,MAAMkE,EAAOvK,KAAK2G,YAAc3G,KAEhC,GAAIgK,EAAQ,CACV,MAAMQ,EAAUvG,SAASC,cAAc,SACvCsG,EAAQC,YAAcT,EACtBO,EAAK7F,YAAY8F,EACnB,CAGED,EAAKxG,WADiB,mBAAbgG,EACSA,EAAS/J,MAET+J,EAGhBG,EAAU7D,mBACZ6D,EAAU7D,kBAAkBqD,KAAK1J,KAErC,CAEA,oBAAAuG,GACM2D,EAAU3D,sBACZ2D,EAAU3D,qBAAqBmD,KAAK1J,KAExC,CAEA,wBAAA0K,CAAyBhF,EAAMiF,EAAQC,GACjCV,EAAUQ,0BACZR,EAAUQ,yBAAyBhB,KAAK1J,KAAM0F,EAAMiF,EAAQC,EAEhE,EAWF,OARIV,EAAUW,qBACZV,EAAcU,mBAAqBX,EAAUW,oBAG1CxH,eAAeC,IAAIoC,IACtBrC,eAAeE,OAAOmC,EAAMyE,GAGvBA,CACT,CAQY,MAACW,EAAQ,CACnBrI,WACA0C,uBACAC,sBACAwC,UACAhI,YACAqJ,aACAY,sBACAtI,gBACAC"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/adapters/lit/ai.js","../../../src/adapters/lit/index.js"],"sourcesContent":["/**\n * WU-FRAMEWORK LIT 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 WuAIMixin(Base) {\n return class extends Base {\n constructor() { super(); this._wuAINamespace = 'default'; }\n get wuAI() { return getWuInstance()?.ai || null; }\n async wuAISend(text, options = {}) {\n const ai = this.wuAI;\n if (!ai) { console.warn('[WuAIMixin] wu.ai not available'); return null; }\n return ai.send(text, { namespace: this._wuAINamespace, ...options });\n }\n wuAISetNamespace(ns) { this._wuAINamespace = ns; }\n };\n}\n","/**\n * 🚀 WU-FRAMEWORK LIT ADAPTER\n *\n * Simplifica la integración de Lit (Web Components) con Wu Framework.\n * Aprovecha los Web Components nativos con Shadow DOM incluido.\n *\n * @example\n * // Microfrontend (main.js)\n * import { wuLit } from 'wu-framework/adapters/lit';\n * import { MyApp } from './my-app';\n *\n * wuLit.register('my-app', MyApp);\n *\n * @example\n * // Usando LitElement\n * import { LitElement, html, css } from 'lit';\n *\n * class MyApp extends LitElement {\n * static styles = css`:host { display: block; }`;\n *\n * render() {\n * return html`<h1>Hello from Lit!</h1>`;\n * }\n * }\n *\n * wuLit.register('my-app', MyApp);\n */\n\n// Estado global del adapter\nconst adapterState = {\n apps: new Map(),\n elements: new Map(),\n lit: null,\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 * Genera un nombre de tag válido para Custom Elements\n */\nfunction generateTagName(appName) {\n // Custom elements deben tener un guión\n if (appName.includes('-')) {\n return `wu-${appName}`;\n }\n return `wu-app-${appName}`;\n}\n\n/**\n * Registra un LitElement como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend\n * @param {typeof LitElement} ElementClass - Clase que extiende LitElement\n * @param {Object} options - Opciones adicionales\n * @param {string} options.tagName - Nombre del custom element (auto-generado si no se provee)\n * @param {Object} options.properties - Propiedades iniciales\n * @param {Function} options.onMount - Callback después de montar\n * @param {Function} options.onUnmount - Callback antes de desmontar\n * @param {boolean} options.standalone - Permitir ejecución standalone (default: true)\n * @param {string} options.standaloneContainer - Selector para modo standalone (default: '#root')\n *\n * @example\n * import { LitElement, html } from 'lit';\n *\n * class HeaderApp extends LitElement {\n * render() {\n * return html`<header><h1>My Header</h1></header>`;\n * }\n * }\n *\n * wuLit.register('header', HeaderApp);\n */\nasync function register(appName, ElementClass, options = {}) {\n const {\n tagName = null,\n properties = {},\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#root'\n } = options;\n\n // Generar nombre de tag\n const customTagName = tagName || generateTagName(appName);\n\n // Registrar el Custom Element si no existe\n if (!customElements.get(customTagName)) {\n try {\n customElements.define(customTagName, ElementClass);\n console.log(`[WuLit] Custom element <${customTagName}> defined`);\n } catch (error) {\n console.error(`[WuLit] Failed to define custom element:`, error);\n throw error;\n }\n }\n\n // Guardar referencia de la clase\n adapterState.elements.set(appName, {\n ElementClass,\n tagName: customTagName\n });\n\n // Función de mount\n const mountApp = (container) => {\n if (!container) {\n console.error(`[WuLit] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Evitar doble mount\n if (adapterState.apps.has(appName)) {\n console.warn(`[WuLit] ${appName} already mounted, unmounting first`);\n unmountApp();\n }\n\n try {\n // Limpiar container\n container.innerHTML = '';\n\n // Crear elemento\n const element = document.createElement(customTagName);\n\n // Aplicar propiedades\n Object.entries(properties).forEach(([key, value]) => {\n element[key] = value;\n });\n\n // Inyectar información de Wu\n element.wuAppName = appName;\n element.wuInstance = getWuInstance();\n\n // Agregar al container\n container.appendChild(element);\n\n // Guardar referencia\n adapterState.apps.set(appName, {\n element,\n container,\n tagName: customTagName\n });\n\n console.log(`[WuLit] ✅ ${appName} (<${customTagName}>) mounted successfully`);\n\n if (onMount) {\n onMount(container, element);\n }\n } catch (error) {\n console.error(`[WuLit] 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.element);\n }\n\n // Remover elemento\n if (appData.element && appData.element.parentNode) {\n appData.element.remove();\n }\n\n // Limpiar container\n appData.container.innerHTML = '';\n\n adapterState.apps.delete(appName);\n\n console.log(`[WuLit] ✅ ${appName} unmounted successfully`);\n } catch (error) {\n console.error(`[WuLit] Unmount error for ${appName}:`, error);\n }\n }\n\n if (container) {\n container.innerHTML = '';\n }\n };\n\n // Canal de props vivo: asignar propiedades reactivas al elemento Lit\n // dispara su re-render — sin recrear el elemento.\n const updateApp = (_container, nextProps) => {\n const appData = adapterState.apps.get(appName);\n if (appData?.element && nextProps) {\n Object.entries(nextProps).forEach(([key, value]) => {\n appData.element[key] = value;\n });\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 update: updateApp\n });\n\n console.log(`[WuLit] ✅ ${appName} registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuLit] Wu Framework not available for ${appName}`);\n\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n\n if (containerElement) {\n console.log(`[WuLit] Running ${appName} in standalone mode`);\n mountApp(containerElement);\n return true;\n }\n }\n\n return false;\n }\n}\n\n/**\n * Registra un Web Component vanilla (sin Lit) como microfrontend\n *\n * @param {string} appName - Nombre del microfrontend\n * @param {typeof HTMLElement} ElementClass - Clase que extiende HTMLElement\n * @param {Object} options - Opciones\n *\n * @example\n * class MyWebComponent extends HTMLElement {\n * connectedCallback() {\n * this.attachShadow({ mode: 'open' });\n * this.shadowRoot.innerHTML = '<h1>Hello!</h1>';\n * }\n * }\n *\n * wuLit.registerWebComponent('my-component', MyWebComponent);\n */\nasync function registerWebComponent(appName, ElementClass, options = {}) {\n // Usar el mismo registro pero para HTMLElement vanilla\n return register(appName, ElementClass, options);\n}\n\n/**\n * Crea un LitElement wrapper que carga un microfrontend\n *\n * @example\n * import { html, LitElement } from 'lit';\n * import { createWuSlotElement } from 'wu-framework/adapters/lit';\n *\n * const WuSlot = createWuSlotElement(LitElement, html);\n *\n * // Uso en otro componente\n * render() {\n * return html`<wu-slot name=\"header\" url=\"http://localhost:3001\"></wu-slot>`;\n * }\n */\nfunction createWuSlotElement(LitElement, html, css) {\n class WuSlotElement extends LitElement {\n static properties = {\n name: { type: String },\n url: { type: String },\n appName: { type: String, attribute: 'app-name' },\n fallbackText: { type: String, attribute: 'fallback-text' },\n loading: { type: Boolean, state: true },\n error: { type: String, state: true }\n };\n\n static styles = css ? css`\n :host {\n display: block;\n min-height: 100px;\n position: relative;\n }\n\n .wu-slot-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n color: #666;\n }\n\n .wu-slot-error {\n padding: 1rem;\n border: 1px solid #f5c6cb;\n border-radius: 4px;\n background: #f8d7da;\n color: #721c24;\n }\n\n .wu-slot-error strong {\n display: block;\n margin-bottom: 0.5rem;\n }\n\n .wu-slot-content {\n width: 100%;\n height: 100%;\n }\n ` : [];\n\n constructor() {\n super();\n this.name = '';\n this.url = '';\n this.appName = null;\n this.fallbackText = null;\n this.loading = true;\n this.error = null;\n this._appInstance = null;\n }\n\n get actualAppName() {\n return this.appName || this.name;\n }\n\n async connectedCallback() {\n super.connectedCallback();\n await this.mountMicrofrontend();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.unmountMicrofrontend();\n }\n\n async mountMicrofrontend() {\n try {\n this.loading = true;\n this.error = null;\n\n const wu = getWuInstance();\n if (!wu) {\n throw new Error('Wu Framework not initialized');\n }\n\n // Esperar a que el componente se renderice\n await this.updateComplete;\n\n const contentSlot = this.shadowRoot.querySelector('.wu-slot-content');\n if (!contentSlot) return;\n\n const containerId = `wu-slot-${this.actualAppName}-${Date.now()}`;\n const innerContainer = document.createElement('div');\n innerContainer.id = containerId;\n innerContainer.style.cssText = 'width: 100%; height: 100%;';\n\n contentSlot.innerHTML = '';\n contentSlot.appendChild(innerContainer);\n\n const app = wu.app(this.actualAppName, {\n url: this.url,\n container: `#${containerId}`,\n autoInit: true\n });\n\n this._appInstance = app;\n await app.mount();\n\n this.loading = false;\n this.dispatchEvent(new CustomEvent('wu-load', {\n detail: { name: this.actualAppName, url: this.url },\n bubbles: true,\n composed: true\n }));\n\n } catch (err) {\n console.error(`[WuSlot] Error loading ${this.actualAppName}:`, err);\n this.error = err.message || 'Failed to load microfrontend';\n this.loading = false;\n this.dispatchEvent(new CustomEvent('wu-error', {\n detail: err,\n bubbles: true,\n composed: true\n }));\n }\n }\n\n async unmountMicrofrontend() {\n if (this._appInstance) {\n this.dispatchEvent(new CustomEvent('wu-unmount', {\n detail: { name: this.actualAppName },\n bubbles: true,\n composed: true\n }));\n\n try {\n await this._appInstance.unmount();\n } catch (e) {}\n\n this._appInstance = null;\n }\n }\n\n render() {\n if (this.error) {\n return html`\n <div class=\"wu-slot-error\">\n <strong>Error loading ${this.name}</strong>\n <span>${this.error}</span>\n </div>\n `;\n }\n\n if (this.loading) {\n return html`\n <div class=\"wu-slot-loading\">\n ${this.fallbackText || `Loading ${this.name}...`}\n </div>\n <div class=\"wu-slot-content\"></div>\n `;\n }\n\n return html`<div class=\"wu-slot-content\"></div>`;\n }\n }\n\n // Registrar el elemento\n if (!customElements.get('wu-slot')) {\n customElements.define('wu-slot', WuSlotElement);\n }\n\n return WuSlotElement;\n}\n\n/**\n * Mixin para agregar capacidades de Wu a cualquier LitElement\n *\n * @example\n * import { LitElement } from 'lit';\n * import { WuMixin } from 'wu-framework/adapters/lit';\n *\n * class MyElement extends WuMixin(LitElement) {\n * connectedCallback() {\n * super.connectedCallback();\n *\n * // Usar eventos de Wu\n * this.wuOn('user:login', (data) => {\n * console.log('User logged in:', data);\n * });\n * }\n *\n * handleClick() {\n * this.wuEmit('button:clicked', { id: this.id });\n * }\n * }\n */\nfunction WuMixin(Base) {\n return class extends Base {\n constructor() {\n super();\n this._wuSubscriptions = [];\n }\n\n get wu() {\n return getWuInstance();\n }\n\n // Event Bus methods\n wuEmit(event, data, options) {\n const wu = this.wu;\n if (wu?.eventBus) {\n wu.eventBus.emit(event, data, options);\n }\n }\n\n wuOn(event, callback) {\n const wu = this.wu;\n if (wu?.eventBus) {\n const unsubscribe = wu.eventBus.on(event, callback);\n this._wuSubscriptions.push(unsubscribe);\n return unsubscribe;\n }\n return () => {};\n }\n\n wuOnce(event, callback) {\n const wu = this.wu;\n if (wu?.eventBus) {\n return wu.eventBus.once(event, callback);\n }\n return () => {};\n }\n\n // Store methods\n wuGetState(path) {\n const wu = this.wu;\n return wu?.store?.get(path) || null;\n }\n\n wuSetState(path, value) {\n const wu = this.wu;\n if (wu?.store) {\n wu.store.set(path, value);\n }\n }\n\n wuOnStateChange(pattern, callback) {\n const wu = this.wu;\n if (wu?.store) {\n const unsubscribe = wu.store.on(pattern, callback);\n this._wuSubscriptions.push(unsubscribe);\n return unsubscribe;\n }\n return () => {};\n }\n\n // Cleanup\n disconnectedCallback() {\n super.disconnectedCallback();\n this._wuSubscriptions.forEach(unsub => unsub());\n this._wuSubscriptions = [];\n }\n };\n}\n\n/**\n * Decorador reactivo para propiedades conectadas al store de Wu\n *\n * @example\n * import { LitElement } from 'lit';\n * import { wuProperty } from 'wu-framework/adapters/lit';\n *\n * class MyElement extends LitElement {\n * @wuProperty('user.name')\n * userName;\n *\n * render() {\n * return html`<p>Hello, ${this.userName}</p>`;\n * }\n * }\n */\nfunction wuProperty(storePath) {\n return function(target, propertyKey) {\n const privateKey = `_wu_${propertyKey}`;\n const unsubKey = `_wu_unsub_${propertyKey}`;\n\n Object.defineProperty(target, propertyKey, {\n get() {\n return this[privateKey];\n },\n set(value) {\n const wu = getWuInstance();\n if (wu?.store) {\n wu.store.set(storePath, value);\n }\n },\n configurable: true,\n enumerable: true\n });\n\n // Hook into connectedCallback\n const originalConnected = target.connectedCallback;\n target.connectedCallback = function() {\n if (originalConnected) originalConnected.call(this);\n\n const wu = getWuInstance();\n if (wu?.store) {\n // Set initial value\n this[privateKey] = wu.store.get(storePath);\n\n // Subscribe to changes (handle stored per instance)\n this[unsubKey] = wu.store.on(storePath, (value) => {\n this[privateKey] = value;\n this.requestUpdate();\n });\n }\n };\n\n // Hook into disconnectedCallback\n const originalDisconnected = target.disconnectedCallback;\n target.disconnectedCallback = function() {\n if (originalDisconnected) originalDisconnected.call(this);\n if (this[unsubKey]) {\n this[unsubKey]();\n this[unsubKey] = null;\n }\n };\n };\n}\n\n/**\n * Helper para crear un Web Component simple sin Lit\n *\n * @example\n * const MyComponent = createSimpleElement({\n * name: 'my-component',\n * template: '<h1>Hello!</h1>',\n * styles: ':host { display: block; color: blue; }',\n * connectedCallback() {\n * console.log('Connected!');\n * }\n * });\n */\nfunction createSimpleElement(config) {\n const {\n name,\n template,\n styles = '',\n shadow = true,\n ...callbacks\n } = config;\n\n class SimpleElement extends HTMLElement {\n constructor() {\n super();\n if (shadow) {\n this.attachShadow({ mode: 'open' });\n }\n }\n\n connectedCallback() {\n const root = this.shadowRoot || this;\n\n if (styles) {\n const styleEl = document.createElement('style');\n styleEl.textContent = styles;\n root.appendChild(styleEl);\n }\n\n if (typeof template === 'function') {\n root.innerHTML += template(this);\n } else {\n root.innerHTML += template;\n }\n\n if (callbacks.connectedCallback) {\n callbacks.connectedCallback.call(this);\n }\n }\n\n disconnectedCallback() {\n if (callbacks.disconnectedCallback) {\n callbacks.disconnectedCallback.call(this);\n }\n }\n\n attributeChangedCallback(name, oldVal, newVal) {\n if (callbacks.attributeChangedCallback) {\n callbacks.attributeChangedCallback.call(this, name, oldVal, newVal);\n }\n }\n }\n\n if (callbacks.observedAttributes) {\n SimpleElement.observedAttributes = callbacks.observedAttributes;\n }\n\n if (!customElements.get(name)) {\n customElements.define(name, SimpleElement);\n }\n\n return SimpleElement;\n}\n\n// ============================================\n// AI INTEGRATION\n// ============================================\nimport { WuAIMixin } from './ai.js';\n\n// API pública del adapter\nexport const wuLit = {\n register,\n registerWebComponent,\n createWuSlotElement,\n WuMixin,\n WuAIMixin,\n wuProperty,\n createSimpleElement,\n getWuInstance,\n waitForWu\n};\n\nexport {\n register,\n registerWebComponent,\n createWuSlotElement,\n WuMixin,\n WuAIMixin,\n wuProperty,\n createSimpleElement,\n getWuInstance,\n waitForWu\n};\n\nexport default wuLit;\n"],"names":["WuAIMixin","Base","constructor","super","this","_wuAINamespace","wuAI","window","wu","parent","top","ai","wuAISend","text","options","send","namespace","console","warn","wuAISetNamespace","ns","adapterState","apps","Map","elements","lit","initialized","getWuInstance","waitForWu","timeout","Promise","resolve","reject","startTime","Date","now","handleWuReady","cleanup","addEventListener","checkInterval","setInterval","Error","clearInterval","removeEventListener","async","register","appName","ElementClass","tagName","properties","onMount","onUnmount","standalone","standaloneContainer","customTagName","includes","generateTagName","customElements","get","define","log","error","set","mountApp","container","has","unmountApp","innerHTML","element","document","createElement","Object","entries","forEach","key","value","wuAppName","wuInstance","appendChild","appData","parentNode","remove","delete","updateApp","_container","nextProps","mount","unmount","update","containerElement","querySelector","registerWebComponent","createWuSlotElement","LitElement","html","css","WuSlotElement","static","name","type","String","url","attribute","fallbackText","loading","Boolean","state","_appInstance","actualAppName","connectedCallback","mountMicrofrontend","disconnectedCallback","unmountMicrofrontend","updateComplete","contentSlot","shadowRoot","containerId","innerContainer","id","style","cssText","app","autoInit","dispatchEvent","CustomEvent","detail","bubbles","composed","err","message","e","render","WuMixin","_wuSubscriptions","wuEmit","event","data","eventBus","emit","wuOn","callback","unsubscribe","on","push","wuOnce","once","wuGetState","path","store","wuSetState","wuOnStateChange","pattern","unsub","wuProperty","storePath","target","propertyKey","privateKey","unsubKey","defineProperty","configurable","enumerable","originalConnected","call","requestUpdate","originalDisconnected","createSimpleElement","config","template","styles","shadow","callbacks","SimpleElement","HTMLElement","attachShadow","mode","root","styleEl","textContent","attributeChangedCallback","oldVal","newVal","observedAttributes","wuLit"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * 🚀 WU-FRAMEWORK PREACT 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
  // Preact types (generics to avoid hard dependency)
8
8
  type ComponentType<P = {}> = (props: P) => any;
@@ -1,2 +1,2 @@
1
- function e(e){const{useState:n,useCallback:t}=e;return function(e={}){const{namespace:r="default"}=e,[o,a]=n([]),[u,c]=n(!1),[s,l]=n(null);return{messages:o,isStreaming:u,error:s,send:t(async e=>{if(!e?.trim())return;const n="undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null;if(n?.ai){a(n=>[...n,{id:`user-${Date.now()}`,role:"user",content:e,timestamp:Date.now()}]),c(!0),l(null);try{const t=await n.ai.send(e,{namespace:r});a(e=>[...e,{id:`assistant-${Date.now()}`,role:"assistant",content:t.content,timestamp:Date.now()}])}catch(e){l(e.message||"AI request failed")}c(!1)}else l("Wu AI not available")},[r]),clear:t(()=>{a([]),l(null)},[])}}}const n={apps:new Map,preact:null,render:null,h:null,initialized:!1};function t(){return"undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null}function r(e=5e3){return new Promise((n,r)=>{const o=t();if(o)return void n(o);const a=Date.now(),u=()=>{s(),n(t())};window.addEventListener("wu:ready",u),window.addEventListener("wu:app:ready",u);const c=setInterval(()=>{const o=t();if(o)return s(),void n(o);Date.now()-a>e&&(s(),r(new Error(`Wu Framework not found after ${e}ms`)))},200);function s(){clearInterval(c),window.removeEventListener("wu:ready",u),window.removeEventListener("wu:app:ready",u)}})}async function o(e,o,a={}){const{props:u={},onMount:c=null,onUnmount:s=null,standalone:l=!0,standaloneContainer:i="#app"}=a;if(!await async function(){if(n.initialized)return!0;try{if("undefined"!=typeof window&&window.preact)return n.preact=window.preact,n.render=window.preact.render,n.h=window.preact.h,n.initialized=!0,!0;const e=await import("preact");return n.preact=e,n.render=e.render,n.h=e.h,n.initialized=!0,!0}catch(e){return console.error("[WuPreact] Failed to load Preact:",e),!1}}())return console.error(`[WuPreact] Cannot register ${e}: Preact not available`),!1;const{render:d,h:w}=n,p=r=>{if(r){n.apps.has(e)&&(console.warn(`[WuPreact] ${e} already mounted, unmounting first`),f());try{r.innerHTML="",d(w(o,{...u,wuAppName:e,wuInstance:t()}),r),n.apps.set(e,{container:r,Component:o}),console.log(`[WuPreact] ✅ ${e} mounted successfully`),c&&c(r)}catch(n){throw console.error(`[WuPreact] Mount error for ${e}:`,n),n}}else console.error(`[WuPreact] Mount failed for ${e}: container is null`)},f=t=>{const r=n.apps.get(e);if(r)try{s&&s(r.container),d(null,r.container),n.apps.delete(e),console.log(`[WuPreact] ✅ ${e} unmounted successfully`)}catch(n){console.error(`[WuPreact] Unmount error for ${e}:`,n)}t&&(t.innerHTML="")};try{return(await r(3e3)).define(e,{mount:p,unmount:f}),console.log(`[WuPreact] ✅ ${e} registered with Wu Framework`),!0}catch(n){if(console.warn(`[WuPreact] Wu Framework not available for ${e}`),l){const n=document.querySelector(i);if(n)return console.log(`[WuPreact] Running ${e} in standalone mode`),p(n),!0}return!1}}async function a(e,a,u={}){const{props:c={},onMount:s=null,onUnmount:l=null,standalone:i=!0,standaloneContainer:d="#app"}=u;let w,p;try{const e=await import("preact/compat");w=e.render,p=e.createElement}catch(n){return console.error("[WuPreact] preact/compat not available"),o(e,a,u)}const f=r=>{if(r){n.apps.has(e)&&m();try{r.innerHTML="",w(p(a,{...c,wuAppName:e,wuInstance:t()}),r),n.apps.set(e,{container:r,Component:a,isCompat:!0}),console.log(`[WuPreact] ✅ ${e} (compat) mounted successfully`),s&&s(r)}catch(n){throw console.error(`[WuPreact] Mount error for ${e}:`,n),n}}},m=t=>{const r=n.apps.get(e);if(r)try{l&&l(r.container),w(null,r.container),n.apps.delete(e),console.log(`[WuPreact] ✅ ${e} (compat) unmounted successfully`)}catch(n){console.error(`[WuPreact] Unmount error for ${e}:`,n)}t&&(t.innerHTML="")};try{return(await r(3e3)).define(e,{mount:f,unmount:m}),console.log(`[WuPreact] ✅ ${e} (compat) registered with Wu Framework`),!0}catch(e){if(i){const e=document.querySelector(d);if(e)return f(e),!0}return!1}}function u(e){let n,r,o,a;try{const e=require("preact/hooks");n=e.useState,r=e.useEffect,o=e.useRef,a=e.useCallback}catch(n){return function(n){const{name:r,url:o}=n;return e("div",{class:"wu-slot","data-wu-app":r,"data-wu-url":o,style:"min-height: 100px;",ref:e=>{e&&!e._mounted&&(e._mounted=!0,async function(e,n,r){try{const o=t();if(!o)return;const a=`wu-slot-${n}-${Date.now()}`,u=document.createElement("div");u.id=a,u.style.cssText="width: 100%; height: 100%;",e.innerHTML="",e.appendChild(u);const c=o.app(n,{url:r,container:`#${a}`,autoInit:!0});await c.mount()}catch(n){e.innerHTML=`<div style="color: red;">Error: ${n.message}</div>`}}(e,r,o))}},`Loading ${r}...`)}}return function(u){const{name:c,url:s,appName:l=null,fallback:i=null,onLoad:d=null,onError:w=null,className:p="",style:f={}}=u,m=o(null),y=o(null),[g,h]=n(!0),[$,v]=n(null),W=l||c,P=a(async()=>{if(m.current)try{h(!0),v(null);const e=t();if(!e)throw new Error("Wu Framework not initialized");const n=`wu-slot-${W}-${Date.now()}`,r=document.createElement("div");r.id=n,r.style.cssText="width: 100%; height: 100%;",m.current.innerHTML="",m.current.appendChild(r);const o=e.app(W,{url:s,container:`#${n}`,autoInit:!0});y.current=o,await o.mount(),h(!1),d&&d({name:W,url:s})}catch(e){console.error(`[WuSlot] Error loading ${W}:`,e),v(e.message||"Failed to load microfrontend"),h(!1),w&&w(e)}},[W,s,d,w]);return r(()=>(P(),()=>{y.current&&(y.current.unmount().catch(console.warn),y.current=null)}),[P]),$?e("div",{class:`wu-slot wu-slot-error ${p}`,style:{padding:"1rem",border:"1px solid #f5c6cb",borderRadius:"4px",backgroundColor:"#f8d7da",color:"#721c24",...f}},[e("strong",null,`Error loading ${c}`),e("p",{style:{margin:"0.5rem 0 0 0"}},$)]):e("div",{ref:m,class:`wu-slot ${g?"wu-slot-loading":"wu-slot-loaded"} ${p}`,style:{minHeight:"100px",position:"relative",...f},"data-wu-app":W,"data-wu-url":s},g&&(i||e("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"2rem",color:"#666"}},`Loading ${c}...`)))}}function c(e){const{useCallback:n,useEffect:r,useRef:o}=e;return function(){const e=o([]),a=n((e,n,r)=>{const o=t();o?.eventBus&&o.eventBus.emit(e,n,r)},[]),u=n((n,r)=>{const o=t();if(o?.eventBus){const t=o.eventBus.on(n,r);return e.current.push(t),t}return()=>{}},[]),c=n((e,n)=>{const r=t();return r?.eventBus?r.eventBus.once(e,n):()=>{}},[]);return r(()=>()=>{e.current.forEach(e=>e()),e.current=[]},[]),{emit:a,on:u,once:c}}}function s(e){const{useState:n,useCallback:r,useEffect:o}=e;return function(e=""){const[a,u]=n(()=>{const n=t();return n?.store?.get(e)||null}),c=r((n,r)=>{const o=t();if(o?.store){const t=e?`${e}.${n}`:n;o.store.set(t,r)}},[e]),s=r((n="")=>{const r=t();if(r?.store){const t=e?n?`${e}.${n}`:e:n;return r.store.get(t)}return null},[e]);return o(()=>{const n=t();if(!n?.store)return;const r=e?`${e}.*`:"*";return n.store.on(r,()=>{u(n.store.get(e))})},[e]),{state:a,setState:c,getState:s}}}const l={register:o,registerCompat:a,createWuSlot:u,createUseWuEvents:c,createUseWuStore:s,createUseWuAI:e,getWuInstance:t,waitForWu:r};export{e as createUseWuAI,c as createUseWuEvents,s as createUseWuStore,u as createWuSlot,l as default,t as getWuInstance,o as register,a as registerCompat,r as waitForWu,l as wuPreact};
1
+ function e(e){const{useState:n,useCallback:t}=e;return function(e={}){const{namespace:r="default"}=e,[o,a]=n([]),[u,c]=n(!1),[s,l]=n(null);return{messages:o,isStreaming:u,error:s,send:t(async e=>{if(!e?.trim())return;const n="undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null;if(n?.ai){a(n=>[...n,{id:`user-${Date.now()}`,role:"user",content:e,timestamp:Date.now()}]),c(!0),l(null);try{const t=await n.ai.send(e,{namespace:r});a(e=>[...e,{id:`assistant-${Date.now()}`,role:"assistant",content:t.content,timestamp:Date.now()}])}catch(e){l(e.message||"AI request failed")}c(!1)}else l("Wu AI not available")},[r]),clear:t(()=>{a([]),l(null)},[])}}}const n={apps:new Map,preact:null,render:null,h:null,initialized:!1};function t(){return"undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null}function r(e=5e3){return new Promise((n,r)=>{const o=t();if(o)return void n(o);const a=Date.now(),u=()=>{s(),n(t())};window.addEventListener("wu:ready",u),window.addEventListener("wu:app:ready",u);const c=setInterval(()=>{const o=t();if(o)return s(),void n(o);Date.now()-a>e&&(s(),r(new Error(`Wu Framework not found after ${e}ms`)))},200);function s(){clearInterval(c),window.removeEventListener("wu:ready",u),window.removeEventListener("wu:app:ready",u)}})}async function o(e,o,a={}){const{props:u={},onMount:c=null,onUnmount:s=null,standalone:l=!0,standaloneContainer:i="#app"}=a;if(!await async function(){if(n.initialized)return!0;try{if("undefined"!=typeof window&&window.preact)return n.preact=window.preact,n.render=window.preact.render,n.h=window.preact.h,n.initialized=!0,!0;const e=await import("preact");return n.preact=e,n.render=e.render,n.h=e.h,n.initialized=!0,!0}catch(e){return console.error("[WuPreact] Failed to load Preact:",e),!1}}())return console.error(`[WuPreact] Cannot register ${e}: Preact not available`),!1;const{render:d,h:p}=n,w={...u};let f={...u};const m=n=>{d(p(o,{...f,wuAppName:e,wuInstance:t()}),n)},y=t=>{if(t){n.apps.has(e)&&(console.warn(`[WuPreact] ${e} already mounted, unmounting first`),h());try{t.innerHTML="",m(t),n.apps.set(e,{container:t,Component:o}),console.log(`[WuPreact] ✅ ${e} mounted successfully`),c&&c(t)}catch(n){throw console.error(`[WuPreact] Mount error for ${e}:`,n),n}}else console.error(`[WuPreact] Mount failed for ${e}: container is null`)},g=(t,r)=>{f={...f,...r||{}};const o=n.apps.get(e);o&&m(o.container)},h=t=>{const r=n.apps.get(e);if(r)try{s&&s(r.container),d(null,r.container),n.apps.delete(e),f={...w},console.log(`[WuPreact] ✅ ${e} unmounted successfully`)}catch(n){console.error(`[WuPreact] Unmount error for ${e}:`,n)}t&&(t.innerHTML="")};try{return(await r(3e3)).define(e,{mount:y,unmount:h,update:g}),console.log(`[WuPreact] ✅ ${e} registered with Wu Framework`),!0}catch(n){if(console.warn(`[WuPreact] Wu Framework not available for ${e}`),l){const n=document.querySelector(i);if(n)return console.log(`[WuPreact] Running ${e} in standalone mode`),y(n),!0}return!1}}async function a(e,a,u={}){const{props:c={},onMount:s=null,onUnmount:l=null,standalone:i=!0,standaloneContainer:d="#app"}=u;let p,w;try{const e=await import("preact/compat");p=e.render,w=e.createElement}catch(n){return console.error("[WuPreact] preact/compat not available"),o(e,a,u)}const f=r=>{if(r){n.apps.has(e)&&m();try{r.innerHTML="",p(w(a,{...c,wuAppName:e,wuInstance:t()}),r),n.apps.set(e,{container:r,Component:a,isCompat:!0}),console.log(`[WuPreact] ✅ ${e} (compat) mounted successfully`),s&&s(r)}catch(n){throw console.error(`[WuPreact] Mount error for ${e}:`,n),n}}},m=t=>{const r=n.apps.get(e);if(r)try{l&&l(r.container),p(null,r.container),n.apps.delete(e),console.log(`[WuPreact] ✅ ${e} (compat) unmounted successfully`)}catch(n){console.error(`[WuPreact] Unmount error for ${e}:`,n)}t&&(t.innerHTML="")};try{return(await r(3e3)).define(e,{mount:f,unmount:m}),console.log(`[WuPreact] ✅ ${e} (compat) registered with Wu Framework`),!0}catch(e){if(i){const e=document.querySelector(d);if(e)return f(e),!0}return!1}}function u(e){let n,r,o,a;try{const e=require("preact/hooks");n=e.useState,r=e.useEffect,o=e.useRef,a=e.useCallback}catch(n){return function(n){const{name:r,url:o}=n;return e("div",{class:"wu-slot","data-wu-app":r,"data-wu-url":o,style:"min-height: 100px;",ref:e=>{e&&!e._mounted&&(e._mounted=!0,async function(e,n,r){try{const o=t();if(!o)return;const a=`wu-slot-${n}-${Date.now()}`,u=document.createElement("div");u.id=a,u.style.cssText="width: 100%; height: 100%;",e.innerHTML="",e.appendChild(u);const c=o.app(n,{url:r,container:`#${a}`,autoInit:!0});await c.mount()}catch(n){e.innerHTML=`<div style="color: red;">Error: ${n.message}</div>`}}(e,r,o))}},`Loading ${r}...`)}}return function(u){const{name:c,url:s,appName:l=null,fallback:i=null,onLoad:d=null,onError:p=null,className:w="",style:f={}}=u,m=o(null),y=o(null),[g,h]=n(!0),[$,v]=n(null),W=l||c,P=a(async()=>{if(m.current)try{h(!0),v(null);const e=t();if(!e)throw new Error("Wu Framework not initialized");const n=`wu-slot-${W}-${Date.now()}`,r=document.createElement("div");r.id=n,r.style.cssText="width: 100%; height: 100%;",m.current.innerHTML="",m.current.appendChild(r);const o=e.app(W,{url:s,container:`#${n}`,autoInit:!0});y.current=o,await o.mount(),h(!1),d&&d({name:W,url:s})}catch(e){console.error(`[WuSlot] Error loading ${W}:`,e),v(e.message||"Failed to load microfrontend"),h(!1),p&&p(e)}},[W,s,d,p]);return r(()=>(P(),()=>{y.current&&(y.current.unmount().catch(console.warn),y.current=null)}),[P]),$?e("div",{class:`wu-slot wu-slot-error ${w}`,style:{padding:"1rem",border:"1px solid #f5c6cb",borderRadius:"4px",backgroundColor:"#f8d7da",color:"#721c24",...f}},[e("strong",null,`Error loading ${c}`),e("p",{style:{margin:"0.5rem 0 0 0"}},$)]):e("div",{ref:m,class:`wu-slot ${g?"wu-slot-loading":"wu-slot-loaded"} ${w}`,style:{minHeight:"100px",position:"relative",...f},"data-wu-app":W,"data-wu-url":s},g&&(i||e("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"2rem",color:"#666"}},`Loading ${c}...`)))}}function c(e){const{useCallback:n,useEffect:r,useRef:o}=e;return function(){const e=o([]),a=n((e,n,r)=>{const o=t();o?.eventBus&&o.eventBus.emit(e,n,r)},[]),u=n((n,r)=>{const o=t();if(o?.eventBus){const t=o.eventBus.on(n,r);return e.current.push(t),t}return()=>{}},[]),c=n((e,n)=>{const r=t();return r?.eventBus?r.eventBus.once(e,n):()=>{}},[]);return r(()=>()=>{e.current.forEach(e=>e()),e.current=[]},[]),{emit:a,on:u,once:c}}}function s(e){const{useState:n,useCallback:r,useEffect:o}=e;return function(e=""){const[a,u]=n(()=>{const n=t();return n?.store?.get(e)||null}),c=r((n,r)=>{const o=t();if(o?.store){const t=e?`${e}.${n}`:n;o.store.set(t,r)}},[e]),s=r((n="")=>{const r=t();if(r?.store){const t=e?n?`${e}.${n}`:e:n;return r.store.get(t)}return null},[e]);return o(()=>{const n=t();if(!n?.store)return;const r=e?`${e}.*`:"*";return n.store.on(r,()=>{u(n.store.get(e))})},[e]),{state:a,setState:c,getState:s}}}const l={register:o,registerCompat:a,createWuSlot:u,createUseWuEvents:c,createUseWuStore:s,createUseWuAI:e,getWuInstance:t,waitForWu:r};export{e as createUseWuAI,c as createUseWuEvents,s as createUseWuStore,u as createWuSlot,l as default,t as getWuInstance,o as register,a as registerCompat,r as waitForWu,l as wuPreact};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/adapters/preact/ai.js","../../../src/adapters/preact/index.js"],"sourcesContent":["/**\n * WU-FRAMEWORK PREACT AI INTEGRATION\n */\nfunction getWuInstance() {\n if (typeof window === 'undefined') return null;\n return window.wu || window.parent?.wu || window.top?.wu || null;\n}\n\nexport function createUseWuAI(hooks) {\n const { useState, useCallback } = hooks;\n return function useWuAI(options = {}) {\n const { namespace = 'default' } = options;\n const [messages, setMessages] = useState([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState(null);\n\n const send = useCallback(async (text) => {\n if (!text?.trim()) return;\n const wu = getWuInstance();\n if (!wu?.ai) { setError('Wu AI not available'); return; }\n setMessages(prev => [...prev, { id: `user-${Date.now()}`, role: 'user', content: text, timestamp: Date.now() }]);\n setIsStreaming(true); setError(null);\n try {\n const res = await wu.ai.send(text, { namespace });\n setMessages(prev => [...prev, { id: `assistant-${Date.now()}`, role: 'assistant', content: res.content, timestamp: Date.now() }]);\n } catch (err) { setError(err.message || 'AI request failed'); }\n setIsStreaming(false);\n }, [namespace]);\n\n const clear = useCallback(() => { setMessages([]); setError(null); }, []);\n return { messages, isStreaming, error, send, clear };\n };\n}\n","/**\n * 🚀 WU-FRAMEWORK PREACT ADAPTER\n *\n * Simplifica la integración de Preact con Wu Framework.\n * Compatible con Preact 10+ y preact/compat para proyectos React migrados.\n *\n * @example\n * // Microfrontend (main.jsx)\n * import { wuPreact } from 'wu-framework/adapters/preact';\n * import App from './App';\n *\n * wuPreact.register('my-app', App);\n *\n * @example\n * // Shell (cargar microfrontend)\n * import { createWuSlot } from 'wu-framework/adapters/preact';\n * import { h } from 'preact';\n *\n * const WuSlot = createWuSlot(h);\n * <WuSlot name=\"my-app\" url=\"http://localhost:3001\" />\n */\n\n// Estado global del adapter\nconst adapterState = {\n apps: new Map(),\n preact: null,\n render: null,\n h: null,\n initialized: false\n};\n\n/**\n * Detecta y obtiene Preact del contexto global o lo importa\n */\nasync function ensurePreact() {\n if (adapterState.initialized) return true;\n\n try {\n // Intentar obtener de window\n if (typeof window !== 'undefined' && window.preact) {\n adapterState.preact = window.preact;\n adapterState.render = window.preact.render;\n adapterState.h = window.preact.h;\n adapterState.initialized = true;\n return true;\n }\n\n // Intentar import dinámico\n const preact = await import('preact');\n adapterState.preact = preact;\n adapterState.render = preact.render;\n adapterState.h = preact.h;\n adapterState.initialized = true;\n return true;\n\n } catch (error) {\n console.error('[WuPreact] Failed to load Preact:', error);\n return false;\n }\n}\n\n/**\n * Obtiene la instancia de Wu Framework\n */\nfunction getWuInstance() {\n if (typeof window === 'undefined') return null;\n\n return window.wu\n || window.parent?.wu\n || window.top?.wu\n || null;\n}\n\n/**\n * Espera a que Wu Framework esté disponible\n */\nfunction waitForWu(timeout = 5000) {\n return new Promise((resolve, reject) => {\n const wu = getWuInstance();\n if (wu) {\n resolve(wu);\n return;\n }\n\n const startTime = Date.now();\n\n const handleWuReady = () => {\n cleanup();\n resolve(getWuInstance());\n };\n\n window.addEventListener('wu:ready', handleWuReady);\n window.addEventListener('wu:app:ready', handleWuReady);\n\n const checkInterval = setInterval(() => {\n const wu = getWuInstance();\n if (wu) {\n cleanup();\n resolve(wu);\n return;\n }\n\n if (Date.now() - startTime > timeout) {\n cleanup();\n reject(new Error(`Wu Framework not found after ${timeout}ms`));\n }\n }, 200);\n\n function cleanup() {\n clearInterval(checkInterval);\n window.removeEventListener('wu:ready', handleWuReady);\n window.removeEventListener('wu:app:ready', handleWuReady);\n }\n });\n}\n\n/**\n * Registra un componente Preact como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend\n * @param {Function} Component - Componente Preact principal\n * @param {Object} options - Opciones adicionales\n * @param {Object} options.props - Props iniciales para el componente\n * @param {Function} options.onMount - Callback después de montar\n * @param {Function} options.onUnmount - Callback antes de desmontar\n * @param {boolean} options.standalone - Permitir ejecución standalone (default: true)\n * @param {string} options.standaloneContainer - Selector para modo standalone (default: '#app')\n *\n * @example\n * // Básico\n * wuPreact.register('my-app', App);\n *\n * @example\n * // Con props\n * wuPreact.register('my-app', App, {\n * props: { apiUrl: 'https://api.example.com' },\n * onMount: (container) => console.log('Mounted!')\n * });\n */\nasync function register(appName, Component, options = {}) {\n const {\n props = {},\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#app'\n } = options;\n\n // Asegurar que Preact está disponible\n const hasPreact = await ensurePreact();\n if (!hasPreact) {\n console.error(`[WuPreact] Cannot register ${appName}: Preact not available`);\n return false;\n }\n\n const { render, h } = adapterState;\n\n // Función de mount interna\n const mountApp = (container) => {\n if (!container) {\n console.error(`[WuPreact] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Evitar doble mount\n if (adapterState.apps.has(appName)) {\n console.warn(`[WuPreact] ${appName} already mounted, unmounting first`);\n unmountApp();\n }\n\n try {\n // Limpiar container\n container.innerHTML = '';\n\n // Renderizar componente\n render(\n h(Component, {\n ...props,\n wuAppName: appName,\n wuInstance: getWuInstance()\n }),\n container\n );\n\n // Guardar referencia\n adapterState.apps.set(appName, { container, Component });\n\n console.log(`[WuPreact] ✅ ${appName} mounted successfully`);\n\n if (onMount) {\n onMount(container);\n }\n } catch (error) {\n console.error(`[WuPreact] Mount error for ${appName}:`, error);\n throw error;\n }\n };\n\n // Función de unmount interna\n const unmountApp = (container) => {\n const appData = adapterState.apps.get(appName);\n\n if (appData) {\n try {\n if (onUnmount) {\n onUnmount(appData.container);\n }\n\n // Unmount en Preact: renderizar null\n render(null, appData.container);\n\n adapterState.apps.delete(appName);\n\n console.log(`[WuPreact] ✅ ${appName} unmounted successfully`);\n } catch (error) {\n console.error(`[WuPreact] 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(`[WuPreact] ✅ ${appName} registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuPreact] Wu Framework not available for ${appName}`);\n\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n\n if (containerElement) {\n console.log(`[WuPreact] Running ${appName} in standalone mode`);\n mountApp(containerElement);\n return true;\n }\n }\n\n return false;\n }\n}\n\n/**\n * Registra usando preact/compat (para proyectos migrados de React)\n *\n * @example\n * import { wuPreact } from 'wu-framework/adapters/preact';\n * import App from './App'; // Componente React-like\n *\n * wuPreact.registerCompat('my-app', App);\n */\nasync function registerCompat(appName, Component, options = {}) {\n const {\n props = {},\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#app'\n } = options;\n\n let render, h;\n\n try {\n // Intentar cargar preact/compat\n const compat = await import('preact/compat');\n render = compat.render;\n h = compat.createElement;\n } catch (e) {\n console.error('[WuPreact] preact/compat not available');\n // Fallback a registro normal\n return register(appName, Component, options);\n }\n\n const mountApp = (container) => {\n if (!container) return;\n\n if (adapterState.apps.has(appName)) {\n unmountApp();\n }\n\n try {\n container.innerHTML = '';\n\n render(\n h(Component, {\n ...props,\n wuAppName: appName,\n wuInstance: getWuInstance()\n }),\n container\n );\n\n adapterState.apps.set(appName, { container, Component, isCompat: true });\n\n console.log(`[WuPreact] ✅ ${appName} (compat) mounted successfully`);\n\n if (onMount) onMount(container);\n } catch (error) {\n console.error(`[WuPreact] 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 try {\n if (onUnmount) onUnmount(appData.container);\n render(null, appData.container);\n adapterState.apps.delete(appName);\n console.log(`[WuPreact] ✅ ${appName} (compat) unmounted successfully`);\n } catch (error) {\n console.error(`[WuPreact] Unmount error for ${appName}:`, error);\n }\n }\n\n if (container) container.innerHTML = '';\n };\n\n try {\n const wu = await waitForWu(3000);\n wu.define(appName, { mount: mountApp, unmount: unmountApp });\n console.log(`[WuPreact] ✅ ${appName} (compat) registered with Wu Framework`);\n return true;\n } catch (error) {\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n if (containerElement) {\n mountApp(containerElement);\n return true;\n }\n }\n return false;\n }\n}\n\n/**\n * Crea un componente WuSlot para Preact\n *\n * @param {Function} h - Función h de Preact\n * @returns {Function} Componente WuSlot\n *\n * @example\n * import { h } from 'preact';\n * import { createWuSlot } from 'wu-framework/adapters/preact';\n *\n * const WuSlot = createWuSlot(h);\n *\n * function Shell() {\n * return (\n * <div>\n * <WuSlot name=\"header\" url=\"http://localhost:3001\" />\n * </div>\n * );\n * }\n */\nfunction createWuSlot(h) {\n // Importar hooks de Preact\n let useState, useEffect, useRef, useCallback;\n\n try {\n const hooks = require('preact/hooks');\n useState = hooks.useState;\n useEffect = hooks.useEffect;\n useRef = hooks.useRef;\n useCallback = hooks.useCallback;\n } catch (e) {\n // Si no hay hooks, crear versión sin hooks\n return function WuSlotBasic(props) {\n const { name, url } = props;\n return h('div', {\n class: 'wu-slot',\n 'data-wu-app': name,\n 'data-wu-url': url,\n style: 'min-height: 100px;',\n ref: (el) => {\n if (el && !el._mounted) {\n el._mounted = true;\n mountSlot(el, name, url);\n }\n }\n }, `Loading ${name}...`);\n };\n }\n\n return function WuSlot(props) {\n const {\n name,\n url,\n appName = null,\n fallback = null,\n onLoad = null,\n onError = null,\n className = '',\n style = {}\n } = props;\n\n const containerRef = useRef(null);\n const appInstanceRef = useRef(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n\n const actualAppName = appName || name;\n\n const mountMicrofrontend = useCallback(async () => {\n if (!containerRef.current) return;\n\n try {\n setLoading(true);\n setError(null);\n\n const wu = getWuInstance();\n if (!wu) throw new Error('Wu Framework not initialized');\n\n const containerId = `wu-slot-${actualAppName}-${Date.now()}`;\n const innerContainer = document.createElement('div');\n innerContainer.id = containerId;\n innerContainer.style.cssText = 'width: 100%; height: 100%;';\n\n containerRef.current.innerHTML = '';\n containerRef.current.appendChild(innerContainer);\n\n const app = wu.app(actualAppName, {\n url,\n container: `#${containerId}`,\n autoInit: true\n });\n\n appInstanceRef.current = app;\n await app.mount();\n\n setLoading(false);\n if (onLoad) onLoad({ name: actualAppName, url });\n\n } catch (err) {\n console.error(`[WuSlot] Error loading ${actualAppName}:`, err);\n setError(err.message || 'Failed to load microfrontend');\n setLoading(false);\n if (onError) onError(err);\n }\n }, [actualAppName, url, onLoad, onError]);\n\n useEffect(() => {\n mountMicrofrontend();\n\n return () => {\n if (appInstanceRef.current) {\n appInstanceRef.current.unmount().catch(console.warn);\n appInstanceRef.current = null;\n }\n };\n }, [mountMicrofrontend]);\n\n if (error) {\n return h('div', {\n class: `wu-slot wu-slot-error ${className}`,\n style: {\n padding: '1rem',\n border: '1px solid #f5c6cb',\n borderRadius: '4px',\n backgroundColor: '#f8d7da',\n color: '#721c24',\n ...style\n }\n }, [\n h('strong', null, `Error loading ${name}`),\n h('p', { style: { margin: '0.5rem 0 0 0' } }, error)\n ]);\n }\n\n return h('div', {\n ref: containerRef,\n class: `wu-slot ${loading ? 'wu-slot-loading' : 'wu-slot-loaded'} ${className}`,\n style: {\n minHeight: '100px',\n position: 'relative',\n ...style\n },\n 'data-wu-app': actualAppName,\n 'data-wu-url': url\n }, loading && (fallback || h('div', {\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '2rem',\n color: '#666'\n }\n }, `Loading ${name}...`)));\n };\n}\n\n/**\n * Hook para usar el EventBus de Wu Framework en Preact\n *\n * @example\n * import { createUseWuEvents } from 'wu-framework/adapters/preact';\n * import { useState, useEffect, useRef, useCallback } from 'preact/hooks';\n *\n * const useWuEvents = createUseWuEvents({ useCallback, useEffect, useRef });\n *\n * function MyComponent() {\n * const { emit, on } = useWuEvents();\n *\n * useEffect(() => {\n * return on('user:login', (data) => console.log(data));\n * }, [on]);\n * }\n */\nfunction createUseWuEvents(hooks) {\n const { useCallback, useEffect, useRef } = hooks;\n\n return function useWuEvents() {\n const subscriptionsRef = useRef([]);\n\n const emit = useCallback((event, data, options) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n wu.eventBus.emit(event, data, options);\n }\n }, []);\n\n const on = useCallback((event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n const unsubscribe = wu.eventBus.on(event, callback);\n subscriptionsRef.current.push(unsubscribe);\n return unsubscribe;\n }\n return () => {};\n }, []);\n\n const once = useCallback((event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n return wu.eventBus.once(event, callback);\n }\n return () => {};\n }, []);\n\n useEffect(() => {\n return () => {\n subscriptionsRef.current.forEach(unsub => unsub());\n subscriptionsRef.current = [];\n };\n }, []);\n\n return { emit, on, once };\n };\n}\n\n/**\n * Hook para usar el Store de Wu Framework en Preact\n *\n * @example\n * const useWuStore = createUseWuStore({ useState, useCallback, useEffect });\n *\n * function MyComponent() {\n * const { state, setState, getState } = useWuStore('user');\n * // ...\n * }\n */\nfunction createUseWuStore(hooks) {\n const { useState, useCallback, useEffect } = hooks;\n\n return function useWuStore(namespace = '') {\n const [state, setLocalState] = useState(() => {\n const wu = getWuInstance();\n return wu?.store?.get(namespace) || null;\n });\n\n const setState = useCallback((path, value) => {\n const wu = getWuInstance();\n if (wu?.store) {\n const fullPath = namespace ? `${namespace}.${path}` : path;\n wu.store.set(fullPath, value);\n }\n }, [namespace]);\n\n const getState = useCallback((path = '') => {\n const wu = getWuInstance();\n if (wu?.store) {\n const fullPath = namespace ? (path ? `${namespace}.${path}` : namespace) : path;\n return wu.store.get(fullPath);\n }\n return null;\n }, [namespace]);\n\n useEffect(() => {\n const wu = getWuInstance();\n if (!wu?.store) return;\n\n const pattern = namespace ? `${namespace}.*` : '*';\n const unsubscribe = wu.store.on(pattern, () => {\n setLocalState(wu.store.get(namespace));\n });\n\n return unsubscribe;\n }, [namespace]);\n\n return { state, setState, getState };\n };\n}\n\n// Helper interno para montar slot sin hooks\nasync function mountSlot(container, name, url) {\n try {\n const wu = getWuInstance();\n if (!wu) return;\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 await app.mount();\n } catch (err) {\n container.innerHTML = `<div style=\"color: red;\">Error: ${err.message}</div>`;\n }\n}\n\n// ============================================\n// AI INTEGRATION\n// ============================================\nimport { createUseWuAI } from './ai.js';\n\n// API pública del adapter\nexport const wuPreact = {\n register,\n registerCompat,\n createWuSlot,\n createUseWuEvents,\n createUseWuStore,\n createUseWuAI,\n getWuInstance,\n waitForWu\n};\n\nexport {\n register,\n registerCompat,\n createWuSlot,\n createUseWuEvents,\n createUseWuStore,\n createUseWuAI,\n getWuInstance,\n waitForWu\n};\n\nexport default wuPreact;\n"],"names":["createUseWuAI","hooks","useState","useCallback","options","namespace","messages","setMessages","isStreaming","setIsStreaming","error","setError","send","async","text","trim","wu","window","parent","top","ai","prev","id","Date","now","role","content","timestamp","res","err","message","clear","adapterState","apps","Map","preact","render","h","initialized","getWuInstance","waitForWu","timeout","Promise","resolve","reject","startTime","handleWuReady","cleanup","addEventListener","checkInterval","setInterval","Error","clearInterval","removeEventListener","register","appName","Component","props","onMount","onUnmount","standalone","standaloneContainer","import","console","ensurePreact","mountApp","container","has","warn","unmountApp","innerHTML","wuAppName","wuInstance","set","log","appData","get","delete","define","mount","unmount","containerElement","document","querySelector","registerCompat","compat","createElement","e","isCompat","createWuSlot","useEffect","useRef","require","name","url","class","style","ref","el","_mounted","containerId","innerContainer","cssText","appendChild","app","autoInit","mountSlot","fallback","onLoad","onError","className","containerRef","appInstanceRef","loading","setLoading","actualAppName","mountMicrofrontend","current","catch","padding","border","borderRadius","backgroundColor","color","margin","minHeight","position","display","alignItems","justifyContent","createUseWuEvents","subscriptionsRef","emit","event","data","eventBus","on","callback","unsubscribe","push","once","forEach","unsub","createUseWuStore","state","setLocalState","store","setState","path","value","fullPath","getState","pattern","wuPreact"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/adapters/preact/ai.js","../../../src/adapters/preact/index.js"],"sourcesContent":["/**\n * WU-FRAMEWORK PREACT AI INTEGRATION\n */\nfunction getWuInstance() {\n if (typeof window === 'undefined') return null;\n return window.wu || window.parent?.wu || window.top?.wu || null;\n}\n\nexport function createUseWuAI(hooks) {\n const { useState, useCallback } = hooks;\n return function useWuAI(options = {}) {\n const { namespace = 'default' } = options;\n const [messages, setMessages] = useState([]);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState(null);\n\n const send = useCallback(async (text) => {\n if (!text?.trim()) return;\n const wu = getWuInstance();\n if (!wu?.ai) { setError('Wu AI not available'); return; }\n setMessages(prev => [...prev, { id: `user-${Date.now()}`, role: 'user', content: text, timestamp: Date.now() }]);\n setIsStreaming(true); setError(null);\n try {\n const res = await wu.ai.send(text, { namespace });\n setMessages(prev => [...prev, { id: `assistant-${Date.now()}`, role: 'assistant', content: res.content, timestamp: Date.now() }]);\n } catch (err) { setError(err.message || 'AI request failed'); }\n setIsStreaming(false);\n }, [namespace]);\n\n const clear = useCallback(() => { setMessages([]); setError(null); }, []);\n return { messages, isStreaming, error, send, clear };\n };\n}\n","/**\n * 🚀 WU-FRAMEWORK PREACT ADAPTER\n *\n * Simplifica la integración de Preact con Wu Framework.\n * Compatible con Preact 10+ y preact/compat para proyectos React migrados.\n *\n * @example\n * // Microfrontend (main.jsx)\n * import { wuPreact } from 'wu-framework/adapters/preact';\n * import App from './App';\n *\n * wuPreact.register('my-app', App);\n *\n * @example\n * // Shell (cargar microfrontend)\n * import { createWuSlot } from 'wu-framework/adapters/preact';\n * import { h } from 'preact';\n *\n * const WuSlot = createWuSlot(h);\n * <WuSlot name=\"my-app\" url=\"http://localhost:3001\" />\n */\n\n// Estado global del adapter\nconst adapterState = {\n apps: new Map(),\n preact: null,\n render: null,\n h: null,\n initialized: false\n};\n\n/**\n * Detecta y obtiene Preact del contexto global o lo importa\n */\nasync function ensurePreact() {\n if (adapterState.initialized) return true;\n\n try {\n // Intentar obtener de window\n if (typeof window !== 'undefined' && window.preact) {\n adapterState.preact = window.preact;\n adapterState.render = window.preact.render;\n adapterState.h = window.preact.h;\n adapterState.initialized = true;\n return true;\n }\n\n // Intentar import dinámico\n const preact = await import('preact');\n adapterState.preact = preact;\n adapterState.render = preact.render;\n adapterState.h = preact.h;\n adapterState.initialized = true;\n return true;\n\n } catch (error) {\n console.error('[WuPreact] Failed to load Preact:', error);\n return false;\n }\n}\n\n/**\n * Obtiene la instancia de Wu Framework\n */\nfunction getWuInstance() {\n if (typeof window === 'undefined') return null;\n\n return window.wu\n || window.parent?.wu\n || window.top?.wu\n || null;\n}\n\n/**\n * Espera a que Wu Framework esté disponible\n */\nfunction waitForWu(timeout = 5000) {\n return new Promise((resolve, reject) => {\n const wu = getWuInstance();\n if (wu) {\n resolve(wu);\n return;\n }\n\n const startTime = Date.now();\n\n const handleWuReady = () => {\n cleanup();\n resolve(getWuInstance());\n };\n\n window.addEventListener('wu:ready', handleWuReady);\n window.addEventListener('wu:app:ready', handleWuReady);\n\n const checkInterval = setInterval(() => {\n const wu = getWuInstance();\n if (wu) {\n cleanup();\n resolve(wu);\n return;\n }\n\n if (Date.now() - startTime > timeout) {\n cleanup();\n reject(new Error(`Wu Framework not found after ${timeout}ms`));\n }\n }, 200);\n\n function cleanup() {\n clearInterval(checkInterval);\n window.removeEventListener('wu:ready', handleWuReady);\n window.removeEventListener('wu:app:ready', handleWuReady);\n }\n });\n}\n\n/**\n * Registra un componente Preact como microfrontend\n *\n * @param {string} appName - Nombre único del microfrontend\n * @param {Function} Component - Componente Preact principal\n * @param {Object} options - Opciones adicionales\n * @param {Object} options.props - Props iniciales para el componente\n * @param {Function} options.onMount - Callback después de montar\n * @param {Function} options.onUnmount - Callback antes de desmontar\n * @param {boolean} options.standalone - Permitir ejecución standalone (default: true)\n * @param {string} options.standaloneContainer - Selector para modo standalone (default: '#app')\n *\n * @example\n * // Básico\n * wuPreact.register('my-app', App);\n *\n * @example\n * // Con props\n * wuPreact.register('my-app', App, {\n * props: { apiUrl: 'https://api.example.com' },\n * onMount: (container) => console.log('Mounted!')\n * });\n */\nasync function register(appName, Component, options = {}) {\n const {\n props = {},\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#app'\n } = options;\n\n // Asegurar que Preact está disponible\n const hasPreact = await ensurePreact();\n if (!hasPreact) {\n console.error(`[WuPreact] Cannot register ${appName}: Preact not available`);\n return false;\n }\n\n const { render, h } = adapterState;\n\n // Props vivas: el shell puede empujar nuevas vía wu.update(app, props).\n const initialProps = { ...props };\n let currentProps = { ...props };\n\n const renderInto = (container) => {\n render(\n h(Component, {\n ...currentProps,\n wuAppName: appName,\n wuInstance: getWuInstance()\n }),\n container\n );\n };\n\n // Función de mount interna\n const mountApp = (container) => {\n if (!container) {\n console.error(`[WuPreact] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Evitar doble mount\n if (adapterState.apps.has(appName)) {\n console.warn(`[WuPreact] ${appName} already mounted, unmounting first`);\n unmountApp();\n }\n\n try {\n // Limpiar container\n container.innerHTML = '';\n\n // Renderizar componente\n renderInto(container);\n\n // Guardar referencia\n adapterState.apps.set(appName, { container, Component });\n\n console.log(`[WuPreact] ✅ ${appName} mounted successfully`);\n\n if (onMount) {\n onMount(container);\n }\n } catch (error) {\n console.error(`[WuPreact] Mount error for ${appName}:`, error);\n throw error;\n }\n };\n\n // Canal de props vivo: re-render con diff de Preact (sin desmontar).\n const updateApp = (_container, nextProps) => {\n currentProps = { ...currentProps, ...(nextProps || {}) };\n const appData = adapterState.apps.get(appName);\n if (appData) renderInto(appData.container);\n };\n\n // Función de unmount interna\n const unmountApp = (container) => {\n const appData = adapterState.apps.get(appName);\n\n if (appData) {\n try {\n if (onUnmount) {\n onUnmount(appData.container);\n }\n\n // Unmount en Preact: renderizar null\n render(null, appData.container);\n\n adapterState.apps.delete(appName);\n // Reset props vivas para que un remount parta de las de registro.\n currentProps = { ...initialProps };\n\n console.log(`[WuPreact] ✅ ${appName} unmounted successfully`);\n } catch (error) {\n console.error(`[WuPreact] 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 update: updateApp\n });\n\n console.log(`[WuPreact] ✅ ${appName} registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuPreact] Wu Framework not available for ${appName}`);\n\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n\n if (containerElement) {\n console.log(`[WuPreact] Running ${appName} in standalone mode`);\n mountApp(containerElement);\n return true;\n }\n }\n\n return false;\n }\n}\n\n/**\n * Registra usando preact/compat (para proyectos migrados de React)\n *\n * @example\n * import { wuPreact } from 'wu-framework/adapters/preact';\n * import App from './App'; // Componente React-like\n *\n * wuPreact.registerCompat('my-app', App);\n */\nasync function registerCompat(appName, Component, options = {}) {\n const {\n props = {},\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#app'\n } = options;\n\n let render, h;\n\n try {\n // Intentar cargar preact/compat\n const compat = await import('preact/compat');\n render = compat.render;\n h = compat.createElement;\n } catch (e) {\n console.error('[WuPreact] preact/compat not available');\n // Fallback a registro normal\n return register(appName, Component, options);\n }\n\n const mountApp = (container) => {\n if (!container) return;\n\n if (adapterState.apps.has(appName)) {\n unmountApp();\n }\n\n try {\n container.innerHTML = '';\n\n render(\n h(Component, {\n ...props,\n wuAppName: appName,\n wuInstance: getWuInstance()\n }),\n container\n );\n\n adapterState.apps.set(appName, { container, Component, isCompat: true });\n\n console.log(`[WuPreact] ✅ ${appName} (compat) mounted successfully`);\n\n if (onMount) onMount(container);\n } catch (error) {\n console.error(`[WuPreact] 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 try {\n if (onUnmount) onUnmount(appData.container);\n render(null, appData.container);\n adapterState.apps.delete(appName);\n console.log(`[WuPreact] ✅ ${appName} (compat) unmounted successfully`);\n } catch (error) {\n console.error(`[WuPreact] Unmount error for ${appName}:`, error);\n }\n }\n\n if (container) container.innerHTML = '';\n };\n\n try {\n const wu = await waitForWu(3000);\n wu.define(appName, { mount: mountApp, unmount: unmountApp });\n console.log(`[WuPreact] ✅ ${appName} (compat) registered with Wu Framework`);\n return true;\n } catch (error) {\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n if (containerElement) {\n mountApp(containerElement);\n return true;\n }\n }\n return false;\n }\n}\n\n/**\n * Crea un componente WuSlot para Preact\n *\n * @param {Function} h - Función h de Preact\n * @returns {Function} Componente WuSlot\n *\n * @example\n * import { h } from 'preact';\n * import { createWuSlot } from 'wu-framework/adapters/preact';\n *\n * const WuSlot = createWuSlot(h);\n *\n * function Shell() {\n * return (\n * <div>\n * <WuSlot name=\"header\" url=\"http://localhost:3001\" />\n * </div>\n * );\n * }\n */\nfunction createWuSlot(h) {\n // Importar hooks de Preact\n let useState, useEffect, useRef, useCallback;\n\n try {\n const hooks = require('preact/hooks');\n useState = hooks.useState;\n useEffect = hooks.useEffect;\n useRef = hooks.useRef;\n useCallback = hooks.useCallback;\n } catch (e) {\n // Si no hay hooks, crear versión sin hooks\n return function WuSlotBasic(props) {\n const { name, url } = props;\n return h('div', {\n class: 'wu-slot',\n 'data-wu-app': name,\n 'data-wu-url': url,\n style: 'min-height: 100px;',\n ref: (el) => {\n if (el && !el._mounted) {\n el._mounted = true;\n mountSlot(el, name, url);\n }\n }\n }, `Loading ${name}...`);\n };\n }\n\n return function WuSlot(props) {\n const {\n name,\n url,\n appName = null,\n fallback = null,\n onLoad = null,\n onError = null,\n className = '',\n style = {}\n } = props;\n\n const containerRef = useRef(null);\n const appInstanceRef = useRef(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n\n const actualAppName = appName || name;\n\n const mountMicrofrontend = useCallback(async () => {\n if (!containerRef.current) return;\n\n try {\n setLoading(true);\n setError(null);\n\n const wu = getWuInstance();\n if (!wu) throw new Error('Wu Framework not initialized');\n\n const containerId = `wu-slot-${actualAppName}-${Date.now()}`;\n const innerContainer = document.createElement('div');\n innerContainer.id = containerId;\n innerContainer.style.cssText = 'width: 100%; height: 100%;';\n\n containerRef.current.innerHTML = '';\n containerRef.current.appendChild(innerContainer);\n\n const app = wu.app(actualAppName, {\n url,\n container: `#${containerId}`,\n autoInit: true\n });\n\n appInstanceRef.current = app;\n await app.mount();\n\n setLoading(false);\n if (onLoad) onLoad({ name: actualAppName, url });\n\n } catch (err) {\n console.error(`[WuSlot] Error loading ${actualAppName}:`, err);\n setError(err.message || 'Failed to load microfrontend');\n setLoading(false);\n if (onError) onError(err);\n }\n }, [actualAppName, url, onLoad, onError]);\n\n useEffect(() => {\n mountMicrofrontend();\n\n return () => {\n if (appInstanceRef.current) {\n appInstanceRef.current.unmount().catch(console.warn);\n appInstanceRef.current = null;\n }\n };\n }, [mountMicrofrontend]);\n\n if (error) {\n return h('div', {\n class: `wu-slot wu-slot-error ${className}`,\n style: {\n padding: '1rem',\n border: '1px solid #f5c6cb',\n borderRadius: '4px',\n backgroundColor: '#f8d7da',\n color: '#721c24',\n ...style\n }\n }, [\n h('strong', null, `Error loading ${name}`),\n h('p', { style: { margin: '0.5rem 0 0 0' } }, error)\n ]);\n }\n\n return h('div', {\n ref: containerRef,\n class: `wu-slot ${loading ? 'wu-slot-loading' : 'wu-slot-loaded'} ${className}`,\n style: {\n minHeight: '100px',\n position: 'relative',\n ...style\n },\n 'data-wu-app': actualAppName,\n 'data-wu-url': url\n }, loading && (fallback || h('div', {\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '2rem',\n color: '#666'\n }\n }, `Loading ${name}...`)));\n };\n}\n\n/**\n * Hook para usar el EventBus de Wu Framework en Preact\n *\n * @example\n * import { createUseWuEvents } from 'wu-framework/adapters/preact';\n * import { useState, useEffect, useRef, useCallback } from 'preact/hooks';\n *\n * const useWuEvents = createUseWuEvents({ useCallback, useEffect, useRef });\n *\n * function MyComponent() {\n * const { emit, on } = useWuEvents();\n *\n * useEffect(() => {\n * return on('user:login', (data) => console.log(data));\n * }, [on]);\n * }\n */\nfunction createUseWuEvents(hooks) {\n const { useCallback, useEffect, useRef } = hooks;\n\n return function useWuEvents() {\n const subscriptionsRef = useRef([]);\n\n const emit = useCallback((event, data, options) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n wu.eventBus.emit(event, data, options);\n }\n }, []);\n\n const on = useCallback((event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n const unsubscribe = wu.eventBus.on(event, callback);\n subscriptionsRef.current.push(unsubscribe);\n return unsubscribe;\n }\n return () => {};\n }, []);\n\n const once = useCallback((event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n return wu.eventBus.once(event, callback);\n }\n return () => {};\n }, []);\n\n useEffect(() => {\n return () => {\n subscriptionsRef.current.forEach(unsub => unsub());\n subscriptionsRef.current = [];\n };\n }, []);\n\n return { emit, on, once };\n };\n}\n\n/**\n * Hook para usar el Store de Wu Framework en Preact\n *\n * @example\n * const useWuStore = createUseWuStore({ useState, useCallback, useEffect });\n *\n * function MyComponent() {\n * const { state, setState, getState } = useWuStore('user');\n * // ...\n * }\n */\nfunction createUseWuStore(hooks) {\n const { useState, useCallback, useEffect } = hooks;\n\n return function useWuStore(namespace = '') {\n const [state, setLocalState] = useState(() => {\n const wu = getWuInstance();\n return wu?.store?.get(namespace) || null;\n });\n\n const setState = useCallback((path, value) => {\n const wu = getWuInstance();\n if (wu?.store) {\n const fullPath = namespace ? `${namespace}.${path}` : path;\n wu.store.set(fullPath, value);\n }\n }, [namespace]);\n\n const getState = useCallback((path = '') => {\n const wu = getWuInstance();\n if (wu?.store) {\n const fullPath = namespace ? (path ? `${namespace}.${path}` : namespace) : path;\n return wu.store.get(fullPath);\n }\n return null;\n }, [namespace]);\n\n useEffect(() => {\n const wu = getWuInstance();\n if (!wu?.store) return;\n\n const pattern = namespace ? `${namespace}.*` : '*';\n const unsubscribe = wu.store.on(pattern, () => {\n setLocalState(wu.store.get(namespace));\n });\n\n return unsubscribe;\n }, [namespace]);\n\n return { state, setState, getState };\n };\n}\n\n// Helper interno para montar slot sin hooks\nasync function mountSlot(container, name, url) {\n try {\n const wu = getWuInstance();\n if (!wu) return;\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 await app.mount();\n } catch (err) {\n container.innerHTML = `<div style=\"color: red;\">Error: ${err.message}</div>`;\n }\n}\n\n// ============================================\n// AI INTEGRATION\n// ============================================\nimport { createUseWuAI } from './ai.js';\n\n// API pública del adapter\nexport const wuPreact = {\n register,\n registerCompat,\n createWuSlot,\n createUseWuEvents,\n createUseWuStore,\n createUseWuAI,\n getWuInstance,\n waitForWu\n};\n\nexport {\n register,\n registerCompat,\n createWuSlot,\n createUseWuEvents,\n createUseWuStore,\n createUseWuAI,\n getWuInstance,\n waitForWu\n};\n\nexport default wuPreact;\n"],"names":["createUseWuAI","hooks","useState","useCallback","options","namespace","messages","setMessages","isStreaming","setIsStreaming","error","setError","send","async","text","trim","wu","window","parent","top","ai","prev","id","Date","now","role","content","timestamp","res","err","message","clear","adapterState","apps","Map","preact","render","h","initialized","getWuInstance","waitForWu","timeout","Promise","resolve","reject","startTime","handleWuReady","cleanup","addEventListener","checkInterval","setInterval","Error","clearInterval","removeEventListener","register","appName","Component","props","onMount","onUnmount","standalone","standaloneContainer","import","console","ensurePreact","initialProps","currentProps","renderInto","container","wuAppName","wuInstance","mountApp","has","warn","unmountApp","innerHTML","set","log","updateApp","_container","nextProps","appData","get","delete","define","mount","unmount","update","containerElement","document","querySelector","registerCompat","compat","createElement","e","isCompat","createWuSlot","useEffect","useRef","require","name","url","class","style","ref","el","_mounted","containerId","innerContainer","cssText","appendChild","app","autoInit","mountSlot","fallback","onLoad","onError","className","containerRef","appInstanceRef","loading","setLoading","actualAppName","mountMicrofrontend","current","catch","padding","border","borderRadius","backgroundColor","color","margin","minHeight","position","display","alignItems","justifyContent","createUseWuEvents","subscriptionsRef","emit","event","data","eventBus","on","callback","unsubscribe","push","once","forEach","unsub","createUseWuStore","state","setLocalState","store","setState","path","value","fullPath","getState","pattern","wuPreact"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * WU-FRAMEWORK QWIK 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
  * Qwik adapter registration options
@@ -10,18 +10,11 @@ import type { WuCore } from '../../core/wu-core';
10
10
  export interface QwikRegisterOptions {
11
11
  /** Props to pass to the Qwik component */
12
12
  props?: Record<string, any>;
13
- /** Callback after mounting */
14
- onMount?: (container: HTMLElement) => void;
15
- /** Callback before unmounting */
16
- onUnmount?: (container: HTMLElement) => void;
17
- /** Allow standalone execution when Wu Framework is not available */
18
- standalone?: boolean;
19
- /** CSS selector for standalone mode container */
20
- standaloneContainer?: string;
21
13
  }
22
14
 
23
15
  /**
24
- * Register a Qwik component as a Wu microfrontend
16
+ * Register a Qwik component as a Wu microfrontend.
17
+ * Resolves to true once registered, false if Wu Framework never became available.
25
18
  */
26
19
  export function register(
27
20
  appName: string,
@@ -1,2 +1,2 @@
1
- function e(){return"undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null}function n(n=5e3){return new Promise((t,r)=>{const o=e();if(o)return t(o);const i=Date.now(),a=()=>{c(),t(e())};window.addEventListener("wu:ready",a),window.addEventListener("wu:app:ready",a);const u=setInterval(()=>{const o=e();if(o)return c(),void t(o);Date.now()-i>n&&(c(),r(new Error(`Wu Framework not found after ${n}ms`)))},200);function c(){clearInterval(u),window.removeEventListener("wu:ready",a),window.removeEventListener("wu:app:ready",a)}})}let t=!1;async function r(n,r,o={}){const i=e();if(!i)return;const a=await import("@builder.io/qwik");if(function(){if(t)return;t=!0;const e=document.addEventListener;document.addEventListener=function(n,t,r){if((!0===r||r&&r.capture)&&"function"==typeof t){const o=function(e){const n=e.composedPath();if(n.length&&n[0]!==e.target&&n[0]instanceof Element){const r=n[0],o=new Proxy(e,{get(e,n){if("target"===n)return r;const t=Reflect.get(e,n);return"function"==typeof t?t.bind(e):t}});return t.call(this,o)}return t.call(this,e)};return e.call(this,n,o,r)}return e.call(this,n,t,r)}}(),!document.__wu_qwikloader){document.__wu_qwikloader=!0;try{const{QWIK_LOADER:e}=await import("@builder.io/qwik/loader"),n=document.createElement("script");n.textContent=e,document.head.appendChild(n)}catch(e){console.warn("[WuQwik] qwikloader not available:",e.message)}}i.define(n,{async mount(e){e.innerHTML="";try{const n=a.jsx(r,o.props||{});await a.render(e,n)}catch(n){console.error("[WuQwik] render error:",n),e.innerHTML='<pre style="color:#f66;padding:1rem">'+n.message+"</pre>"}},unmount(e){e.innerHTML=""}})}const o={register:r,getWuInstance:e,waitForWu:n};export{o as default,e as getWuInstance,r as register,n as waitForWu,o as wuQwik};
1
+ function e(){return"undefined"==typeof window?null:window.wu||window.parent?.wu||window.top?.wu||null}function n(n=5e3){return new Promise((t,r)=>{const o=e();if(o)return t(o);const i=Date.now(),a=()=>{c(),t(e())};window.addEventListener("wu:ready",a),window.addEventListener("wu:app:ready",a);const u=setInterval(()=>{const o=e();if(o)return c(),void t(o);Date.now()-i>n&&(c(),r(new Error(`Wu Framework not found after ${n}ms`)))},200);function c(){clearInterval(u),window.removeEventListener("wu:ready",a),window.removeEventListener("wu:app:ready",a)}})}let t=!1;async function r(e,r,o={}){let i,a;try{i=await n(3e3)}catch(n){return console.warn(`[WuQwik] Wu Framework not available for ${e}`),!1}try{a=await import("@builder.io/qwik")}catch(n){return console.warn(`[WuQwik] @builder.io/qwik not available for ${e}:`,n.message),!1}if(function(){if(t)return;t=!0;const e=document.addEventListener;document.addEventListener=function(n,t,r){if((!0===r||r&&r.capture)&&"function"==typeof t){const o=function(e){const n=e.composedPath();if(n.length&&n[0]!==e.target&&n[0]instanceof Element){const r=n[0],o=new Proxy(e,{get(e,n){if("target"===n)return r;const t=Reflect.get(e,n);return"function"==typeof t?t.bind(e):t}});return t.call(this,o)}return t.call(this,e)};return e.call(this,n,o,r)}return e.call(this,n,t,r)}}(),!document.__wu_qwikloader){document.__wu_qwikloader=!0;try{const{QWIK_LOADER:e}=await import("@builder.io/qwik/loader"),n=document.createElement("script");n.textContent=e,document.head.appendChild(n)}catch(e){console.warn("[WuQwik] qwikloader not available:",e.message)}}let u=null;return i.define(e,{mount:async e=>{e.innerHTML="";try{const n=a.jsx(r,o.props||{});u=await a.render(e,n)}catch(n){console.error("[WuQwik] render error:",n),e.innerHTML='<pre style="color:#f66;padding:1rem">'+n.message+"</pre>"}},unmount:e=>{if(u){try{u.cleanup()}catch(e){console.warn("[WuQwik] cleanup error:",e)}u=null}e.innerHTML=""}}),!0}const o={register:r,getWuInstance:e,waitForWu:n};export{o as default,e as getWuInstance,r as register,n as waitForWu,o as wuQwik};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/adapters/qwik/index.js"],"sourcesContent":["/**\n * WU-FRAMEWORK QWIK ADAPTER\n *\n * Integrates Qwik components (component$) into Wu Framework's\n * microfrontend orchestration via @builder.io/qwik render API.\n *\n * Shadow DOM compatibility:\n * Qwik uses QRL-based event delegation — the qwikloader script\n * attaches capture-phase listeners on `document` to intercept events\n * and resolve QRL attributes (on:click, on:input, etc.) on elements.\n *\n * Inside Shadow DOM, event.target is retargeted to the shadow host,\n * so qwikloader can't find QRL attributes on the actual elements.\n * We fix this by wrapping qwikloader's document listeners with a\n * Proxy that returns event.composedPath()[0] as the real target.\n *\n * See: https://github.com/QwikDev/qwik-evolution/issues/283\n */\n\nfunction getWuInstance() {\n if (typeof window === 'undefined') return null;\n return window.wu || window.parent?.wu || window.top?.wu || null;\n}\n\nfunction waitForWu(timeout = 5000) {\n return new Promise((resolve, reject) => {\n const wu = getWuInstance();\n if (wu) return resolve(wu);\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) { cleanup(); resolve(wu); return; }\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\nlet _patched = false;\n\n/**\n * Patches document.addEventListener so capture-phase handlers (used by\n * qwikloader) receive the real event target from inside Shadow DOM via\n * composedPath()[0], instead of the retargeted shadow host.\n *\n * Only activates when there's actual Shadow DOM retargeting — events\n * in the light DOM pass through with zero overhead (no Proxy created).\n */\nfunction patchDocumentListenersForShadowDOM() {\n if (_patched) return;\n _patched = true;\n\n const origAdd = document.addEventListener;\n\n document.addEventListener = function (type, handler, options) {\n const isCapture = options === true || (options && options.capture);\n\n if (isCapture && typeof handler === 'function') {\n const wrapped = function (event) {\n const path = event.composedPath();\n // Only proxy when Shadow DOM retargeting occurred\n if (path.length && path[0] !== event.target && path[0] instanceof Element) {\n const realTarget = path[0];\n const proxy = new Proxy(event, {\n get(obj, prop) {\n if (prop === 'target') return realTarget;\n const val = Reflect.get(obj, prop);\n return typeof val === 'function' ? val.bind(obj) : val;\n }\n });\n return handler.call(this, proxy);\n }\n return handler.call(this, event);\n };\n return origAdd.call(this, type, wrapped, options);\n }\n\n return origAdd.call(this, type, handler, options);\n };\n}\n\nasync function register(appName, Component, options = {}) {\n const wu = getWuInstance();\n if (!wu) return;\n\n const qwik = await import('@builder.io/qwik');\n\n // Patch document listeners BEFORE injecting qwikloader so its\n // capture-phase handlers are wrapped with Shadow DOM awareness.\n // Must stay active permanently — qwikloader registers event types\n // lazily as new on: attributes appear in the DOM.\n patchDocumentListenersForShadowDOM();\n\n // Inject qwikloader once per document (event delegation for QRLs)\n if (!document.__wu_qwikloader) {\n document.__wu_qwikloader = true;\n try {\n const { QWIK_LOADER } = await import('@builder.io/qwik/loader');\n const s = document.createElement('script');\n s.textContent = QWIK_LOADER;\n document.head.appendChild(s);\n } catch (e) {\n console.warn('[WuQwik] qwikloader not available:', e.message);\n }\n }\n\n wu.define(appName, {\n async mount(container) {\n container.innerHTML = '';\n try {\n const vnode = qwik.jsx(Component, options.props || {});\n await qwik.render(container, vnode);\n } catch (e) {\n console.error('[WuQwik] render error:', e);\n container.innerHTML = '<pre style=\"color:#f66;padding:1rem\">' + e.message + '</pre>';\n }\n },\n unmount(container) {\n container.innerHTML = '';\n }\n });\n}\n\nexport const wuQwik = {\n register,\n getWuInstance,\n waitForWu\n};\n\nexport { register, getWuInstance, waitForWu };\nexport default wuQwik;\n"],"names":["getWuInstance","window","wu","parent","top","waitForWu","timeout","Promise","resolve","reject","startTime","Date","now","handleWuReady","cleanup","addEventListener","checkInterval","setInterval","Error","clearInterval","removeEventListener","_patched","async","register","appName","Component","options","qwik","import","origAdd","document","type","handler","capture","wrapped","event","path","composedPath","length","target","Element","realTarget","proxy","Proxy","get","obj","prop","val","Reflect","bind","call","this","patchDocumentListenersForShadowDOM","__wu_qwikloader","QWIK_LOADER","s","createElement","textContent","head","appendChild","e","console","warn","message","define","mount","container","innerHTML","vnode","jsx","props","render","error","unmount","wuQwik"],"mappings":"AAmBA,SAASA,IACP,MAAsB,oBAAXC,OAA+B,KACnCA,OAAOC,IAAMD,OAAOE,QAAQD,IAAMD,OAAOG,KAAKF,IAAM,IAC7D,CAEA,SAASG,EAAUC,EAAU,KAC3B,OAAO,IAAIC,QAAQ,CAACC,EAASC,KAC3B,MAAMP,EAAKF,IACX,GAAIE,EAAI,OAAOM,EAAQN,GAEvB,MAAMQ,EAAYC,KAAKC,MAEjBC,EAAgB,KACpBC,IACAN,EAAQR,MAGVC,OAAOc,iBAAiB,WAAYF,GACpCZ,OAAOc,iBAAiB,eAAgBF,GAExC,MAAMG,EAAgBC,YAAY,KAChC,MAAMf,EAAKF,IACX,GAAIE,EAA8B,OAAxBY,SAAWN,EAAQN,GACzBS,KAAKC,MAAQF,EAAYJ,IAC3BQ,IACAL,EAAO,IAAIS,MAAM,gCAAgCZ,UAElD,KAEH,SAASQ,IACPK,cAAcH,GACdf,OAAOmB,oBAAoB,WAAYP,GACvCZ,OAAOmB,oBAAoB,eAAgBP,EAC7C,GAEJ,CAEA,IAAIQ,GAAW,EA2CfC,eAAeC,EAASC,EAASC,EAAWC,EAAU,CAAA,GACpD,MAAMxB,EAAKF,IACX,IAAKE,EAAI,OAET,MAAMyB,QAAaC,OAAO,oBAS1B,GA9CF,WACE,GAAIP,EAAU,OACdA,GAAW,EAEX,MAAMQ,EAAUC,SAASf,iBAEzBe,SAASf,iBAAmB,SAAUgB,EAAMC,EAASN,GAGnD,KAF8B,IAAZA,GAAqBA,GAAWA,EAAQO,UAEtB,mBAAZD,EAAwB,CAC9C,MAAME,EAAU,SAAUC,GACxB,MAAMC,EAAOD,EAAME,eAEnB,GAAID,EAAKE,QAAUF,EAAK,KAAOD,EAAMI,QAAUH,EAAK,aAAcI,QAAS,CACzE,MAAMC,EAAaL,EAAK,GAClBM,EAAQ,IAAIC,MAAMR,EAAO,CAC7B,GAAAS,CAAIC,EAAKC,GACP,GAAa,WAATA,EAAmB,OAAOL,EAC9B,MAAMM,EAAMC,QAAQJ,IAAIC,EAAKC,GAC7B,MAAsB,mBAARC,EAAqBA,EAAIE,KAAKJ,GAAOE,CACrD,IAEF,OAAOf,EAAQkB,KAAKC,KAAMT,EAC5B,CACA,OAAOV,EAAQkB,KAAKC,KAAMhB,EAC5B,EACA,OAAON,EAAQqB,KAAKC,KAAMpB,EAAMG,EAASR,EAC3C,CAEA,OAAOG,EAAQqB,KAAKC,KAAMpB,EAAMC,EAASN,EAC3C,CACF,CAYE0B,IAGKtB,SAASuB,gBAAiB,CAC7BvB,SAASuB,iBAAkB,EAC3B,IACE,MAAMC,YAAEA,SAAsB1B,OAAO,2BAC/B2B,EAAIzB,SAAS0B,cAAc,UACjCD,EAAEE,YAAcH,EAChBxB,SAAS4B,KAAKC,YAAYJ,EAC5B,CAAE,MAAOK,GACPC,QAAQC,KAAK,qCAAsCF,EAAEG,QACvD,CACF,CAEA7D,EAAG8D,OAAOxC,EAAS,CACjB,WAAMyC,CAAMC,GACVA,EAAUC,UAAY,GACtB,IACE,MAAMC,EAAQzC,EAAK0C,IAAI5C,EAAWC,EAAQ4C,OAAS,UAC7C3C,EAAK4C,OAAOL,EAAWE,EAC/B,CAAE,MAAOR,GACPC,QAAQW,MAAM,yBAA0BZ,GACxCM,EAAUC,UAAY,wCAA0CP,EAAEG,QAAU,QAC9E,CACF,EACA,OAAAU,CAAQP,GACNA,EAAUC,UAAY,EACxB,GAEJ,CAEY,MAACO,EAAS,CACpBnD,WACAvB,gBACAK"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/adapters/qwik/index.js"],"sourcesContent":["/**\n * WU-FRAMEWORK QWIK ADAPTER\n *\n * Integrates Qwik components (component$) into Wu Framework's\n * microfrontend orchestration via @builder.io/qwik render API.\n *\n * Shadow DOM compatibility:\n * Qwik uses QRL-based event delegation — the qwikloader script\n * attaches capture-phase listeners on `document` to intercept events\n * and resolve QRL attributes (on:click, on:input, etc.) on elements.\n *\n * Inside Shadow DOM, event.target is retargeted to the shadow host,\n * so qwikloader can't find QRL attributes on the actual elements.\n * We fix this by wrapping qwikloader's document listeners with a\n * Proxy that returns event.composedPath()[0] as the real target.\n *\n * See: https://github.com/QwikDev/qwik-evolution/issues/283\n */\n\nfunction getWuInstance() {\n if (typeof window === 'undefined') return null;\n return window.wu || window.parent?.wu || window.top?.wu || null;\n}\n\nfunction waitForWu(timeout = 5000) {\n return new Promise((resolve, reject) => {\n const wu = getWuInstance();\n if (wu) return resolve(wu);\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) { cleanup(); resolve(wu); return; }\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\nlet _patched = false;\n\n/**\n * Patches document.addEventListener so capture-phase handlers (used by\n * qwikloader) receive the real event target from inside Shadow DOM via\n * composedPath()[0], instead of the retargeted shadow host.\n *\n * Only activates when there's actual Shadow DOM retargeting — events\n * in the light DOM pass through with zero overhead (no Proxy created).\n */\nfunction patchDocumentListenersForShadowDOM() {\n if (_patched) return;\n _patched = true;\n\n const origAdd = document.addEventListener;\n\n document.addEventListener = function (type, handler, options) {\n const isCapture = options === true || (options && options.capture);\n\n if (isCapture && typeof handler === 'function') {\n const wrapped = function (event) {\n const path = event.composedPath();\n // Only proxy when Shadow DOM retargeting occurred\n if (path.length && path[0] !== event.target && path[0] instanceof Element) {\n const realTarget = path[0];\n const proxy = new Proxy(event, {\n get(obj, prop) {\n if (prop === 'target') return realTarget;\n const val = Reflect.get(obj, prop);\n return typeof val === 'function' ? val.bind(obj) : val;\n }\n });\n return handler.call(this, proxy);\n }\n return handler.call(this, event);\n };\n return origAdd.call(this, type, wrapped, options);\n }\n\n return origAdd.call(this, type, handler, options);\n };\n}\n\nasync function register(appName, Component, options = {}) {\n // Sin Wu (p. ej. microfrontend abierto standalone) esto debe ser un no-op\n // total: nada de imports, patches globales ni scripts inyectados.\n let wu;\n try {\n wu = await waitForWu(3000);\n } catch (error) {\n console.warn(`[WuQwik] Wu Framework not available for ${appName}`);\n return false;\n }\n\n let qwik;\n try {\n qwik = await import('@builder.io/qwik');\n } catch (e) {\n console.warn(`[WuQwik] @builder.io/qwik not available for ${appName}:`, e.message);\n return false;\n }\n\n // Patch document listeners BEFORE injecting qwikloader so its\n // capture-phase handlers are wrapped with Shadow DOM awareness.\n // Must stay active permanently — qwikloader registers event types\n // lazily as new on: attributes appear in the DOM.\n patchDocumentListenersForShadowDOM();\n\n // Inject qwikloader once per document (event delegation for QRLs)\n if (!document.__wu_qwikloader) {\n document.__wu_qwikloader = true;\n try {\n const { QWIK_LOADER } = await import('@builder.io/qwik/loader');\n const s = document.createElement('script');\n s.textContent = QWIK_LOADER;\n document.head.appendChild(s);\n } catch (e) {\n console.warn('[WuQwik] qwikloader not available:', e.message);\n }\n }\n\n let renderResult = null;\n\n const mountApp = async (container) => {\n container.innerHTML = '';\n try {\n const vnode = qwik.jsx(Component, options.props || {});\n renderResult = await qwik.render(container, vnode);\n } catch (e) {\n console.error('[WuQwik] render error:', e);\n container.innerHTML = '<pre style=\"color:#f66;padding:1rem\">' + e.message + '</pre>';\n }\n };\n\n const unmountApp = (container) => {\n if (renderResult) {\n try {\n renderResult.cleanup();\n } catch (e) {\n console.warn('[WuQwik] cleanup error:', e);\n }\n renderResult = null;\n }\n container.innerHTML = '';\n };\n\n wu.define(appName, {\n mount: mountApp,\n unmount: unmountApp\n });\n\n return true;\n}\n\nexport const wuQwik = {\n register,\n getWuInstance,\n waitForWu\n};\n\nexport { register, getWuInstance, waitForWu };\nexport default wuQwik;\n"],"names":["getWuInstance","window","wu","parent","top","waitForWu","timeout","Promise","resolve","reject","startTime","Date","now","handleWuReady","cleanup","addEventListener","checkInterval","setInterval","Error","clearInterval","removeEventListener","_patched","async","register","appName","Component","options","qwik","error","console","warn","import","e","message","origAdd","document","type","handler","capture","wrapped","event","path","composedPath","length","target","Element","realTarget","proxy","Proxy","get","obj","prop","val","Reflect","bind","call","this","patchDocumentListenersForShadowDOM","__wu_qwikloader","QWIK_LOADER","s","createElement","textContent","head","appendChild","renderResult","define","mount","container","innerHTML","vnode","jsx","props","render","unmount","wuQwik"],"mappings":"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"}