wu-framework 2.1.0 → 2.1.2
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.
- package/LICENSE +39 -39
- package/README.md +570 -570
- package/dist/adapters/angular/index.d.ts +154 -154
- package/dist/adapters/angular/index.js.map +1 -1
- package/dist/adapters/angular.d.ts +3 -3
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/lit/index.d.ts +120 -120
- package/dist/adapters/lit/index.js.map +1 -1
- package/dist/adapters/lit.d.ts +3 -3
- package/dist/adapters/preact/index.d.ts +108 -108
- package/dist/adapters/preact/index.js.map +1 -1
- package/dist/adapters/preact.d.ts +3 -3
- package/dist/adapters/qwik/index.js +1 -1
- package/dist/adapters/qwik/index.js.map +1 -1
- package/dist/adapters/react/index.d.ts +246 -246
- package/dist/adapters/react/index.js.map +1 -1
- package/dist/adapters/react.d.ts +3 -3
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/solid/index.d.ts +101 -101
- package/dist/adapters/solid/index.js.map +1 -1
- package/dist/adapters/solid.d.ts +3 -3
- package/dist/adapters/svelte/index.d.ts +166 -166
- package/dist/adapters/svelte/index.js.map +1 -1
- package/dist/adapters/svelte.d.ts +3 -3
- package/dist/adapters/vanilla/index.d.ts +179 -179
- package/dist/adapters/vanilla/index.js.map +1 -1
- package/dist/adapters/vanilla.d.ts +3 -3
- package/dist/adapters/vue/index.d.ts +299 -299
- package/dist/adapters/vue/index.js.map +1 -1
- package/dist/adapters/vue.d.ts +3 -3
- package/dist/ai/wu-ai.js.map +1 -1
- package/dist/core/wu-html-parser.js +2 -0
- package/dist/core/wu-html-parser.js.map +1 -0
- package/dist/core/wu-iframe-sandbox.js +2 -0
- package/dist/core/wu-iframe-sandbox.js.map +1 -0
- package/dist/core/wu-loader.js +2 -0
- package/dist/core/wu-loader.js.map +1 -0
- package/dist/core/wu-mcp-bridge.js.map +1 -1
- package/dist/core/wu-script-executor.js +2 -0
- package/dist/core/wu-script-executor.js.map +1 -0
- package/dist/wu-ai-browser-primitives-BDKXJlwc.js.map +1 -1
- package/dist/wu-framework.cjs.js +2 -2
- package/dist/wu-framework.cjs.js.map +1 -1
- package/dist/wu-framework.dev.js +8697 -9142
- package/dist/wu-framework.dev.js.map +1 -1
- package/dist/wu-framework.esm.js +2 -2
- package/dist/wu-framework.esm.js.map +1 -1
- package/dist/wu-framework.umd.js +2 -2
- package/dist/wu-framework.umd.js.map +1 -1
- package/dist/wu-logger-fJfUHBGA.js.map +1 -1
- package/integrations/astro/README.md +127 -127
- package/integrations/astro/WuApp.astro +63 -63
- package/integrations/astro/WuShell.astro +39 -39
- package/integrations/astro/index.js +68 -68
- package/integrations/astro/package.json +38 -38
- package/integrations/astro/types.d.ts +53 -53
- package/package.json +218 -218
- package/dist/wu-html-parser.js +0 -2
- package/dist/wu-html-parser.js.map +0 -1
- package/dist/wu-iframe-sandbox.js +0 -2
- package/dist/wu-iframe-sandbox.js.map +0 -1
- package/dist/wu-script-executor.js +0 -2
- package/dist/wu-script-executor.js.map +0 -1
|
@@ -1,154 +1,154 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 🚀 WU-FRAMEWORK ANGULAR ADAPTER - TypeScript Declarations
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import type { WuCore } from '../core/wu-core';
|
|
6
|
-
|
|
7
|
-
// Angular types (generics to avoid hard dependency)
|
|
8
|
-
type NgModuleRef<T> = any;
|
|
9
|
-
type ApplicationRef = any;
|
|
10
|
-
type Type<T> = new (...args: any[]) => T;
|
|
11
|
-
type ApplicationConfig = any;
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Opciones para registrar un módulo Angular
|
|
15
|
-
*/
|
|
16
|
-
export interface AngularRegisterOptions {
|
|
17
|
-
/** Factory del platform (platformBrowserDynamic) */
|
|
18
|
-
platformFactory?: () => any;
|
|
19
|
-
/** Providers adicionales para bootstrap */
|
|
20
|
-
providers?: any[];
|
|
21
|
-
/** Callback después de montar */
|
|
22
|
-
onMount?: (container: HTMLElement, moduleRef: NgModuleRef<any>) => void;
|
|
23
|
-
/** Callback antes de desmontar */
|
|
24
|
-
onUnmount?: (container: HTMLElement, moduleRef: NgModuleRef<any>) => void;
|
|
25
|
-
/** Permitir ejecución standalone (default: true) */
|
|
26
|
-
standalone?: boolean;
|
|
27
|
-
/** Selector para modo standalone (default: '#root') */
|
|
28
|
-
standaloneContainer?: string;
|
|
29
|
-
/** Selector del componente root (default: 'app-root') */
|
|
30
|
-
rootSelector?: string;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Opciones para registrar un componente standalone Angular
|
|
35
|
-
*/
|
|
36
|
-
export interface AngularStandaloneOptions {
|
|
37
|
-
/** Configuración de la aplicación */
|
|
38
|
-
appConfig?: ApplicationConfig;
|
|
39
|
-
/** Callback después de montar */
|
|
40
|
-
onMount?: (container: HTMLElement, appRef: ApplicationRef) => void;
|
|
41
|
-
/** Callback antes de desmontar */
|
|
42
|
-
onUnmount?: (container: HTMLElement, appRef: ApplicationRef) => void;
|
|
43
|
-
/** Permitir ejecución standalone (default: true) */
|
|
44
|
-
standalone?: boolean;
|
|
45
|
-
/** Selector para modo standalone (default: '#root') */
|
|
46
|
-
standaloneContainer?: string;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Servicio de Wu Framework para Angular
|
|
51
|
-
*/
|
|
52
|
-
export interface WuService {
|
|
53
|
-
/** Emitir evento */
|
|
54
|
-
emit: (event: string, data?: any, options?: any) => void;
|
|
55
|
-
/** Suscribirse a evento */
|
|
56
|
-
on: (event: string, callback: (data: any) => void) => () => void;
|
|
57
|
-
/** Suscribirse a evento una vez */
|
|
58
|
-
once: (event: string, callback: (data: any) => void) => () => void;
|
|
59
|
-
/** Desuscribirse de evento */
|
|
60
|
-
off: (event: string, callback: (data: any) => void) => void;
|
|
61
|
-
/** Obtener estado */
|
|
62
|
-
getState: (path?: string) => any;
|
|
63
|
-
/** Establecer estado */
|
|
64
|
-
setState: (path: string, value: any) => void;
|
|
65
|
-
/** Suscribirse a cambios de estado */
|
|
66
|
-
onStateChange: (pattern: string, callback: (value: any) => void) => () => void;
|
|
67
|
-
/** Destruir servicio y limpiar suscripciones */
|
|
68
|
-
destroy: () => void;
|
|
69
|
-
/** Acceso a instancia de Wu */
|
|
70
|
-
readonly wu: WuCore | null;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Configuración del componente WuSlot
|
|
75
|
-
*/
|
|
76
|
-
export interface WuSlotComponentConfig {
|
|
77
|
-
selector: string;
|
|
78
|
-
template: string;
|
|
79
|
-
styles: string[];
|
|
80
|
-
methods: {
|
|
81
|
-
ngOnInit: () => Promise<void>;
|
|
82
|
-
ngOnDestroy: () => void;
|
|
83
|
-
mountMicrofrontend: () => Promise<void>;
|
|
84
|
-
unmountMicrofrontend: () => Promise<void>;
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Configuración del módulo WuSlot
|
|
90
|
-
*/
|
|
91
|
-
export interface WuSlotModuleConfig {
|
|
92
|
-
imports: string[];
|
|
93
|
-
declarations: string[];
|
|
94
|
-
exports: string[];
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Registra un módulo Angular como microfrontend
|
|
99
|
-
*/
|
|
100
|
-
export function register(
|
|
101
|
-
appName: string,
|
|
102
|
-
AppModule: Type<any>,
|
|
103
|
-
options?: AngularRegisterOptions
|
|
104
|
-
): Promise<boolean>;
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Registra un componente standalone Angular como microfrontend (Angular 14+)
|
|
108
|
-
*/
|
|
109
|
-
export function registerStandalone(
|
|
110
|
-
appName: string,
|
|
111
|
-
RootComponent: Type<any>,
|
|
112
|
-
options?: AngularStandaloneOptions
|
|
113
|
-
): Promise<boolean>;
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Crea un servicio Wu para usar en Angular
|
|
117
|
-
*/
|
|
118
|
-
export function createWuService(): WuService;
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Crea la configuración para un componente WuSlot
|
|
122
|
-
*/
|
|
123
|
-
export function createWuSlotComponent(): WuSlotComponentConfig;
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Obtiene la configuración del módulo WuSlot
|
|
127
|
-
*/
|
|
128
|
-
export function getWuSlotModuleConfig(): WuSlotModuleConfig;
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Obtiene la instancia de Wu Framework
|
|
132
|
-
*/
|
|
133
|
-
export function getWuInstance(): WuCore | null;
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Espera a que Wu Framework esté disponible
|
|
137
|
-
*/
|
|
138
|
-
export function waitForWu(timeout?: number): Promise<WuCore>;
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* API del adapter Angular
|
|
142
|
-
*/
|
|
143
|
-
export interface WuAngularAdapter {
|
|
144
|
-
register: typeof register;
|
|
145
|
-
registerStandalone: typeof registerStandalone;
|
|
146
|
-
createWuService: typeof createWuService;
|
|
147
|
-
createWuSlotComponent: typeof createWuSlotComponent;
|
|
148
|
-
getWuSlotModuleConfig: typeof getWuSlotModuleConfig;
|
|
149
|
-
getWuInstance: typeof getWuInstance;
|
|
150
|
-
waitForWu: typeof waitForWu;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
export const wuAngular: WuAngularAdapter;
|
|
154
|
-
export default wuAngular;
|
|
1
|
+
/**
|
|
2
|
+
* 🚀 WU-FRAMEWORK ANGULAR ADAPTER - TypeScript Declarations
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { WuCore } from '../core/wu-core';
|
|
6
|
+
|
|
7
|
+
// Angular types (generics to avoid hard dependency)
|
|
8
|
+
type NgModuleRef<T> = any;
|
|
9
|
+
type ApplicationRef = any;
|
|
10
|
+
type Type<T> = new (...args: any[]) => T;
|
|
11
|
+
type ApplicationConfig = any;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Opciones para registrar un módulo Angular
|
|
15
|
+
*/
|
|
16
|
+
export interface AngularRegisterOptions {
|
|
17
|
+
/** Factory del platform (platformBrowserDynamic) */
|
|
18
|
+
platformFactory?: () => any;
|
|
19
|
+
/** Providers adicionales para bootstrap */
|
|
20
|
+
providers?: any[];
|
|
21
|
+
/** Callback después de montar */
|
|
22
|
+
onMount?: (container: HTMLElement, moduleRef: NgModuleRef<any>) => void;
|
|
23
|
+
/** Callback antes de desmontar */
|
|
24
|
+
onUnmount?: (container: HTMLElement, moduleRef: NgModuleRef<any>) => void;
|
|
25
|
+
/** Permitir ejecución standalone (default: true) */
|
|
26
|
+
standalone?: boolean;
|
|
27
|
+
/** Selector para modo standalone (default: '#root') */
|
|
28
|
+
standaloneContainer?: string;
|
|
29
|
+
/** Selector del componente root (default: 'app-root') */
|
|
30
|
+
rootSelector?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Opciones para registrar un componente standalone Angular
|
|
35
|
+
*/
|
|
36
|
+
export interface AngularStandaloneOptions {
|
|
37
|
+
/** Configuración de la aplicación */
|
|
38
|
+
appConfig?: ApplicationConfig;
|
|
39
|
+
/** Callback después de montar */
|
|
40
|
+
onMount?: (container: HTMLElement, appRef: ApplicationRef) => void;
|
|
41
|
+
/** Callback antes de desmontar */
|
|
42
|
+
onUnmount?: (container: HTMLElement, appRef: ApplicationRef) => void;
|
|
43
|
+
/** Permitir ejecución standalone (default: true) */
|
|
44
|
+
standalone?: boolean;
|
|
45
|
+
/** Selector para modo standalone (default: '#root') */
|
|
46
|
+
standaloneContainer?: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Servicio de Wu Framework para Angular
|
|
51
|
+
*/
|
|
52
|
+
export interface WuService {
|
|
53
|
+
/** Emitir evento */
|
|
54
|
+
emit: (event: string, data?: any, options?: any) => void;
|
|
55
|
+
/** Suscribirse a evento */
|
|
56
|
+
on: (event: string, callback: (data: any) => void) => () => void;
|
|
57
|
+
/** Suscribirse a evento una vez */
|
|
58
|
+
once: (event: string, callback: (data: any) => void) => () => void;
|
|
59
|
+
/** Desuscribirse de evento */
|
|
60
|
+
off: (event: string, callback: (data: any) => void) => void;
|
|
61
|
+
/** Obtener estado */
|
|
62
|
+
getState: (path?: string) => any;
|
|
63
|
+
/** Establecer estado */
|
|
64
|
+
setState: (path: string, value: any) => void;
|
|
65
|
+
/** Suscribirse a cambios de estado */
|
|
66
|
+
onStateChange: (pattern: string, callback: (value: any) => void) => () => void;
|
|
67
|
+
/** Destruir servicio y limpiar suscripciones */
|
|
68
|
+
destroy: () => void;
|
|
69
|
+
/** Acceso a instancia de Wu */
|
|
70
|
+
readonly wu: WuCore | null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Configuración del componente WuSlot
|
|
75
|
+
*/
|
|
76
|
+
export interface WuSlotComponentConfig {
|
|
77
|
+
selector: string;
|
|
78
|
+
template: string;
|
|
79
|
+
styles: string[];
|
|
80
|
+
methods: {
|
|
81
|
+
ngOnInit: () => Promise<void>;
|
|
82
|
+
ngOnDestroy: () => void;
|
|
83
|
+
mountMicrofrontend: () => Promise<void>;
|
|
84
|
+
unmountMicrofrontend: () => Promise<void>;
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Configuración del módulo WuSlot
|
|
90
|
+
*/
|
|
91
|
+
export interface WuSlotModuleConfig {
|
|
92
|
+
imports: string[];
|
|
93
|
+
declarations: string[];
|
|
94
|
+
exports: string[];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Registra un módulo Angular como microfrontend
|
|
99
|
+
*/
|
|
100
|
+
export function register(
|
|
101
|
+
appName: string,
|
|
102
|
+
AppModule: Type<any>,
|
|
103
|
+
options?: AngularRegisterOptions
|
|
104
|
+
): Promise<boolean>;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Registra un componente standalone Angular como microfrontend (Angular 14+)
|
|
108
|
+
*/
|
|
109
|
+
export function registerStandalone(
|
|
110
|
+
appName: string,
|
|
111
|
+
RootComponent: Type<any>,
|
|
112
|
+
options?: AngularStandaloneOptions
|
|
113
|
+
): Promise<boolean>;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Crea un servicio Wu para usar en Angular
|
|
117
|
+
*/
|
|
118
|
+
export function createWuService(): WuService;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Crea la configuración para un componente WuSlot
|
|
122
|
+
*/
|
|
123
|
+
export function createWuSlotComponent(): WuSlotComponentConfig;
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Obtiene la configuración del módulo WuSlot
|
|
127
|
+
*/
|
|
128
|
+
export function getWuSlotModuleConfig(): WuSlotModuleConfig;
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Obtiene la instancia de Wu Framework
|
|
132
|
+
*/
|
|
133
|
+
export function getWuInstance(): WuCore | null;
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Espera a que Wu Framework esté disponible
|
|
137
|
+
*/
|
|
138
|
+
export function waitForWu(timeout?: number): Promise<WuCore>;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* API del adapter Angular
|
|
142
|
+
*/
|
|
143
|
+
export interface WuAngularAdapter {
|
|
144
|
+
register: typeof register;
|
|
145
|
+
registerStandalone: typeof registerStandalone;
|
|
146
|
+
createWuService: typeof createWuService;
|
|
147
|
+
createWuSlotComponent: typeof createWuSlotComponent;
|
|
148
|
+
getWuSlotModuleConfig: typeof getWuSlotModuleConfig;
|
|
149
|
+
getWuInstance: typeof getWuInstance;
|
|
150
|
+
waitForWu: typeof waitForWu;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export const wuAngular: WuAngularAdapter;
|
|
154
|
+
export default wuAngular;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/adapters/angular/index.js"],"sourcesContent":["/**\r\n * 🚀 WU-FRAMEWORK ANGULAR ADAPTER\r\n *\r\n * Integrates Angular (14+) with Wu Framework as microfrontends.\r\n * Supports NgModule-based apps, standalone components, and Angular Elements.\r\n * Works inside Shadow DOM (wu-framework's default isolation mode).\r\n *\r\n * ## Quick Start — Standalone Component (recommended)\r\n *\r\n * ```ts\r\n * // main.ts\r\n * import 'zone.js';\r\n * import '@angular/compiler'; // JIT mode (no AOT plugin needed)\r\n * import { createApplication } from '@angular/platform-browser';\r\n * import { createComponent, provideZoneChangeDetection } from '@angular/core';\r\n * import { wuAngular } from 'wu-framework/adapters/angular';\r\n * import { AppComponent } from './app/app.component';\r\n *\r\n * wuAngular.registerStandalone('my-app', AppComponent, {\r\n * createApplication, // pass Angular APIs to avoid bundler issues\r\n * createComponent,\r\n * provideZoneChangeDetection,\r\n * });\r\n * ```\r\n *\r\n * ## Using Wu Events & Store inside Angular\r\n *\r\n * ```ts\r\n * import { createWuService } from 'wu-framework/adapters/angular';\r\n *\r\n * @Component({ ... })\r\n * export class MyComponent implements OnInit, OnDestroy {\r\n * private wu = createWuService();\r\n *\r\n * ngOnInit() {\r\n * this.wu.on('some:event', (data) => { ... });\r\n * const user = this.wu.getState('user');\r\n * }\r\n *\r\n * ngOnDestroy() {\r\n * this.wu.destroy(); // cleans up all subscriptions\r\n * }\r\n * }\r\n * ```\r\n *\r\n * ## Vite Setup (no AnalogJS required)\r\n *\r\n * ```ts\r\n * // vite.config.ts\r\n * import { defineConfig } from 'vite';\r\n * export default defineConfig({\r\n * server: { port: 5008, cors: true },\r\n * esbuild: { target: 'es2022' },\r\n * });\r\n * ```\r\n *\r\n * ```json\r\n * // tsconfig.json — enable decorators for esbuild\r\n * { \"compilerOptions\": { \"experimentalDecorators\": true, \"useDefineForClassFields\": false } }\r\n * ```\r\n *\r\n * ## Why pass Angular APIs as options?\r\n *\r\n * When wu-framework is linked via `file:` or a monorepo, bundlers (Vite, Rollup)\r\n * resolve imports relative to the adapter's source file — NOT your app's node_modules.\r\n * Passing `createApplication`, `createComponent`, etc. from your own imports ensures\r\n * the bundler resolves them from your app's dependencies. The adapter falls back to\r\n * dynamic imports for environments where this isn't an issue (Webpack, non-bundled).\r\n */\r\n\r\n/**\r\n * Dynamic import helper — passes the module path through a function parameter\r\n * so that bundlers (Vite, Rollup, Webpack) cannot statically resolve it.\r\n * This is necessary because Angular dependencies (@angular/platform-browser-dynamic,\r\n * @angular/elements, etc.) are optional and may not be installed.\r\n */\r\nfunction _optionalImport(modulePath) {\r\n return import(/* @vite-ignore */ modulePath);\r\n}\r\n\r\n// Estado global del adapter\r\nconst adapterState = {\r\n apps: new Map(),\r\n platformRef: null,\r\n initialized: false\r\n};\r\n\r\n/**\r\n * Obtiene la instancia de Wu Framework\r\n */\r\nfunction getWuInstance() {\r\n if (typeof window === 'undefined') return null;\r\n\r\n return window.wu\r\n || window.parent?.wu\r\n || window.top?.wu\r\n || null;\r\n}\r\n\r\n/**\r\n * Espera a que Wu Framework esté disponible\r\n */\r\nfunction waitForWu(timeout = 5000) {\r\n return new Promise((resolve, reject) => {\r\n const wu = getWuInstance();\r\n if (wu) {\r\n resolve(wu);\r\n return;\r\n }\r\n\r\n const startTime = Date.now();\r\n\r\n const handleWuReady = () => {\r\n cleanup();\r\n resolve(getWuInstance());\r\n };\r\n\r\n window.addEventListener('wu:ready', handleWuReady);\r\n window.addEventListener('wu:app:ready', handleWuReady);\r\n\r\n const checkInterval = setInterval(() => {\r\n const wu = getWuInstance();\r\n if (wu) {\r\n cleanup();\r\n resolve(wu);\r\n return;\r\n }\r\n\r\n if (Date.now() - startTime > timeout) {\r\n cleanup();\r\n reject(new Error(`Wu Framework not found after ${timeout}ms`));\r\n }\r\n }, 200);\r\n\r\n function cleanup() {\r\n clearInterval(checkInterval);\r\n window.removeEventListener('wu:ready', handleWuReady);\r\n window.removeEventListener('wu:app:ready', handleWuReady);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Register an NgModule-based Angular app as a microfrontend.\r\n *\r\n * NOTE: Uses platformBrowserDynamic + bootstrapModule which does NOT work inside\r\n * Shadow DOM (it calls document.querySelector internally). For Shadow DOM compatibility,\r\n * use registerStandalone() instead — it uses createApplication + createComponent with\r\n * an explicit hostElement, which works everywhere.\r\n *\r\n * @param {string} appName - Unique name for the microfrontend\r\n * @param {Type<any>} AppModule - Main Angular module (e.g. AppModule)\r\n * @param {Object} options\r\n * @param {Function} options.platformFactory - platformBrowserDynamic (pass it to avoid bundler issues)\r\n * @param {Array} options.providers - Additional bootstrap providers\r\n * @param {Function} options.onMount - Called after mount\r\n * @param {Function} options.onUnmount - Called before unmount\r\n * @param {boolean} options.standalone - Allow standalone fallback (default: true)\r\n * @param {string} options.standaloneContainer - Selector for standalone mode (default: '#root')\r\n * @param {string} options.rootSelector - Root component selector (default: 'app-root')\r\n *\r\n * @example\r\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\r\n * import { wuAngular } from 'wu-framework/adapters/angular';\r\n * import { AppModule } from './app/app.module';\r\n *\r\n * wuAngular.register('my-app', AppModule, {\r\n * platformFactory: platformBrowserDynamic, // pass to avoid bundler issues\r\n * });\r\n */\r\nasync function register(appName, AppModule, options = {}) {\r\n const {\r\n platformFactory = null,\r\n providers = [],\r\n onMount = null,\r\n onUnmount = null,\r\n standalone = true,\r\n standaloneContainer = '#root',\r\n rootSelector = 'app-root'\r\n } = options;\r\n\r\n // Función de mount interna\r\n const mountApp = async (container) => {\r\n if (!container) {\r\n console.error(`[WuAngular] Mount failed for ${appName}: container is null`);\r\n return;\r\n }\r\n\r\n // Evitar doble mount\r\n if (adapterState.apps.has(appName)) {\r\n console.warn(`[WuAngular] ${appName} already mounted, unmounting first`);\r\n await unmountApp();\r\n }\r\n\r\n try {\r\n // Crear elemento root para Angular\r\n const appElement = document.createElement(rootSelector);\r\n appElement.setAttribute('data-wu-angular-root', appName);\r\n container.innerHTML = '';\r\n container.appendChild(appElement);\r\n\r\n // Obtener platformBrowserDynamic\r\n let platform;\r\n if (platformFactory) {\r\n platform = platformFactory;\r\n } else {\r\n // Intentar import dinámico\r\n try {\r\n const platformModule = await _optionalImport('@angular/platform-browser-dynamic');\r\n platform = platformModule.platformBrowserDynamic;\r\n } catch (e) {\r\n // Intentar desde window\r\n if (window.ng?.platformBrowserDynamic) {\r\n platform = window.ng.platformBrowserDynamic;\r\n } else {\r\n throw new Error('platformBrowserDynamic not available. Please provide it via options.platformFactory');\r\n }\r\n }\r\n }\r\n\r\n // Bootstrap del módulo\r\n const platformRef = platform(providers);\r\n const moduleRef = await platformRef.bootstrapModule(AppModule);\r\n\r\n // Guardar referencias\r\n adapterState.apps.set(appName, {\r\n platformRef,\r\n moduleRef,\r\n container,\r\n rootElement: appElement\r\n });\r\n\r\n console.log(`[WuAngular] ✅ ${appName} mounted successfully`);\r\n\r\n if (onMount) {\r\n onMount(container, moduleRef);\r\n }\r\n } catch (error) {\r\n console.error(`[WuAngular] Mount error for ${appName}:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n // Función de unmount interna\r\n const unmountApp = async (container) => {\r\n const instance = adapterState.apps.get(appName);\r\n\r\n if (instance) {\r\n try {\r\n if (onUnmount) {\r\n onUnmount(instance.container, instance.moduleRef);\r\n }\r\n\r\n // Destruir el módulo\r\n if (instance.moduleRef) {\r\n instance.moduleRef.destroy();\r\n }\r\n\r\n // Destruir la plataforma\r\n if (instance.platformRef) {\r\n instance.platformRef.destroy();\r\n }\r\n\r\n // Limpiar DOM\r\n if (instance.rootElement && instance.rootElement.parentNode) {\r\n instance.rootElement.parentNode.removeChild(instance.rootElement);\r\n }\r\n\r\n adapterState.apps.delete(appName);\r\n\r\n console.log(`[WuAngular] ✅ ${appName} unmounted successfully`);\r\n } catch (error) {\r\n console.error(`[WuAngular] Unmount error for ${appName}:`, error);\r\n }\r\n }\r\n\r\n // Limpiar container si se proporciona\r\n if (container) {\r\n container.innerHTML = '';\r\n }\r\n };\r\n\r\n // Intentar registrar con Wu Framework\r\n try {\r\n const wu = await waitForWu(3000);\r\n\r\n wu.define(appName, {\r\n mount: mountApp,\r\n unmount: unmountApp\r\n });\r\n\r\n console.log(`[WuAngular] ✅ ${appName} registered with Wu Framework`);\r\n return true;\r\n\r\n } catch (error) {\r\n console.warn(`[WuAngular] Wu Framework not available for ${appName}`);\r\n\r\n // Modo standalone si está habilitado\r\n if (standalone) {\r\n const containerElement = document.querySelector(standaloneContainer);\r\n\r\n if (containerElement) {\r\n console.log(`[WuAngular] Running ${appName} in standalone mode`);\r\n await mountApp(containerElement);\r\n return true;\r\n } else {\r\n console.warn(`[WuAngular] Standalone container ${standaloneContainer} not found`);\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Registra un componente Angular standalone como microfrontend (Angular 14+)\r\n *\r\n * @param {string} appName - Nombre único del microfrontend\r\n * @param {Type<any>} RootComponent - Componente standalone principal\r\n * @param {Object} options - Opciones adicionales\r\n * @param {ApplicationConfig} options.appConfig - Configuración de la aplicación\r\n * @param {Function} options.onMount - Callback después de montar\r\n * @param {Function} options.onUnmount - Callback antes de desmontar\r\n * @param {boolean} options.standalone - Permitir ejecución standalone (default: true)\r\n * @param {string} options.standaloneContainer - Selector para modo standalone (default: '#root')\r\n * @param {Function} options.createApplication - createApplication from @angular/platform-browser (recommended to avoid bundler issues)\r\n * @param {Function} options.createComponent - createComponent from @angular/core\r\n * @param {Function} options.provideZoneChangeDetection - provideZoneChangeDetection from @angular/core\r\n *\r\n * @example\r\n * // Angular 14+ con standalone components\r\n * import { AppComponent } from './app/app.component';\r\n * import { createApplication } from '@angular/platform-browser';\r\n * import { createComponent, provideZoneChangeDetection } from '@angular/core';\r\n *\r\n * wuAngular.registerStandalone('my-app', AppComponent, {\r\n * createApplication,\r\n * createComponent,\r\n * provideZoneChangeDetection,\r\n * });\r\n */\r\nasync function registerStandalone(appName, RootComponent, options = {}) {\r\n const {\r\n appConfig = {},\r\n onMount = null,\r\n onUnmount = null,\r\n standalone = true,\r\n standaloneContainer = '#root',\r\n createApplication: createApplicationOpt = null,\r\n createComponent: createComponentOpt = null,\r\n provideZoneChangeDetection: provideZoneChangeDetectionOpt = null\r\n } = options;\r\n\r\n // Función de mount para standalone components\r\n const mountApp = async (container) => {\r\n if (!container) {\r\n console.error(`[WuAngular] Mount failed for ${appName}: container is null`);\r\n return;\r\n }\r\n\r\n // Evitar doble mount\r\n if (adapterState.apps.has(appName)) {\r\n console.warn(`[WuAngular] ${appName} already mounted, unmounting first`);\r\n await unmountApp();\r\n }\r\n\r\n try {\r\n // Resolve Angular APIs: prefer options > dynamic import > window.ng\r\n let createApplicationFn = createApplicationOpt;\r\n let createComponentFn = createComponentOpt;\r\n let provideZoneChangeDetectionFn = provideZoneChangeDetectionOpt;\r\n\r\n if (!createApplicationFn) {\r\n try {\r\n const browserModule = await _optionalImport('@angular/platform-browser');\r\n createApplicationFn = browserModule.createApplication;\r\n const coreModule = await _optionalImport('@angular/core');\r\n createComponentFn = coreModule.createComponent;\r\n provideZoneChangeDetectionFn = coreModule.provideZoneChangeDetection;\r\n } catch (e) {\r\n if (window.ng?.createApplication) {\r\n createApplicationFn = window.ng.createApplication;\r\n createComponentFn = window.ng.createComponent;\r\n provideZoneChangeDetectionFn = window.ng.provideZoneChangeDetection;\r\n } else {\r\n throw new Error(\r\n 'Angular APIs not available. Pass createApplication, createComponent via options, ' +\r\n 'or ensure @angular/platform-browser is resolvable. See docs for example.'\r\n );\r\n }\r\n }\r\n }\r\n\r\n // Merge providers: add zone change detection if available\r\n const providers = [...(appConfig.providers || [])];\r\n if (provideZoneChangeDetectionFn) {\r\n providers.push(provideZoneChangeDetectionFn({ eventCoalescing: true }));\r\n }\r\n\r\n // Create Angular application\r\n const appRef = await createApplicationFn({ providers });\r\n\r\n // Create host element inside the container (Shadow DOM compatible)\r\n container.innerHTML = '';\r\n const selector = RootComponent.ɵcmp?.selectors?.[0]?.[0]\r\n || RootComponent.__annotations__?.[0]?.selector\r\n || 'app-root';\r\n const hostEl = document.createElement(selector);\r\n container.appendChild(hostEl);\r\n\r\n // Create and attach the component using hostElement (bypasses document.querySelector)\r\n const compRef = createComponentFn(RootComponent, {\r\n environmentInjector: appRef.injector,\r\n hostElement: hostEl,\r\n });\r\n appRef.attachView(compRef.hostView);\r\n\r\n // Guardar referencias\r\n adapterState.apps.set(appName, {\r\n appRef,\r\n compRef,\r\n container,\r\n hostElement: hostEl,\r\n isStandalone: true\r\n });\r\n\r\n console.log(`[WuAngular] ✅ ${appName} (standalone) mounted successfully`);\r\n\r\n if (onMount) {\r\n onMount(container, appRef);\r\n }\r\n } catch (error) {\r\n console.error(`[WuAngular] Mount error for ${appName}:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n // Función de unmount para standalone\r\n const unmountApp = async (container) => {\r\n const instance = adapterState.apps.get(appName);\r\n\r\n if (instance) {\r\n try {\r\n if (onUnmount) {\r\n onUnmount(instance.container, instance.appRef);\r\n }\r\n\r\n // Destruir el componente\r\n if (instance.compRef) {\r\n instance.compRef.destroy();\r\n }\r\n\r\n // Destruir la aplicación\r\n if (instance.appRef) {\r\n instance.appRef.destroy();\r\n }\r\n\r\n adapterState.apps.delete(appName);\r\n\r\n console.log(`[WuAngular] ✅ ${appName} (standalone) unmounted successfully`);\r\n } catch (error) {\r\n console.error(`[WuAngular] Unmount error for ${appName}:`, error);\r\n }\r\n }\r\n\r\n if (container) {\r\n container.innerHTML = '';\r\n }\r\n };\r\n\r\n // Intentar registrar con Wu Framework\r\n try {\r\n const wu = await waitForWu(3000);\r\n\r\n wu.define(appName, {\r\n mount: mountApp,\r\n unmount: unmountApp\r\n });\r\n\r\n console.log(`[WuAngular] ✅ ${appName} (standalone) registered with Wu Framework`);\r\n return true;\r\n\r\n } catch (error) {\r\n console.warn(`[WuAngular] Wu Framework not available for ${appName}`);\r\n\r\n if (standalone) {\r\n const containerElement = document.querySelector(standaloneContainer);\r\n\r\n if (containerElement) {\r\n console.log(`[WuAngular] Running ${appName} in standalone mode`);\r\n await mountApp(containerElement);\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Register an Angular Elements (Web Component) as a microfrontend.\r\n * Requires @angular/elements to be installed.\r\n *\r\n * @param {string} appName - Unique microfrontend name\r\n * @param {Type<any>} Component - Angular standalone component\r\n * @param {Object} options\r\n * @param {string} options.elementTag - Custom element tag (default: `${appName}-element`)\r\n * @param {ApplicationConfig} options.appConfig - Angular application config\r\n * @param {Function} options.onMount - Called after mount\r\n * @param {Function} options.onUnmount - Called before unmount\r\n * @param {boolean} options.standalone - Allow standalone fallback (default: true)\r\n * @param {string} options.standaloneContainer - Selector for standalone mode (default: '#root')\r\n *\r\n * @example\r\n * import { wuAngular } from 'wu-framework/adapters/angular';\r\n * import { AppComponent } from './app/app.component';\r\n *\r\n * wuAngular.registerElement('mfe-angular', AppComponent, {\r\n * elementTag: 'mfe-angular-content',\r\n * });\r\n */\r\nasync function registerElement(appName, Component, options = {}) {\r\n const {\r\n elementTag = `${appName}-element`,\r\n appConfig = {},\r\n onMount = null,\r\n onUnmount = null,\r\n standalone = true,\r\n standaloneContainer = '#root'\r\n } = options;\r\n\r\n let customElementRegistered = false;\r\n\r\n // Función para inicializar Angular Elements\r\n const initializeElement = async () => {\r\n if (customElementRegistered) return true;\r\n\r\n try {\r\n // Import dinámico de Angular\r\n const [{ createApplication }, { createCustomElement }] = await Promise.all([\r\n _optionalImport('@angular/platform-browser'),\r\n _optionalImport('@angular/elements')\r\n ]);\r\n\r\n // Crear aplicación Angular\r\n const app = await createApplication(appConfig);\r\n\r\n // Crear y registrar el custom element\r\n const CustomElement = createCustomElement(Component, { injector: app.injector });\r\n\r\n if (!customElements.get(elementTag)) {\r\n customElements.define(elementTag, CustomElement);\r\n console.log(`[WuAngular] ✅ Custom element registered: ${elementTag}`);\r\n }\r\n\r\n customElementRegistered = true;\r\n\r\n // Guardar referencia\r\n adapterState.apps.set(`${appName}:element`, {\r\n app,\r\n elementTag,\r\n CustomElement\r\n });\r\n\r\n return true;\r\n } catch (error) {\r\n console.error(`[WuAngular] Failed to initialize Angular Element:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n // Función de mount\r\n const mountApp = async (container) => {\r\n if (!container) {\r\n console.error(`[WuAngular] Mount failed for ${appName}: container is null`);\r\n return;\r\n }\r\n\r\n try {\r\n // Asegurar que el elemento está registrado\r\n await initializeElement();\r\n\r\n // Crear el elemento custom\r\n const element = document.createElement(elementTag);\r\n element.setAttribute('data-wu-angular-element', appName);\r\n\r\n // Limpiar y agregar al container\r\n container.innerHTML = '';\r\n container.appendChild(element);\r\n\r\n // Guardar referencia del mount\r\n adapterState.apps.set(appName, {\r\n element,\r\n container,\r\n elementTag\r\n });\r\n\r\n console.log(`[WuAngular] ✅ ${appName} (element) mounted successfully`);\r\n\r\n if (onMount) {\r\n onMount(container, element);\r\n }\r\n\r\n return element;\r\n } catch (error) {\r\n console.error(`[WuAngular] Mount error for ${appName}:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n // Función de unmount\r\n const unmountApp = async (container) => {\r\n const instance = adapterState.apps.get(appName);\r\n\r\n if (instance) {\r\n try {\r\n if (onUnmount) {\r\n onUnmount(instance.container, instance.element);\r\n }\r\n\r\n // Remover elemento del DOM\r\n if (instance.element && instance.element.parentNode) {\r\n instance.element.remove();\r\n }\r\n\r\n adapterState.apps.delete(appName);\r\n\r\n console.log(`[WuAngular] ✅ ${appName} (element) unmounted successfully`);\r\n } catch (error) {\r\n console.error(`[WuAngular] Unmount error for ${appName}:`, error);\r\n }\r\n }\r\n\r\n if (container) {\r\n container.innerHTML = '';\r\n }\r\n };\r\n\r\n // Intentar registrar con Wu Framework\r\n try {\r\n const wu = await waitForWu(3000);\r\n\r\n wu.define(appName, {\r\n mount: mountApp,\r\n unmount: unmountApp\r\n });\r\n\r\n console.log(`[WuAngular] ✅ ${appName} (element) registered with Wu Framework`);\r\n return true;\r\n\r\n } catch (error) {\r\n console.warn(`[WuAngular] Wu Framework not available for ${appName}`);\r\n\r\n if (standalone) {\r\n const containerElement = document.querySelector(standaloneContainer);\r\n\r\n if (containerElement) {\r\n console.log(`[WuAngular] Running ${appName} in standalone mode`);\r\n await mountApp(containerElement);\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Creates a lightweight service for wu-framework events and store access.\r\n * Call destroy() in ngOnDestroy to clean up all subscriptions.\r\n *\r\n * @returns {{ emit, on, once, off, getState, setState, onStateChange, destroy, wu }}\r\n *\r\n * @example\r\n * import { createWuService } from 'wu-framework/adapters/angular';\r\n *\r\n * @Component({ selector: 'app-root', standalone: true, template: '...' })\r\n * export class AppComponent implements OnInit, OnDestroy {\r\n * private wu = createWuService();\r\n *\r\n * ngOnInit() {\r\n * this.wu.on('order:new', (e) => this.orders.push(e.data));\r\n * this.wu.onStateChange('theme.mode', (e) => this.theme = e.value);\r\n * const user = this.wu.getState('user');\r\n * }\r\n *\r\n * save() {\r\n * this.wu.setState('store.name', this.storeName);\r\n * this.wu.emit('settings:saved', { name: this.storeName });\r\n * }\r\n *\r\n * ngOnDestroy() {\r\n * this.wu.destroy(); // removes all on/onStateChange listeners\r\n * }\r\n * }\r\n */\r\nfunction createWuService() {\r\n const subscriptions = [];\r\n\r\n return {\r\n // Event Bus\r\n emit: (event, data, options) => {\r\n const wu = getWuInstance();\r\n if (wu?.eventBus) {\r\n wu.eventBus.emit(event, data, options);\r\n } else {\r\n console.warn('[WuService] Wu Framework not available');\r\n }\r\n },\r\n\r\n on: (event, callback) => {\r\n const wu = getWuInstance();\r\n if (wu?.eventBus) {\r\n const unsubscribe = wu.eventBus.on(event, callback);\r\n subscriptions.push(unsubscribe);\r\n return unsubscribe;\r\n }\r\n console.warn('[WuService] Wu Framework not available');\r\n return () => {};\r\n },\r\n\r\n once: (event, callback) => {\r\n const wu = getWuInstance();\r\n if (wu?.eventBus) {\r\n return wu.eventBus.once(event, callback);\r\n }\r\n return () => {};\r\n },\r\n\r\n off: (event, callback) => {\r\n const wu = getWuInstance();\r\n if (wu?.eventBus) {\r\n wu.eventBus.off(event, callback);\r\n }\r\n },\r\n\r\n // Store\r\n getState: (path) => {\r\n const wu = getWuInstance();\r\n return wu?.store?.get(path) || null;\r\n },\r\n\r\n setState: (path, value) => {\r\n const wu = getWuInstance();\r\n if (wu?.store) {\r\n wu.store.set(path, value);\r\n }\r\n },\r\n\r\n onStateChange: (pattern, callback) => {\r\n const wu = getWuInstance();\r\n if (wu?.store) {\r\n const unsubscribe = wu.store.on(pattern, callback);\r\n subscriptions.push(unsubscribe);\r\n return unsubscribe;\r\n }\r\n return () => {};\r\n },\r\n\r\n // Cleanup\r\n destroy: () => {\r\n subscriptions.forEach(unsub => unsub());\r\n subscriptions.length = 0;\r\n },\r\n\r\n // Access to raw Wu instance\r\n get wu() {\r\n return getWuInstance();\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Crea un componente Angular para cargar microfrontends (para el Shell)\r\n * Retorna la configuración del componente para ser usado con @Component\r\n *\r\n * @example\r\n * // wu-slot.component.ts\r\n * import { Component, Input, Output, EventEmitter } from '@angular/core';\r\n * import { createWuSlotComponent } from 'wu-framework/adapters/angular';\r\n *\r\n * const config = createWuSlotComponent();\r\n *\r\n * @Component({\r\n * selector: 'wu-slot',\r\n * template: config.template,\r\n * styles: config.styles\r\n * })\r\n * export class WuSlotComponent {\r\n * @Input() name!: string;\r\n * @Input() url!: string;\r\n * @Output() load = new EventEmitter();\r\n * @Output() error = new EventEmitter();\r\n *\r\n * // ... implement lifecycle methods from config.methods\r\n * }\r\n */\r\nfunction createWuSlotComponent() {\r\n return {\r\n selector: 'wu-slot',\r\n\r\n template: `\r\n <div\r\n #container\r\n class=\"wu-slot\"\r\n [class.wu-slot-loading]=\"loading\"\r\n [class.wu-slot-error]=\"error\"\r\n [attr.data-wu-app]=\"name\"\r\n [attr.data-wu-url]=\"url\"\r\n style=\"min-height: 100px; position: relative;\">\r\n\r\n <div *ngIf=\"error\" class=\"wu-slot-error-message\"\r\n style=\"padding: 1rem; border: 1px solid #f5c6cb; border-radius: 4px; background: #f8d7da; color: #721c24;\">\r\n <strong>Error loading {{ name }}</strong>\r\n <p style=\"margin: 0.5rem 0 0 0;\">{{ error }}</p>\r\n </div>\r\n\r\n <div *ngIf=\"loading && !error\" class=\"wu-slot-loading-message\"\r\n style=\"display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;\">\r\n {{ fallbackText || 'Loading ' + name + '...' }}\r\n </div>\r\n </div>\r\n `,\r\n\r\n styles: [`\r\n .wu-slot {\r\n width: 100%;\r\n min-height: 100px;\r\n }\r\n `],\r\n\r\n // Métodos para implementar en el componente\r\n methods: {\r\n async ngOnInit() {\r\n await this.mountMicrofrontend();\r\n },\r\n\r\n ngOnDestroy() {\r\n this.unmountMicrofrontend();\r\n },\r\n\r\n async mountMicrofrontend() {\r\n try {\r\n this.loading = true;\r\n this.error = null;\r\n\r\n const wu = getWuInstance();\r\n if (!wu) {\r\n throw new Error('Wu Framework not initialized');\r\n }\r\n\r\n // Crear container único\r\n const containerId = `wu-slot-${this.name}-${Date.now()}`;\r\n const innerContainer = document.createElement('div');\r\n innerContainer.id = containerId;\r\n innerContainer.style.width = '100%';\r\n innerContainer.style.height = '100%';\r\n\r\n this.container.nativeElement.innerHTML = '';\r\n this.container.nativeElement.appendChild(innerContainer);\r\n\r\n // Crear y montar la app\r\n const app = wu.app(this.name, {\r\n url: this.url,\r\n container: `#${containerId}`,\r\n autoInit: true\r\n });\r\n\r\n this.appInstance = app;\r\n await app.mount();\r\n\r\n this.loading = false;\r\n this.load.emit({ name: this.name, url: this.url });\r\n\r\n } catch (err) {\r\n console.error(`[WuSlot] Error loading ${this.name}:`, err);\r\n this.error = err.message || 'Failed to load microfrontend';\r\n this.loading = false;\r\n this.errorEvent.emit(err);\r\n }\r\n },\r\n\r\n async unmountMicrofrontend() {\r\n if (this.appInstance) {\r\n try {\r\n await this.appInstance.unmount();\r\n } catch (err) {\r\n console.warn(`[WuSlot] Error unmounting ${this.name}:`, err);\r\n }\r\n this.appInstance = null;\r\n }\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Helper para crear un módulo Angular que exporta WuSlotComponent\r\n * Útil para shells que quieren usar <wu-slot> directamente\r\n */\r\nfunction getWuSlotModuleConfig() {\r\n return {\r\n imports: ['CommonModule'],\r\n declarations: ['WuSlotComponent'],\r\n exports: ['WuSlotComponent']\r\n };\r\n}\r\n\r\n// ============================================\r\n// AI INTEGRATION (placeholder — ai.js loaded on demand)\r\n// ============================================\r\nfunction createWuAIService(...args) {\r\n throw new Error('[WuAngular] AI module not available. Install wu-framework AI extension.');\r\n}\r\n\r\n// Named exports for direct imports (e.g. import { createWuService } from 'wu-framework/adapters/angular')\r\nexport { createWuService, register, registerStandalone, registerElement, createWuSlotComponent, getWuSlotModuleConfig, createWuAIService, getWuInstance, waitForWu };\r\n\r\n// API pública del adapter\r\nexport const wuAngular = {\r\n register,\r\n registerStandalone,\r\n registerElement,\r\n createWuService,\r\n createWuSlotComponent,\r\n getWuSlotModuleConfig,\r\n createWuAIService,\r\n getWuInstance,\r\n waitForWu\r\n};\r\n\r\nexport default wuAngular;\r\n"],"names":["_optionalImport","modulePath","import","adapterState","apps","Map","platformRef","initialized","getWuInstance","window","wu","parent","top","waitForWu","timeout","Promise","resolve","reject","startTime","Date","now","handleWuReady","cleanup","addEventListener","checkInterval","setInterval","Error","clearInterval","removeEventListener","async","register","appName","AppModule","options","platformFactory","providers","onMount","onUnmount","standalone","standaloneContainer","rootSelector","mountApp","container","has","console","warn","unmountApp","appElement","document","createElement","platform","setAttribute","innerHTML","appendChild","platformBrowserDynamic","e","ng","moduleRef","bootstrapModule","set","rootElement","log","error","instance","get","destroy","parentNode","removeChild","delete","define","mount","unmount","containerElement","querySelector","registerStandalone","RootComponent","appConfig","createApplication","createApplicationOpt","createComponent","createComponentOpt","provideZoneChangeDetection","provideZoneChangeDetectionOpt","createApplicationFn","createComponentFn","provideZoneChangeDetectionFn","coreModule","push","eventCoalescing","appRef","selector","selectors","__annotations__","hostEl","compRef","environmentInjector","injector","hostElement","attachView","hostView","isStandalone","registerElement","Component","elementTag","customElementRegistered","createCustomElement","all","app","CustomElement","customElements","initializeElement","element","remove","createWuService","subscriptions","emit","event","data","eventBus","on","callback","unsubscribe","once","off","getState","path","store","setState","value","onStateChange","pattern","forEach","unsub","length","createWuSlotComponent","template","styles","methods","ngOnInit","this","mountMicrofrontend","ngOnDestroy","unmountMicrofrontend","loading","containerId","name","innerContainer","id","style","width","height","nativeElement","url","autoInit","appInstance","load","err","message","errorEvent","getWuSlotModuleConfig","imports","declarations","exports","createWuAIService","args","wuAngular"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/adapters/angular/index.js"],"sourcesContent":["/**\n * 🚀 WU-FRAMEWORK ANGULAR ADAPTER\n *\n * Integrates Angular (14+) with Wu Framework as microfrontends.\n * Supports NgModule-based apps, standalone components, and Angular Elements.\n * Works inside Shadow DOM (wu-framework's default isolation mode).\n *\n * ## Quick Start — Standalone Component (recommended)\n *\n * ```ts\n * // main.ts\n * import 'zone.js';\n * import '@angular/compiler'; // JIT mode (no AOT plugin needed)\n * import { createApplication } from '@angular/platform-browser';\n * import { createComponent, provideZoneChangeDetection } from '@angular/core';\n * import { wuAngular } from 'wu-framework/adapters/angular';\n * import { AppComponent } from './app/app.component';\n *\n * wuAngular.registerStandalone('my-app', AppComponent, {\n * createApplication, // pass Angular APIs to avoid bundler issues\n * createComponent,\n * provideZoneChangeDetection,\n * });\n * ```\n *\n * ## Using Wu Events & Store inside Angular\n *\n * ```ts\n * import { createWuService } from 'wu-framework/adapters/angular';\n *\n * @Component({ ... })\n * export class MyComponent implements OnInit, OnDestroy {\n * private wu = createWuService();\n *\n * ngOnInit() {\n * this.wu.on('some:event', (data) => { ... });\n * const user = this.wu.getState('user');\n * }\n *\n * ngOnDestroy() {\n * this.wu.destroy(); // cleans up all subscriptions\n * }\n * }\n * ```\n *\n * ## Vite Setup (no AnalogJS required)\n *\n * ```ts\n * // vite.config.ts\n * import { defineConfig } from 'vite';\n * export default defineConfig({\n * server: { port: 5008, cors: true },\n * esbuild: { target: 'es2022' },\n * });\n * ```\n *\n * ```json\n * // tsconfig.json — enable decorators for esbuild\n * { \"compilerOptions\": { \"experimentalDecorators\": true, \"useDefineForClassFields\": false } }\n * ```\n *\n * ## Why pass Angular APIs as options?\n *\n * When wu-framework is linked via `file:` or a monorepo, bundlers (Vite, Rollup)\n * resolve imports relative to the adapter's source file — NOT your app's node_modules.\n * Passing `createApplication`, `createComponent`, etc. from your own imports ensures\n * the bundler resolves them from your app's dependencies. The adapter falls back to\n * dynamic imports for environments where this isn't an issue (Webpack, non-bundled).\n */\n\n/**\n * Dynamic import helper — passes the module path through a function parameter\n * so that bundlers (Vite, Rollup, Webpack) cannot statically resolve it.\n * This is necessary because Angular dependencies (@angular/platform-browser-dynamic,\n * @angular/elements, etc.) are optional and may not be installed.\n */\nfunction _optionalImport(modulePath) {\n return import(/* @vite-ignore */ modulePath);\n}\n\n// Estado global del adapter\nconst adapterState = {\n apps: new Map(),\n platformRef: 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 * Register an NgModule-based Angular app as a microfrontend.\n *\n * NOTE: Uses platformBrowserDynamic + bootstrapModule which does NOT work inside\n * Shadow DOM (it calls document.querySelector internally). For Shadow DOM compatibility,\n * use registerStandalone() instead — it uses createApplication + createComponent with\n * an explicit hostElement, which works everywhere.\n *\n * @param {string} appName - Unique name for the microfrontend\n * @param {Type<any>} AppModule - Main Angular module (e.g. AppModule)\n * @param {Object} options\n * @param {Function} options.platformFactory - platformBrowserDynamic (pass it to avoid bundler issues)\n * @param {Array} options.providers - Additional bootstrap providers\n * @param {Function} options.onMount - Called after mount\n * @param {Function} options.onUnmount - Called before unmount\n * @param {boolean} options.standalone - Allow standalone fallback (default: true)\n * @param {string} options.standaloneContainer - Selector for standalone mode (default: '#root')\n * @param {string} options.rootSelector - Root component selector (default: 'app-root')\n *\n * @example\n * import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n * import { wuAngular } from 'wu-framework/adapters/angular';\n * import { AppModule } from './app/app.module';\n *\n * wuAngular.register('my-app', AppModule, {\n * platformFactory: platformBrowserDynamic, // pass to avoid bundler issues\n * });\n */\nasync function register(appName, AppModule, options = {}) {\n const {\n platformFactory = null,\n providers = [],\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#root',\n rootSelector = 'app-root'\n } = options;\n\n // Función de mount interna\n const mountApp = async (container) => {\n if (!container) {\n console.error(`[WuAngular] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Evitar doble mount\n if (adapterState.apps.has(appName)) {\n console.warn(`[WuAngular] ${appName} already mounted, unmounting first`);\n await unmountApp();\n }\n\n try {\n // Crear elemento root para Angular\n const appElement = document.createElement(rootSelector);\n appElement.setAttribute('data-wu-angular-root', appName);\n container.innerHTML = '';\n container.appendChild(appElement);\n\n // Obtener platformBrowserDynamic\n let platform;\n if (platformFactory) {\n platform = platformFactory;\n } else {\n // Intentar import dinámico\n try {\n const platformModule = await _optionalImport('@angular/platform-browser-dynamic');\n platform = platformModule.platformBrowserDynamic;\n } catch (e) {\n // Intentar desde window\n if (window.ng?.platformBrowserDynamic) {\n platform = window.ng.platformBrowserDynamic;\n } else {\n throw new Error('platformBrowserDynamic not available. Please provide it via options.platformFactory');\n }\n }\n }\n\n // Bootstrap del módulo\n const platformRef = platform(providers);\n const moduleRef = await platformRef.bootstrapModule(AppModule);\n\n // Guardar referencias\n adapterState.apps.set(appName, {\n platformRef,\n moduleRef,\n container,\n rootElement: appElement\n });\n\n console.log(`[WuAngular] ✅ ${appName} mounted successfully`);\n\n if (onMount) {\n onMount(container, moduleRef);\n }\n } catch (error) {\n console.error(`[WuAngular] Mount error for ${appName}:`, error);\n throw error;\n }\n };\n\n // Función de unmount interna\n const unmountApp = async (container) => {\n const instance = adapterState.apps.get(appName);\n\n if (instance) {\n try {\n if (onUnmount) {\n onUnmount(instance.container, instance.moduleRef);\n }\n\n // Destruir el módulo\n if (instance.moduleRef) {\n instance.moduleRef.destroy();\n }\n\n // Destruir la plataforma\n if (instance.platformRef) {\n instance.platformRef.destroy();\n }\n\n // Limpiar DOM\n if (instance.rootElement && instance.rootElement.parentNode) {\n instance.rootElement.parentNode.removeChild(instance.rootElement);\n }\n\n adapterState.apps.delete(appName);\n\n console.log(`[WuAngular] ✅ ${appName} unmounted successfully`);\n } catch (error) {\n console.error(`[WuAngular] Unmount error for ${appName}:`, error);\n }\n }\n\n // Limpiar container si se proporciona\n if (container) {\n container.innerHTML = '';\n }\n };\n\n // Intentar registrar con Wu Framework\n try {\n const wu = await waitForWu(3000);\n\n wu.define(appName, {\n mount: mountApp,\n unmount: unmountApp\n });\n\n console.log(`[WuAngular] ✅ ${appName} registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuAngular] Wu Framework not available for ${appName}`);\n\n // Modo standalone si está habilitado\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n\n if (containerElement) {\n console.log(`[WuAngular] Running ${appName} in standalone mode`);\n await mountApp(containerElement);\n return true;\n } else {\n console.warn(`[WuAngular] Standalone container ${standaloneContainer} not found`);\n }\n }\n\n return false;\n }\n}\n\n/**\n * Registra un componente Angular standalone como microfrontend (Angular 14+)\n *\n * @param {string} appName - Nombre único del microfrontend\n * @param {Type<any>} RootComponent - Componente standalone principal\n * @param {Object} options - Opciones adicionales\n * @param {ApplicationConfig} options.appConfig - Configuración de la aplicación\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 * @param {Function} options.createApplication - createApplication from @angular/platform-browser (recommended to avoid bundler issues)\n * @param {Function} options.createComponent - createComponent from @angular/core\n * @param {Function} options.provideZoneChangeDetection - provideZoneChangeDetection from @angular/core\n *\n * @example\n * // Angular 14+ con standalone components\n * import { AppComponent } from './app/app.component';\n * import { createApplication } from '@angular/platform-browser';\n * import { createComponent, provideZoneChangeDetection } from '@angular/core';\n *\n * wuAngular.registerStandalone('my-app', AppComponent, {\n * createApplication,\n * createComponent,\n * provideZoneChangeDetection,\n * });\n */\nasync function registerStandalone(appName, RootComponent, options = {}) {\n const {\n appConfig = {},\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#root',\n createApplication: createApplicationOpt = null,\n createComponent: createComponentOpt = null,\n provideZoneChangeDetection: provideZoneChangeDetectionOpt = null\n } = options;\n\n // Función de mount para standalone components\n const mountApp = async (container) => {\n if (!container) {\n console.error(`[WuAngular] Mount failed for ${appName}: container is null`);\n return;\n }\n\n // Evitar doble mount\n if (adapterState.apps.has(appName)) {\n console.warn(`[WuAngular] ${appName} already mounted, unmounting first`);\n await unmountApp();\n }\n\n try {\n // Resolve Angular APIs: prefer options > dynamic import > window.ng\n let createApplicationFn = createApplicationOpt;\n let createComponentFn = createComponentOpt;\n let provideZoneChangeDetectionFn = provideZoneChangeDetectionOpt;\n\n if (!createApplicationFn) {\n try {\n const browserModule = await _optionalImport('@angular/platform-browser');\n createApplicationFn = browserModule.createApplication;\n const coreModule = await _optionalImport('@angular/core');\n createComponentFn = coreModule.createComponent;\n provideZoneChangeDetectionFn = coreModule.provideZoneChangeDetection;\n } catch (e) {\n if (window.ng?.createApplication) {\n createApplicationFn = window.ng.createApplication;\n createComponentFn = window.ng.createComponent;\n provideZoneChangeDetectionFn = window.ng.provideZoneChangeDetection;\n } else {\n throw new Error(\n 'Angular APIs not available. Pass createApplication, createComponent via options, ' +\n 'or ensure @angular/platform-browser is resolvable. See docs for example.'\n );\n }\n }\n }\n\n // Merge providers: add zone change detection if available\n const providers = [...(appConfig.providers || [])];\n if (provideZoneChangeDetectionFn) {\n providers.push(provideZoneChangeDetectionFn({ eventCoalescing: true }));\n }\n\n // Create Angular application\n const appRef = await createApplicationFn({ providers });\n\n // Create host element inside the container (Shadow DOM compatible)\n container.innerHTML = '';\n const selector = RootComponent.ɵcmp?.selectors?.[0]?.[0]\n || RootComponent.__annotations__?.[0]?.selector\n || 'app-root';\n const hostEl = document.createElement(selector);\n container.appendChild(hostEl);\n\n // Create and attach the component using hostElement (bypasses document.querySelector)\n const compRef = createComponentFn(RootComponent, {\n environmentInjector: appRef.injector,\n hostElement: hostEl,\n });\n appRef.attachView(compRef.hostView);\n\n // Guardar referencias\n adapterState.apps.set(appName, {\n appRef,\n compRef,\n container,\n hostElement: hostEl,\n isStandalone: true\n });\n\n console.log(`[WuAngular] ✅ ${appName} (standalone) mounted successfully`);\n\n if (onMount) {\n onMount(container, appRef);\n }\n } catch (error) {\n console.error(`[WuAngular] Mount error for ${appName}:`, error);\n throw error;\n }\n };\n\n // Función de unmount para standalone\n const unmountApp = async (container) => {\n const instance = adapterState.apps.get(appName);\n\n if (instance) {\n try {\n if (onUnmount) {\n onUnmount(instance.container, instance.appRef);\n }\n\n // Destruir el componente\n if (instance.compRef) {\n instance.compRef.destroy();\n }\n\n // Destruir la aplicación\n if (instance.appRef) {\n instance.appRef.destroy();\n }\n\n adapterState.apps.delete(appName);\n\n console.log(`[WuAngular] ✅ ${appName} (standalone) unmounted successfully`);\n } catch (error) {\n console.error(`[WuAngular] 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(`[WuAngular] ✅ ${appName} (standalone) registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuAngular] Wu Framework not available for ${appName}`);\n\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n\n if (containerElement) {\n console.log(`[WuAngular] Running ${appName} in standalone mode`);\n await mountApp(containerElement);\n return true;\n }\n }\n\n return false;\n }\n}\n\n/**\n * Register an Angular Elements (Web Component) as a microfrontend.\n * Requires @angular/elements to be installed.\n *\n * @param {string} appName - Unique microfrontend name\n * @param {Type<any>} Component - Angular standalone component\n * @param {Object} options\n * @param {string} options.elementTag - Custom element tag (default: `${appName}-element`)\n * @param {ApplicationConfig} options.appConfig - Angular application config\n * @param {Function} options.onMount - Called after mount\n * @param {Function} options.onUnmount - Called before unmount\n * @param {boolean} options.standalone - Allow standalone fallback (default: true)\n * @param {string} options.standaloneContainer - Selector for standalone mode (default: '#root')\n *\n * @example\n * import { wuAngular } from 'wu-framework/adapters/angular';\n * import { AppComponent } from './app/app.component';\n *\n * wuAngular.registerElement('mfe-angular', AppComponent, {\n * elementTag: 'mfe-angular-content',\n * });\n */\nasync function registerElement(appName, Component, options = {}) {\n const {\n elementTag = `${appName}-element`,\n appConfig = {},\n onMount = null,\n onUnmount = null,\n standalone = true,\n standaloneContainer = '#root'\n } = options;\n\n let customElementRegistered = false;\n\n // Función para inicializar Angular Elements\n const initializeElement = async () => {\n if (customElementRegistered) return true;\n\n try {\n // Import dinámico de Angular\n const [{ createApplication }, { createCustomElement }] = await Promise.all([\n _optionalImport('@angular/platform-browser'),\n _optionalImport('@angular/elements')\n ]);\n\n // Crear aplicación Angular\n const app = await createApplication(appConfig);\n\n // Crear y registrar el custom element\n const CustomElement = createCustomElement(Component, { injector: app.injector });\n\n if (!customElements.get(elementTag)) {\n customElements.define(elementTag, CustomElement);\n console.log(`[WuAngular] ✅ Custom element registered: ${elementTag}`);\n }\n\n customElementRegistered = true;\n\n // Guardar referencia\n adapterState.apps.set(`${appName}:element`, {\n app,\n elementTag,\n CustomElement\n });\n\n return true;\n } catch (error) {\n console.error(`[WuAngular] Failed to initialize Angular Element:`, error);\n throw error;\n }\n };\n\n // Función de mount\n const mountApp = async (container) => {\n if (!container) {\n console.error(`[WuAngular] Mount failed for ${appName}: container is null`);\n return;\n }\n\n try {\n // Asegurar que el elemento está registrado\n await initializeElement();\n\n // Crear el elemento custom\n const element = document.createElement(elementTag);\n element.setAttribute('data-wu-angular-element', appName);\n\n // Limpiar y agregar al container\n container.innerHTML = '';\n container.appendChild(element);\n\n // Guardar referencia del mount\n adapterState.apps.set(appName, {\n element,\n container,\n elementTag\n });\n\n console.log(`[WuAngular] ✅ ${appName} (element) mounted successfully`);\n\n if (onMount) {\n onMount(container, element);\n }\n\n return element;\n } catch (error) {\n console.error(`[WuAngular] Mount error for ${appName}:`, error);\n throw error;\n }\n };\n\n // Función de unmount\n const unmountApp = async (container) => {\n const instance = adapterState.apps.get(appName);\n\n if (instance) {\n try {\n if (onUnmount) {\n onUnmount(instance.container, instance.element);\n }\n\n // Remover elemento del DOM\n if (instance.element && instance.element.parentNode) {\n instance.element.remove();\n }\n\n adapterState.apps.delete(appName);\n\n console.log(`[WuAngular] ✅ ${appName} (element) unmounted successfully`);\n } catch (error) {\n console.error(`[WuAngular] 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(`[WuAngular] ✅ ${appName} (element) registered with Wu Framework`);\n return true;\n\n } catch (error) {\n console.warn(`[WuAngular] Wu Framework not available for ${appName}`);\n\n if (standalone) {\n const containerElement = document.querySelector(standaloneContainer);\n\n if (containerElement) {\n console.log(`[WuAngular] Running ${appName} in standalone mode`);\n await mountApp(containerElement);\n return true;\n }\n }\n\n return false;\n }\n}\n\n/**\n * Creates a lightweight service for wu-framework events and store access.\n * Call destroy() in ngOnDestroy to clean up all subscriptions.\n *\n * @returns {{ emit, on, once, off, getState, setState, onStateChange, destroy, wu }}\n *\n * @example\n * import { createWuService } from 'wu-framework/adapters/angular';\n *\n * @Component({ selector: 'app-root', standalone: true, template: '...' })\n * export class AppComponent implements OnInit, OnDestroy {\n * private wu = createWuService();\n *\n * ngOnInit() {\n * this.wu.on('order:new', (e) => this.orders.push(e.data));\n * this.wu.onStateChange('theme.mode', (e) => this.theme = e.value);\n * const user = this.wu.getState('user');\n * }\n *\n * save() {\n * this.wu.setState('store.name', this.storeName);\n * this.wu.emit('settings:saved', { name: this.storeName });\n * }\n *\n * ngOnDestroy() {\n * this.wu.destroy(); // removes all on/onStateChange listeners\n * }\n * }\n */\nfunction createWuService() {\n const subscriptions = [];\n\n return {\n // Event Bus\n emit: (event, data, options) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n wu.eventBus.emit(event, data, options);\n } else {\n console.warn('[WuService] Wu Framework not available');\n }\n },\n\n on: (event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n const unsubscribe = wu.eventBus.on(event, callback);\n subscriptions.push(unsubscribe);\n return unsubscribe;\n }\n console.warn('[WuService] Wu Framework not available');\n return () => {};\n },\n\n once: (event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n return wu.eventBus.once(event, callback);\n }\n return () => {};\n },\n\n off: (event, callback) => {\n const wu = getWuInstance();\n if (wu?.eventBus) {\n wu.eventBus.off(event, callback);\n }\n },\n\n // Store\n getState: (path) => {\n const wu = getWuInstance();\n return wu?.store?.get(path) || null;\n },\n\n setState: (path, value) => {\n const wu = getWuInstance();\n if (wu?.store) {\n wu.store.set(path, value);\n }\n },\n\n onStateChange: (pattern, callback) => {\n const wu = getWuInstance();\n if (wu?.store) {\n const unsubscribe = wu.store.on(pattern, callback);\n subscriptions.push(unsubscribe);\n return unsubscribe;\n }\n return () => {};\n },\n\n // Cleanup\n destroy: () => {\n subscriptions.forEach(unsub => unsub());\n subscriptions.length = 0;\n },\n\n // Access to raw Wu instance\n get wu() {\n return getWuInstance();\n }\n };\n}\n\n/**\n * Crea un componente Angular para cargar microfrontends (para el Shell)\n * Retorna la configuración del componente para ser usado con @Component\n *\n * @example\n * // wu-slot.component.ts\n * import { Component, Input, Output, EventEmitter } from '@angular/core';\n * import { createWuSlotComponent } from 'wu-framework/adapters/angular';\n *\n * const config = createWuSlotComponent();\n *\n * @Component({\n * selector: 'wu-slot',\n * template: config.template,\n * styles: config.styles\n * })\n * export class WuSlotComponent {\n * @Input() name!: string;\n * @Input() url!: string;\n * @Output() load = new EventEmitter();\n * @Output() error = new EventEmitter();\n *\n * // ... implement lifecycle methods from config.methods\n * }\n */\nfunction createWuSlotComponent() {\n return {\n selector: 'wu-slot',\n\n template: `\n <div\n #container\n class=\"wu-slot\"\n [class.wu-slot-loading]=\"loading\"\n [class.wu-slot-error]=\"error\"\n [attr.data-wu-app]=\"name\"\n [attr.data-wu-url]=\"url\"\n style=\"min-height: 100px; position: relative;\">\n\n <div *ngIf=\"error\" class=\"wu-slot-error-message\"\n style=\"padding: 1rem; border: 1px solid #f5c6cb; border-radius: 4px; background: #f8d7da; color: #721c24;\">\n <strong>Error loading {{ name }}</strong>\n <p style=\"margin: 0.5rem 0 0 0;\">{{ error }}</p>\n </div>\n\n <div *ngIf=\"loading && !error\" class=\"wu-slot-loading-message\"\n style=\"display: flex; align-items: center; justify-content: center; padding: 2rem; color: #666;\">\n {{ fallbackText || 'Loading ' + name + '...' }}\n </div>\n </div>\n `,\n\n styles: [`\n .wu-slot {\n width: 100%;\n min-height: 100px;\n }\n `],\n\n // Métodos para implementar en el componente\n methods: {\n async ngOnInit() {\n await this.mountMicrofrontend();\n },\n\n ngOnDestroy() {\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 // Crear container único\n const containerId = `wu-slot-${this.name}-${Date.now()}`;\n const innerContainer = document.createElement('div');\n innerContainer.id = containerId;\n innerContainer.style.width = '100%';\n innerContainer.style.height = '100%';\n\n this.container.nativeElement.innerHTML = '';\n this.container.nativeElement.appendChild(innerContainer);\n\n // Crear y montar la app\n const app = wu.app(this.name, {\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.load.emit({ name: this.name, url: this.url });\n\n } catch (err) {\n console.error(`[WuSlot] Error loading ${this.name}:`, err);\n this.error = err.message || 'Failed to load microfrontend';\n this.loading = false;\n this.errorEvent.emit(err);\n }\n },\n\n async unmountMicrofrontend() {\n if (this.appInstance) {\n try {\n await this.appInstance.unmount();\n } catch (err) {\n console.warn(`[WuSlot] Error unmounting ${this.name}:`, err);\n }\n this.appInstance = null;\n }\n }\n }\n };\n}\n\n/**\n * Helper para crear un módulo Angular que exporta WuSlotComponent\n * Útil para shells que quieren usar <wu-slot> directamente\n */\nfunction getWuSlotModuleConfig() {\n return {\n imports: ['CommonModule'],\n declarations: ['WuSlotComponent'],\n exports: ['WuSlotComponent']\n };\n}\n\n// ============================================\n// AI INTEGRATION (placeholder — ai.js loaded on demand)\n// ============================================\nfunction createWuAIService(...args) {\n throw new Error('[WuAngular] AI module not available. Install wu-framework AI extension.');\n}\n\n// Named exports for direct imports (e.g. import { createWuService } from 'wu-framework/adapters/angular')\nexport { createWuService, register, registerStandalone, registerElement, createWuSlotComponent, getWuSlotModuleConfig, createWuAIService, getWuInstance, waitForWu };\n\n// API pública del adapter\nexport const wuAngular = {\n register,\n registerStandalone,\n registerElement,\n createWuService,\n createWuSlotComponent,\n getWuSlotModuleConfig,\n createWuAIService,\n getWuInstance,\n waitForWu\n};\n\nexport default wuAngular;\n"],"names":["_optionalImport","modulePath","import","adapterState","apps","Map","platformRef","initialized","getWuInstance","window","wu","parent","top","waitForWu","timeout","Promise","resolve","reject","startTime","Date","now","handleWuReady","cleanup","addEventListener","checkInterval","setInterval","Error","clearInterval","removeEventListener","async","register","appName","AppModule","options","platformFactory","providers","onMount","onUnmount","standalone","standaloneContainer","rootSelector","mountApp","container","has","console","warn","unmountApp","appElement","document","createElement","platform","setAttribute","innerHTML","appendChild","platformBrowserDynamic","e","ng","moduleRef","bootstrapModule","set","rootElement","log","error","instance","get","destroy","parentNode","removeChild","delete","define","mount","unmount","containerElement","querySelector","registerStandalone","RootComponent","appConfig","createApplication","createApplicationOpt","createComponent","createComponentOpt","provideZoneChangeDetection","provideZoneChangeDetectionOpt","createApplicationFn","createComponentFn","provideZoneChangeDetectionFn","coreModule","push","eventCoalescing","appRef","selector","selectors","__annotations__","hostEl","compRef","environmentInjector","injector","hostElement","attachView","hostView","isStandalone","registerElement","Component","elementTag","customElementRegistered","createCustomElement","all","app","CustomElement","customElements","initializeElement","element","remove","createWuService","subscriptions","emit","event","data","eventBus","on","callback","unsubscribe","once","off","getState","path","store","setState","value","onStateChange","pattern","forEach","unsub","length","createWuSlotComponent","template","styles","methods","ngOnInit","this","mountMicrofrontend","ngOnDestroy","unmountMicrofrontend","loading","containerId","name","innerContainer","id","style","width","height","nativeElement","url","autoInit","appInstance","load","err","message","errorEvent","getWuSlotModuleConfig","imports","declarations","exports","createWuAIService","args","wuAngular"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
// Re-export from folder structure — backward compatibility
|
|
2
|
-
export * from './angular/index';
|
|
3
|
-
export { default } from './angular/index';
|
|
1
|
+
// Re-export from folder structure — backward compatibility
|
|
2
|
+
export * from './angular/index';
|
|
3
|
+
export { default } from './angular/index';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/adapters/index.js"],"sourcesContent":["/**\r\n * 🚀 WU-FRAMEWORK ADAPTERS\r\n *\r\n * Adapters oficiales para integrar Wu Framework con frameworks populares.\r\n * Soporta: React, Vue, Angular, Svelte, Preact, Solid.js, Lit, Vanilla JS,\r\n * Alpine.js, Qwik, Stencil, HTMX, Stimulus\r\n *\r\n * ⚠️ TREE-SHAKING: importa siempre desde el subpath específico, NO desde el barrel.\r\n *\r\n * ✅ import { wuReact } from 'wu-framework/adapters/react'; // ~3 KB\r\n * ❌ import { wuReact } from 'wu-framework/adapters'; // arrastra otros 12\r\n *\r\n * El barrel mantiene los re-exports nombrados (tree-shakeable con bundlers que\r\n * respetan `sideEffects: false`), pero los 13 adapters como objeto eager (`adapters.react`)\r\n * fue eliminado en v2.0 — usa `loadAdapter('react')` async si lo necesitas dinámicamente.\r\n *\r\n * @example\r\n * // Recomendado: import por subpath\r\n * import { wuReact } from 'wu-framework/adapters/react';\r\n * import { wuVue } from 'wu-framework/adapters/vue';\r\n *\r\n * @example\r\n * // Dinámico (carga bajo demanda)\r\n * import { loadAdapter } from 'wu-framework/adapters';\r\n * const wuReact = await loadAdapter('react');\r\n */\r\n\r\n// ============================================\r\n// REACT ADAPTER\r\n// ============================================\r\nexport {\r\n wuReact,\r\n register as registerReact,\r\n createWuSlot,\r\n createUseWuEvents,\r\n createUseWuStore,\r\n createUseWuAI\r\n} from './react/index.js';\r\n\r\n// ============================================\r\n// VUE ADAPTER\r\n// ============================================\r\nexport {\r\n wuVue,\r\n register as registerVue,\r\n WuSlot,\r\n useWuEvents,\r\n useWuStore,\r\n wuVuePlugin,\r\n createUseWuAI as createVueUseWuAI,\r\n useWuAI as useVueWuAI\r\n} from './vue/index.js';\r\n\r\n// ============================================\r\n// ANGULAR ADAPTER\r\n// ============================================\r\nexport {\r\n wuAngular,\r\n register as registerAngular,\r\n registerStandalone as registerAngularStandalone,\r\n createWuService,\r\n createWuSlotComponent,\r\n getWuSlotModuleConfig,\r\n createWuAIService\r\n} from './angular/index.js';\r\n\r\n// ============================================\r\n// SVELTE ADAPTER\r\n// ============================================\r\nexport {\r\n wuSvelte,\r\n register as registerSvelte,\r\n registerSvelte5,\r\n createWuStore as createSvelteWuStore,\r\n createWuEventStore,\r\n useWuEvents as useSvelteWuEvents,\r\n createWuSlotConfig,\r\n createWuAIStore\r\n} from './svelte/index.js';\r\n\r\n// ============================================\r\n// PREACT ADAPTER\r\n// ============================================\r\nexport {\r\n wuPreact,\r\n register as registerPreact,\r\n registerCompat as registerPreactCompat,\r\n createWuSlot as createPreactWuSlot,\r\n createUseWuEvents as createPreactUseWuEvents,\r\n createUseWuStore as createPreactUseWuStore,\r\n createUseWuAI as createPreactUseWuAI\r\n} from './preact/index.js';\r\n\r\n// ============================================\r\n// SOLID.JS ADAPTER\r\n// ============================================\r\nexport {\r\n wuSolid,\r\n register as registerSolid,\r\n createWuSlot as createSolidWuSlot,\r\n createWuStore as createSolidWuStore,\r\n createWuEvent,\r\n useWuEvents as useSolidWuEvents,\r\n createWuContext,\r\n createUseWuAI as createSolidUseWuAI\r\n} from './solid/index.js';\r\n\r\n// ============================================\r\n// LIT (WEB COMPONENTS) ADAPTER\r\n// ============================================\r\nexport {\r\n wuLit,\r\n register as registerLit,\r\n registerWebComponent,\r\n createWuSlotElement,\r\n WuMixin,\r\n WuAIMixin,\r\n wuProperty,\r\n createSimpleElement\r\n} from './lit/index.js';\r\n\r\n// ============================================\r\n// VANILLA JS ADAPTER\r\n// ============================================\r\nexport {\r\n wuVanilla,\r\n register as registerVanilla,\r\n registerClass,\r\n registerTemplate,\r\n createComponent,\r\n createWuSlot as createVanillaWuSlot,\r\n useWuEvents as useVanillaWuEvents,\r\n useWuStore as useVanillaWuStore,\r\n useWuAI as useVanillaWuAI\r\n} from './vanilla/index.js';\r\n\r\n// ============================================\r\n// ALPINE.JS ADAPTER\r\n// ============================================\r\nexport {\r\n wuAlpine,\r\n register as registerAlpine\r\n} from './alpine/index.js';\r\n\r\n// ============================================\r\n// QWIK ADAPTER\r\n// ============================================\r\nexport {\r\n wuQwik,\r\n register as registerQwik\r\n} from './qwik/index.js';\r\n\r\n// ============================================\r\n// STENCIL ADAPTER\r\n// ============================================\r\nexport {\r\n wuStencil,\r\n register as registerStencil\r\n} from './stencil/index.js';\r\n\r\n// ============================================\r\n// HTMX ADAPTER\r\n// ============================================\r\nexport {\r\n wuHtmx,\r\n register as registerHtmx\r\n} from './htmx/index.js';\r\n\r\n// ============================================\r\n// STIMULUS ADAPTER\r\n// ============================================\r\nexport {\r\n wuStimulus,\r\n register as registerStimulus\r\n} from './stimulus/index.js';\r\n\r\n// ============================================\r\n// SHARED UTILITIES\r\n// ============================================\r\nexport { getWuInstance, waitForWu } from './shared.js';\r\n\r\n// ============================================\r\n// LAZY ADAPTER LOADER (replaces the eager `adapters` object from v1.x)\r\n// ============================================\r\n\r\nconst ADAPTER_LOADERS = {\r\n react: () => import('./react/index.js').then(m => m.wuReact),\r\n vue: () => import('./vue/index.js').then(m => m.wuVue),\r\n angular: () => import('./angular/index.js').then(m => m.wuAngular),\r\n svelte: () => import('./svelte/index.js').then(m => m.wuSvelte),\r\n preact: () => import('./preact/index.js').then(m => m.wuPreact),\r\n solid: () => import('./solid/index.js').then(m => m.wuSolid),\r\n lit: () => import('./lit/index.js').then(m => m.wuLit),\r\n vanilla: () => import('./vanilla/index.js').then(m => m.wuVanilla),\r\n alpine: () => import('./alpine/index.js').then(m => m.wuAlpine),\r\n qwik: () => import('./qwik/index.js').then(m => m.wuQwik),\r\n stencil: () => import('./stencil/index.js').then(m => m.wuStencil),\r\n htmx: () => import('./htmx/index.js').then(m => m.wuHtmx),\r\n stimulus: () => import('./stimulus/index.js').then(m => m.wuStimulus)\r\n};\r\n\r\nconst _adapterCache = {};\r\n// In-flight loads, keyed by adapter name. Two concurrent loadAdapter('react')\r\n// calls share the same Promise instead of triggering a duplicate import().\r\n// ESM caches modules by URL so the second import would resolve to the same\r\n// instance, but we'd waste the network round-trip + parse work.\r\nconst _loadingPromises = {};\r\n\r\n/**\r\n * Load an adapter on demand. Returns a Promise that resolves to the wuX object.\r\n * Concurrent calls share the same in-flight promise.\r\n *\r\n * Replaces the eager `adapters` object that pulled all 13 frameworks at load time.\r\n *\r\n * @param {keyof typeof ADAPTER_LOADERS} name\r\n * @returns {Promise<object>}\r\n *\r\n * @example\r\n * const wuReact = await loadAdapter('react');\r\n * wuReact.register('cart', CartApp);\r\n */\r\nexport function loadAdapter(name) {\r\n if (_adapterCache[name]) return Promise.resolve(_adapterCache[name]);\r\n if (_loadingPromises[name]) return _loadingPromises[name];\r\n\r\n const loader = ADAPTER_LOADERS[name];\r\n if (!loader) {\r\n return Promise.reject(new Error(\r\n `[wu-framework] Unknown adapter: '${name}'. ` +\r\n `Available: ${Object.keys(ADAPTER_LOADERS).join(', ')}.`\r\n ));\r\n }\r\n\r\n _loadingPromises[name] = loader().then(\r\n adapter => {\r\n _adapterCache[name] = adapter;\r\n delete _loadingPromises[name];\r\n return adapter;\r\n },\r\n err => {\r\n // On failure, clear the in-flight slot so a retry is possible\r\n delete _loadingPromises[name];\r\n throw err;\r\n }\r\n );\r\n return _loadingPromises[name];\r\n}\r\n\r\n/**\r\n * Names of available adapters. Use with loadAdapter() to iterate.\r\n */\r\nexport const ADAPTER_NAMES = Object.freeze(Object.keys(ADAPTER_LOADERS));\r\n"],"names":["ADAPTER_LOADERS","react","import","then","m","wuReact","vue","wuVue","angular","wuAngular","svelte","wuSvelte","preact","wuPreact","solid","wuSolid","lit","wuLit","vanilla","wuVanilla","alpine","wuAlpine","qwik","wuQwik","stencil","wuStencil","htmx","wuHtmx","stimulus","wuStimulus","_adapterCache","_loadingPromises","loadAdapter","name","Promise","resolve","loader","adapter","err","reject","Error","Object","keys","join","ADAPTER_NAMES","freeze"],"mappings":"ojEAyLA,MAAMA,EAAkB,CACtBC,MAAU,IAAMC,OAAO,oBAAoBC,KAAKC,GAAKA,EAAEC,SACvDC,IAAU,IAAMJ,OAAO,kBAAkBC,KAAKC,GAAKA,EAAEG,OACrDC,QAAU,IAAMN,OAAO,sBAAsBC,KAAKC,GAAKA,EAAEK,WACzDC,OAAU,IAAMR,OAAO,qBAAqBC,KAAKC,GAAKA,EAAEO,UACxDC,OAAU,IAAMV,OAAO,qBAAqBC,KAAKC,GAAKA,EAAES,UACxDC,MAAU,IAAMZ,OAAO,oBAAoBC,KAAKC,GAAKA,EAAEW,SACvDC,IAAU,IAAMd,OAAO,kBAAkBC,KAAKC,GAAKA,EAAEa,OACrDC,QAAU,IAAMhB,OAAO,sBAAsBC,KAAKC,GAAKA,EAAEe,WACzDC,OAAU,IAAMlB,OAAO,qBAAqBC,KAAKC,GAAKA,EAAEiB,UACxDC,KAAU,IAAMpB,OAAO,mBAAmBC,KAAKC,GAAKA,EAAEmB,QACtDC,QAAU,IAAMtB,OAAO,sBAAsBC,KAAKC,GAAKA,EAAEqB,WACzDC,KAAU,IAAMxB,OAAO,mBAAmBC,KAAKC,GAAKA,EAAEuB,QACtDC,SAAU,IAAM1B,OAAO,uBAAuBC,KAAKC,GAAKA,EAAEyB,aAGtDC,EAAgB,CAAA,EAKhBC,EAAmB,CAAA,EAelB,SAASC,EAAYC,GAC1B,GAAIH,EAAcG,GAAO,OAAOC,QAAQC,QAAQL,EAAcG,IAC9D,GAAIF,EAAiBE,GAAO,OAAOF,EAAiBE,GAEpD,MAAMG,EAASpC,EAAgBiC,GAC/B,OAAKG,GAOLL,EAAiBE,GAAQG,IAASjC,KAChCkC,IACEP,EAAcG,GAAQI,SACfN,EAAiBE,GACjBI,GAETC,IAGE,aADOP,EAAiBE,GAClBK,IAGHP,EAAiBE,IAlBfC,QAAQK,OAAO,IAAIC,MACxB,oCAAoCP,kBACtBQ,OAAOC,KAAK1C,GAAiB2C,KAAK,UAiBtD,CAKY,MAACC,EAAgBH,OAAOI,OAAOJ,OAAOC,KAAK1C"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/adapters/index.js"],"sourcesContent":["/**\n * 🚀 WU-FRAMEWORK ADAPTERS\n *\n * Adapters oficiales para integrar Wu Framework con frameworks populares.\n * Soporta: React, Vue, Angular, Svelte, Preact, Solid.js, Lit, Vanilla JS,\n * Alpine.js, Qwik, Stencil, HTMX, Stimulus\n *\n * ⚠️ TREE-SHAKING: importa siempre desde el subpath específico, NO desde el barrel.\n *\n * ✅ import { wuReact } from 'wu-framework/adapters/react'; // ~3 KB\n * ❌ import { wuReact } from 'wu-framework/adapters'; // arrastra otros 12\n *\n * El barrel mantiene los re-exports nombrados (tree-shakeable con bundlers que\n * respetan `sideEffects: false`), pero los 13 adapters como objeto eager (`adapters.react`)\n * fue eliminado en v2.0 — usa `loadAdapter('react')` async si lo necesitas dinámicamente.\n *\n * @example\n * // Recomendado: import por subpath\n * import { wuReact } from 'wu-framework/adapters/react';\n * import { wuVue } from 'wu-framework/adapters/vue';\n *\n * @example\n * // Dinámico (carga bajo demanda)\n * import { loadAdapter } from 'wu-framework/adapters';\n * const wuReact = await loadAdapter('react');\n */\n\n// ============================================\n// REACT ADAPTER\n// ============================================\nexport {\n wuReact,\n register as registerReact,\n createWuSlot,\n createUseWuEvents,\n createUseWuStore,\n createUseWuAI\n} from './react/index.js';\n\n// ============================================\n// VUE ADAPTER\n// ============================================\nexport {\n wuVue,\n register as registerVue,\n WuSlot,\n useWuEvents,\n useWuStore,\n wuVuePlugin,\n createUseWuAI as createVueUseWuAI,\n useWuAI as useVueWuAI\n} from './vue/index.js';\n\n// ============================================\n// ANGULAR ADAPTER\n// ============================================\nexport {\n wuAngular,\n register as registerAngular,\n registerStandalone as registerAngularStandalone,\n createWuService,\n createWuSlotComponent,\n getWuSlotModuleConfig,\n createWuAIService\n} from './angular/index.js';\n\n// ============================================\n// SVELTE ADAPTER\n// ============================================\nexport {\n wuSvelte,\n register as registerSvelte,\n registerSvelte5,\n createWuStore as createSvelteWuStore,\n createWuEventStore,\n useWuEvents as useSvelteWuEvents,\n createWuSlotConfig,\n createWuAIStore\n} from './svelte/index.js';\n\n// ============================================\n// PREACT ADAPTER\n// ============================================\nexport {\n wuPreact,\n register as registerPreact,\n registerCompat as registerPreactCompat,\n createWuSlot as createPreactWuSlot,\n createUseWuEvents as createPreactUseWuEvents,\n createUseWuStore as createPreactUseWuStore,\n createUseWuAI as createPreactUseWuAI\n} from './preact/index.js';\n\n// ============================================\n// SOLID.JS ADAPTER\n// ============================================\nexport {\n wuSolid,\n register as registerSolid,\n createWuSlot as createSolidWuSlot,\n createWuStore as createSolidWuStore,\n createWuEvent,\n useWuEvents as useSolidWuEvents,\n createWuContext,\n createUseWuAI as createSolidUseWuAI\n} from './solid/index.js';\n\n// ============================================\n// LIT (WEB COMPONENTS) ADAPTER\n// ============================================\nexport {\n wuLit,\n register as registerLit,\n registerWebComponent,\n createWuSlotElement,\n WuMixin,\n WuAIMixin,\n wuProperty,\n createSimpleElement\n} from './lit/index.js';\n\n// ============================================\n// VANILLA JS ADAPTER\n// ============================================\nexport {\n wuVanilla,\n register as registerVanilla,\n registerClass,\n registerTemplate,\n createComponent,\n createWuSlot as createVanillaWuSlot,\n useWuEvents as useVanillaWuEvents,\n useWuStore as useVanillaWuStore,\n useWuAI as useVanillaWuAI\n} from './vanilla/index.js';\n\n// ============================================\n// ALPINE.JS ADAPTER\n// ============================================\nexport {\n wuAlpine,\n register as registerAlpine\n} from './alpine/index.js';\n\n// ============================================\n// QWIK ADAPTER\n// ============================================\nexport {\n wuQwik,\n register as registerQwik\n} from './qwik/index.js';\n\n// ============================================\n// STENCIL ADAPTER\n// ============================================\nexport {\n wuStencil,\n register as registerStencil\n} from './stencil/index.js';\n\n// ============================================\n// HTMX ADAPTER\n// ============================================\nexport {\n wuHtmx,\n register as registerHtmx\n} from './htmx/index.js';\n\n// ============================================\n// STIMULUS ADAPTER\n// ============================================\nexport {\n wuStimulus,\n register as registerStimulus\n} from './stimulus/index.js';\n\n// ============================================\n// SHARED UTILITIES\n// ============================================\nexport { getWuInstance, waitForWu } from './shared.js';\n\n// ============================================\n// LAZY ADAPTER LOADER (replaces the eager `adapters` object from v1.x)\n// ============================================\n\nconst ADAPTER_LOADERS = {\n react: () => import('./react/index.js').then(m => m.wuReact),\n vue: () => import('./vue/index.js').then(m => m.wuVue),\n angular: () => import('./angular/index.js').then(m => m.wuAngular),\n svelte: () => import('./svelte/index.js').then(m => m.wuSvelte),\n preact: () => import('./preact/index.js').then(m => m.wuPreact),\n solid: () => import('./solid/index.js').then(m => m.wuSolid),\n lit: () => import('./lit/index.js').then(m => m.wuLit),\n vanilla: () => import('./vanilla/index.js').then(m => m.wuVanilla),\n alpine: () => import('./alpine/index.js').then(m => m.wuAlpine),\n qwik: () => import('./qwik/index.js').then(m => m.wuQwik),\n stencil: () => import('./stencil/index.js').then(m => m.wuStencil),\n htmx: () => import('./htmx/index.js').then(m => m.wuHtmx),\n stimulus: () => import('./stimulus/index.js').then(m => m.wuStimulus)\n};\n\nconst _adapterCache = {};\n// In-flight loads, keyed by adapter name. Two concurrent loadAdapter('react')\n// calls share the same Promise instead of triggering a duplicate import().\n// ESM caches modules by URL so the second import would resolve to the same\n// instance, but we'd waste the network round-trip + parse work.\nconst _loadingPromises = {};\n\n/**\n * Load an adapter on demand. Returns a Promise that resolves to the wuX object.\n * Concurrent calls share the same in-flight promise.\n *\n * Replaces the eager `adapters` object that pulled all 13 frameworks at load time.\n *\n * @param {keyof typeof ADAPTER_LOADERS} name\n * @returns {Promise<object>}\n *\n * @example\n * const wuReact = await loadAdapter('react');\n * wuReact.register('cart', CartApp);\n */\nexport function loadAdapter(name) {\n if (_adapterCache[name]) return Promise.resolve(_adapterCache[name]);\n if (_loadingPromises[name]) return _loadingPromises[name];\n\n const loader = ADAPTER_LOADERS[name];\n if (!loader) {\n return Promise.reject(new Error(\n `[wu-framework] Unknown adapter: '${name}'. ` +\n `Available: ${Object.keys(ADAPTER_LOADERS).join(', ')}.`\n ));\n }\n\n _loadingPromises[name] = loader().then(\n adapter => {\n _adapterCache[name] = adapter;\n delete _loadingPromises[name];\n return adapter;\n },\n err => {\n // On failure, clear the in-flight slot so a retry is possible\n delete _loadingPromises[name];\n throw err;\n }\n );\n return _loadingPromises[name];\n}\n\n/**\n * Names of available adapters. Use with loadAdapter() to iterate.\n */\nexport const ADAPTER_NAMES = Object.freeze(Object.keys(ADAPTER_LOADERS));\n"],"names":["ADAPTER_LOADERS","react","import","then","m","wuReact","vue","wuVue","angular","wuAngular","svelte","wuSvelte","preact","wuPreact","solid","wuSolid","lit","wuLit","vanilla","wuVanilla","alpine","wuAlpine","qwik","wuQwik","stencil","wuStencil","htmx","wuHtmx","stimulus","wuStimulus","_adapterCache","_loadingPromises","loadAdapter","name","Promise","resolve","loader","adapter","err","reject","Error","Object","keys","join","ADAPTER_NAMES","freeze"],"mappings":"ojEAyLA,MAAMA,EAAkB,CACtBC,MAAU,IAAMC,OAAO,oBAAoBC,KAAKC,GAAKA,EAAEC,SACvDC,IAAU,IAAMJ,OAAO,kBAAkBC,KAAKC,GAAKA,EAAEG,OACrDC,QAAU,IAAMN,OAAO,sBAAsBC,KAAKC,GAAKA,EAAEK,WACzDC,OAAU,IAAMR,OAAO,qBAAqBC,KAAKC,GAAKA,EAAEO,UACxDC,OAAU,IAAMV,OAAO,qBAAqBC,KAAKC,GAAKA,EAAES,UACxDC,MAAU,IAAMZ,OAAO,oBAAoBC,KAAKC,GAAKA,EAAEW,SACvDC,IAAU,IAAMd,OAAO,kBAAkBC,KAAKC,GAAKA,EAAEa,OACrDC,QAAU,IAAMhB,OAAO,sBAAsBC,KAAKC,GAAKA,EAAEe,WACzDC,OAAU,IAAMlB,OAAO,qBAAqBC,KAAKC,GAAKA,EAAEiB,UACxDC,KAAU,IAAMpB,OAAO,mBAAmBC,KAAKC,GAAKA,EAAEmB,QACtDC,QAAU,IAAMtB,OAAO,sBAAsBC,KAAKC,GAAKA,EAAEqB,WACzDC,KAAU,IAAMxB,OAAO,mBAAmBC,KAAKC,GAAKA,EAAEuB,QACtDC,SAAU,IAAM1B,OAAO,uBAAuBC,KAAKC,GAAKA,EAAEyB,aAGtDC,EAAgB,CAAA,EAKhBC,EAAmB,CAAA,EAelB,SAASC,EAAYC,GAC1B,GAAIH,EAAcG,GAAO,OAAOC,QAAQC,QAAQL,EAAcG,IAC9D,GAAIF,EAAiBE,GAAO,OAAOF,EAAiBE,GAEpD,MAAMG,EAASpC,EAAgBiC,GAC/B,OAAKG,GAOLL,EAAiBE,GAAQG,IAASjC,KAChCkC,IACEP,EAAcG,GAAQI,SACfN,EAAiBE,GACjBI,GAETC,IAGE,aADOP,EAAiBE,GAClBK,IAGHP,EAAiBE,IAlBfC,QAAQK,OAAO,IAAIC,MACxB,oCAAoCP,kBACtBQ,OAAOC,KAAK1C,GAAiB2C,KAAK,UAiBtD,CAKY,MAACC,EAAgBH,OAAOI,OAAOJ,OAAOC,KAAK1C"}
|