versacompiler 2.4.1 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +722 -722
  2. package/dist/compiler/compile-worker-pool.js +96 -0
  3. package/dist/compiler/compile-worker-thread.cjs +72 -0
  4. package/dist/compiler/compile.js +81 -2
  5. package/dist/compiler/integrity-validator.js +1 -1
  6. package/dist/compiler/module-resolution-optimizer.js +23 -20
  7. package/dist/compiler/performance-monitor.js +61 -61
  8. package/dist/compiler/pipeline/build-pipeline.js +127 -0
  9. package/dist/compiler/pipeline/core-plugins.js +218 -0
  10. package/dist/compiler/pipeline/module-graph.js +63 -0
  11. package/dist/compiler/pipeline/plugin-driver.js +87 -0
  12. package/dist/compiler/pipeline/types.js +2 -0
  13. package/dist/compiler/transforms.js +222 -16
  14. package/dist/compiler/typescript-manager.js +3 -1
  15. package/dist/compiler/typescript-sync-validator.js +33 -31
  16. package/dist/compiler/typescript-worker-thread.cjs +482 -475
  17. package/dist/compiler/vuejs.js +32 -32
  18. package/dist/config.js +2 -0
  19. package/dist/hrm/VueHRM.js +359 -359
  20. package/dist/hrm/errorScreen.js +83 -83
  21. package/dist/hrm/getInstanciaVue.js +313 -313
  22. package/dist/hrm/initHRM.js +628 -586
  23. package/dist/main.js +2 -1
  24. package/dist/servicios/browserSync.js +8 -2
  25. package/dist/servicios/file-watcher.js +48 -6
  26. package/dist/servicios/readConfig.js +129 -54
  27. package/dist/servicios/versacompile.config.types.js +2 -0
  28. package/dist/utils/module-resolver.js +74 -40
  29. package/dist/utils/vue-types-setup.js +248 -248
  30. package/dist/wrappers/eslint-node.js +3 -1
  31. package/dist/wrappers/oxlint-node.js +3 -1
  32. package/package.json +72 -53
@@ -1,359 +1,359 @@
1
- /**
2
- * @typedef {Object} TreeNode
3
- * @property {string} name - Nombre del componente
4
- * @property {Object} instancia - Instancia del componente Vue
5
- * @property {TreeNode[]} children - Nodos hijos
6
- * @property {TreeNode|null} parent - Nodo padre
7
- * @property {boolean} isRoot - Si es el nodo raíz
8
- * @property {string} [from] - Origen del nodo
9
- */
10
-
11
- import { obtenerInstanciaVue } from './getInstanciaVue.js';
12
-
13
- /**
14
- * @typedef {Object} VNode
15
- * @property {Object} [type] - Tipo del VNode
16
- * @property {Object} [component] - Componente asociado
17
- * @property {VNode[]} [children] - VNodes hijos
18
- * @property {VNode[]} [dynamicChildren] - VNodes dinámicos
19
- * @property {Object} [suspense] - Objeto suspense
20
- */
21
-
22
- /**
23
- * @typedef {Object} ComponentInstance
24
- * @property {Object} type - Tipo del componente
25
- * @property {string} [type.name] - Nombre del tipo
26
- * @property {string} [type.__name] - Nombre alternativo del tipo
27
- * @property {Object} [components] - Componentes registrados
28
- * @property {VNode} subTree - Subárbol del componente
29
- * @property {Object} [proxy] - Proxy del componente
30
- * @property {Function} [proxy.$forceUpdate] - Función de actualización forzada
31
- * @property {Function} [update] - Función de actualización
32
- * @property {Object} [ctx] - Contexto del componente
33
- * @property {Object} [ctx._] - Contexto interno del componente
34
- * @property {Object} [ctx._.setupState] - Estado del setup del componente
35
- * @property {number} [ctx._.setupState.versaComponentKey] - Clave del componente para HMR
36
- */
37
-
38
- /**
39
- * @typedef {Object} ComponentInfo
40
- * @property {string} normalizedPath - Ruta normalizada del componente
41
- * @property {string} nameFile - Nombre del archivo del componente
42
- */
43
-
44
- /**
45
- * @typedef {Object} VueApp
46
- * @property {ComponentInstance} _instance - Instancia principal de la aplicación
47
- */
48
-
49
- /**
50
- * Busca nodos en el árbol por nombre de instancia
51
- * @param {TreeNode} tree - Árbol de componentes
52
- * @param {string} instance - Nombre de la instancia a buscar
53
- * @returns {TreeNode[]} Array de nodos encontrados
54
- */
55
- function findNodeByInstance(tree, instance) {
56
- const matches = [];
57
- /**
58
- * @param {TreeNode} node - Nodo a buscar recursivamente
59
- */
60
- function searchRecursively(node) {
61
- if (node.name === instance) {
62
- matches.push(node);
63
- }
64
- for (const child of node.children) {
65
- searchRecursively(child);
66
- }
67
- }
68
-
69
- searchRecursively(tree);
70
- return matches;
71
- }
72
- /**
73
- * Obtiene el camino desde un nodo hasta la raíz
74
- * @param {TreeNode} node - Nodo inicial
75
- * @returns {TreeNode[]} Camino desde el nodo hasta la raíz
76
- */
77
- function getPathToRoot(node) {
78
- const path = [];
79
- while (node) {
80
- path.push(node);
81
- node = node.parent;
82
- }
83
- return path; // Ordenado desde hijo hasta raíz
84
- }
85
-
86
- /**
87
- * Encuentra componentes recursivamente dentro de un VNode
88
- * @param {VNode} vnode - VNode a explorar
89
- * @param {TreeNode} parentTreeNode - Nodo padre en el árbol
90
- */
91
- function recursivelyFindComponentsInVNode(vnode, parentTreeNode) {
92
- if (!vnode || typeof vnode !== 'object') {
93
- return;
94
- }
95
- if (vnode?.type.name === 'Suspense') {
96
- const childComponentInstance = vnode?.suspense.activeBranch;
97
- const childTreeNode = {
98
- name: vnode?.type.name,
99
- instancia: childComponentInstance,
100
- children: [],
101
- parent: parentTreeNode,
102
- isRoot: false,
103
- };
104
- parentTreeNode.children.push(childTreeNode);
105
- recursivelyFindComponentsInVNode(childComponentInstance, childTreeNode);
106
- } else if (vnode.component) {
107
- const childComponentInstance = vnode.component;
108
-
109
- let componentName = 'Anonymous';
110
- if (childComponentInstance.type) {
111
- if (childComponentInstance.type.name) {
112
- componentName = childComponentInstance.type.name;
113
- } else if (childComponentInstance.type.__name) {
114
- componentName = childComponentInstance.type.__name;
115
- } else if (typeof childComponentInstance.type === 'function') {
116
- const funcName = childComponentInstance.type.name;
117
- if (funcName && funcName !== 'Anonymous function') {
118
- componentName = funcName;
119
- }
120
- // Heurísticas para componentes comunes de Vue
121
- const typeStr = childComponentInstance.type.toString();
122
- if (typeStr.includes('BaseTransition')) {
123
- componentName = 'Transition';
124
- } else if (typeStr.includes('KeepAlive')) {
125
- componentName = 'KeepAlive';
126
- } else if (typeStr.includes('Suspense')) {
127
- componentName = 'Suspense';
128
- }
129
- }
130
- }
131
-
132
- const childTreeNode = {
133
- name: componentName,
134
- instancia: childComponentInstance,
135
- children: [],
136
- parent: parentTreeNode,
137
- isRoot: false,
138
- };
139
- parentTreeNode.children.push(childTreeNode);
140
- traverseComponentInstance(childComponentInstance, childTreeNode);
141
- } else {
142
- const childrenToExplore = vnode.children || vnode.dynamicChildren;
143
- if (Array.isArray(childrenToExplore)) {
144
- childrenToExplore.forEach(childVNode => {
145
- recursivelyFindComponentsInVNode(childVNode, parentTreeNode);
146
- });
147
- }
148
- }
149
- }
150
-
151
- /**
152
- * Recorre una instancia de componente y construye el árbol
153
- * @param {ComponentInstance} componentInstance - Instancia del componente
154
- * @param {TreeNode} currentTreeNode - Nodo actual del árbol
155
- */
156
- function traverseComponentInstance(componentInstance, currentTreeNode) {
157
- const subTreeVNode = componentInstance.subTree;
158
-
159
- if (!subTreeVNode) {
160
- return;
161
- }
162
-
163
- recursivelyFindComponentsInVNode(subTreeVNode, currentTreeNode);
164
- }
165
-
166
- /**
167
- * Construye el árbol de componentes desde una instancia raíz
168
- * @param {ComponentInstance} componentRootInstance - Instancia raíz del componente
169
- * @returns {TreeNode|null} Árbol de componentes o null si falla
170
- */
171
- export const buildComponentTree = componentRootInstance => {
172
- if (!componentRootInstance || !componentRootInstance.type) {
173
- console.warn(
174
- 'No se pudo construir el árbol de componentes: instancia inválida',
175
- );
176
- return null;
177
- }
178
- const tree = {
179
- name:
180
- componentRootInstance.type?.name ||
181
- componentRootInstance.type?.__name ||
182
- 'Anonymous',
183
- instancia: componentRootInstance,
184
- children: [],
185
- parent: null,
186
- isRoot: true,
187
- from: 'root',
188
- };
189
- traverseComponentInstance(componentRootInstance, tree);
190
-
191
- return tree;
192
- };
193
-
194
- /**
195
- * Intenta forzar la actualización de una instancia de componente
196
- * @param {ComponentInstance} instance - Instancia del componente a actualizar
197
- * @returns {boolean} True si la actualización fue exitosa, false en caso contrario
198
- */
199
- function tryForceUpdate(instance) {
200
- if (!instance) {
201
- return false;
202
- }
203
- if (instance.proxy && typeof instance.proxy.$forceUpdate === 'function') {
204
- instance.proxy.$forceUpdate();
205
- if (typeof instance.update === 'function') {
206
- instance.update();
207
- }
208
- // buscar una variable en el componente que se llame versaComponentKey y sumarle 1
209
- if (instance.ctx?._.setupState?.versaComponentKey !== undefined) {
210
- instance.ctx._.setupState.versaComponentKey++;
211
- }
212
- return true;
213
- }
214
- if (typeof instance.update === 'function') {
215
- if (instance.ctx?._.setupState?.versaComponentKey !== undefined) {
216
- instance.ctx._.setupState.versaComponentKey++;
217
- }
218
- instance.update();
219
- return true;
220
- }
221
- return false;
222
- }
223
-
224
- /**
225
- * Intenta actualizar un componente en el camino del árbol
226
- * @param {TreeNode[]} path - Camino de nodos desde el componente hasta la raíz
227
- * @param {Object} newComponent - Nuevo componente a usar
228
- * @param {string} componentName - Nombre del componente
229
- * @param {VueApp} App - Aplicación Vue
230
- * @returns {boolean} True si la actualización fue exitosa
231
- */
232
- function tryUpdateComponentPath(path, newComponent, componentName, App) {
233
- if (!path || !newComponent || !componentName || !App) {
234
- console.error('❌ Parámetros inválidos para tryUpdateComponentPath');
235
- return false;
236
- }
237
-
238
- // Recorrer el path desde el padre hacia la raíz (saltando el primer elemento que es el propio componente)
239
- for (let i = 1; i < path.length; i++) {
240
- const parent = path[i];
241
-
242
- if (parent.isRoot || parent.name === 'KeepAlive') {
243
- window.location.reload();
244
- return true;
245
- }
246
-
247
- if (!parent || !parent.instancia) {
248
- console.error('❌ Nodo padre no válido en el camino:', parent);
249
- continue; // Continúa con el siguiente padre en lugar de fallar
250
- }
251
-
252
- // Actualizar la instancia del componente
253
- const componentsDefinition =
254
- parent.instancia?.type?.components || parent.instancia?.components;
255
-
256
- if (componentsDefinition && componentsDefinition[componentName]) {
257
- componentsDefinition[componentName] = newComponent;
258
-
259
- // Forzar actualización de la instancia padre
260
- return (
261
- tryForceUpdate(parent.instancia) ||
262
- tryForceUpdate(parent.instancia.proxy)
263
- );
264
- }
265
- }
266
-
267
- return false;
268
- }
269
-
270
- /**
271
- * Recarga un componente Vue con Hot Module Replacement
272
- * @param {VueApp} App - Aplicación Vue principal
273
- * @param {ComponentInfo} Component - Información del componente a recargar
274
- * @returns {Promise<boolean>} Promise que resuelve a true si la recarga fue exitosa
275
- */
276
- export async function reloadComponent(App, Component) {
277
- try {
278
- const { normalizedPath: relativePath, nameFile: componentName } =
279
- Component;
280
- if (!App || !App._instance) {
281
- const vueInstance = await obtenerInstanciaVue();
282
- if (!vueInstance) {
283
- console.error('❌ No se pudo obtener la instancia de Vue');
284
- return false;
285
- }
286
- App = vueInstance;
287
- }
288
-
289
- if (!relativePath) {
290
- console.error('❌ No se proporcionó relativePath');
291
- return false;
292
- }
293
-
294
- const baseUrl = window.location.href;
295
- const newBaseUrl = new URL(baseUrl);
296
- const urlOrigin = `${newBaseUrl.origin}/${relativePath}`;
297
- const timestamp = Date.now();
298
- const moduleUrl = `${urlOrigin}?t=${timestamp}`;
299
-
300
- const module = await import(moduleUrl);
301
-
302
- if (!module.default) {
303
- console.error('❌ El módulo importado no tiene export default');
304
- return false;
305
- }
306
-
307
- const componentTree = buildComponentTree(App._instance);
308
- if (!componentTree) {
309
- console.error('❌ No se pudo construir el árbol de componentes');
310
- return false;
311
- }
312
-
313
- const targetNodes = findNodeByInstance(componentTree, componentName);
314
- if (!targetNodes) {
315
- console.warn(
316
- '⚠️ No se encontró el nodo objetivo para:',
317
- componentName,
318
- );
319
-
320
- return false;
321
- }
322
-
323
- console.log(
324
- `🔍 Se encontraron ${targetNodes.length} instancias del componente ${componentName}`,
325
- );
326
-
327
- let successfulUpdates = 0; // Procesar TODAS las instancias encontradas
328
- for (let i = 0; i < targetNodes.length; i++) {
329
- const node = targetNodes[i];
330
- if (node) {
331
- const path = getPathToRoot(node);
332
- const updateResult = await tryUpdateComponentPath(
333
- path,
334
- module.default,
335
- componentName,
336
- App,
337
- );
338
-
339
- if (updateResult) {
340
- successfulUpdates++;
341
- } else {
342
- console.error(
343
- `❌ No se pudo actualizar la instancia ${i + 1}`,
344
- );
345
- }
346
- }
347
- }
348
-
349
- const hasSuccessfulUpdate = successfulUpdates > 0;
350
- console.log(
351
- `\n📊 Resultado final: ${successfulUpdates}/${targetNodes.length} instancias actualizadas`,
352
- );
353
-
354
- return hasSuccessfulUpdate;
355
- } catch (error) {
356
- console.error('❌ Error en reloadComponent:', error);
357
- return false;
358
- }
359
- }
1
+ /**
2
+ * @typedef {Object} TreeNode
3
+ * @property {string} name - Nombre del componente
4
+ * @property {Object} instancia - Instancia del componente Vue
5
+ * @property {TreeNode[]} children - Nodos hijos
6
+ * @property {TreeNode|null} parent - Nodo padre
7
+ * @property {boolean} isRoot - Si es el nodo raíz
8
+ * @property {string} [from] - Origen del nodo
9
+ */
10
+
11
+ import { obtenerInstanciaVue } from './getInstanciaVue.js';
12
+
13
+ /**
14
+ * @typedef {Object} VNode
15
+ * @property {Object} [type] - Tipo del VNode
16
+ * @property {Object} [component] - Componente asociado
17
+ * @property {VNode[]} [children] - VNodes hijos
18
+ * @property {VNode[]} [dynamicChildren] - VNodes dinámicos
19
+ * @property {Object} [suspense] - Objeto suspense
20
+ */
21
+
22
+ /**
23
+ * @typedef {Object} ComponentInstance
24
+ * @property {Object} type - Tipo del componente
25
+ * @property {string} [type.name] - Nombre del tipo
26
+ * @property {string} [type.__name] - Nombre alternativo del tipo
27
+ * @property {Object} [components] - Componentes registrados
28
+ * @property {VNode} subTree - Subárbol del componente
29
+ * @property {Object} [proxy] - Proxy del componente
30
+ * @property {Function} [proxy.$forceUpdate] - Función de actualización forzada
31
+ * @property {Function} [update] - Función de actualización
32
+ * @property {Object} [ctx] - Contexto del componente
33
+ * @property {Object} [ctx._] - Contexto interno del componente
34
+ * @property {Object} [ctx._.setupState] - Estado del setup del componente
35
+ * @property {number} [ctx._.setupState.versaComponentKey] - Clave del componente para HMR
36
+ */
37
+
38
+ /**
39
+ * @typedef {Object} ComponentInfo
40
+ * @property {string} normalizedPath - Ruta normalizada del componente
41
+ * @property {string} nameFile - Nombre del archivo del componente
42
+ */
43
+
44
+ /**
45
+ * @typedef {Object} VueApp
46
+ * @property {ComponentInstance} _instance - Instancia principal de la aplicación
47
+ */
48
+
49
+ /**
50
+ * Busca nodos en el árbol por nombre de instancia
51
+ * @param {TreeNode} tree - Árbol de componentes
52
+ * @param {string} instance - Nombre de la instancia a buscar
53
+ * @returns {TreeNode[]} Array de nodos encontrados
54
+ */
55
+ function findNodeByInstance(tree, instance) {
56
+ const matches = [];
57
+ /**
58
+ * @param {TreeNode} node - Nodo a buscar recursivamente
59
+ */
60
+ function searchRecursively(node) {
61
+ if (node.name === instance) {
62
+ matches.push(node);
63
+ }
64
+ for (const child of node.children) {
65
+ searchRecursively(child);
66
+ }
67
+ }
68
+
69
+ searchRecursively(tree);
70
+ return matches;
71
+ }
72
+ /**
73
+ * Obtiene el camino desde un nodo hasta la raíz
74
+ * @param {TreeNode} node - Nodo inicial
75
+ * @returns {TreeNode[]} Camino desde el nodo hasta la raíz
76
+ */
77
+ function getPathToRoot(node) {
78
+ const path = [];
79
+ while (node) {
80
+ path.push(node);
81
+ node = node.parent;
82
+ }
83
+ return path; // Ordenado desde hijo hasta raíz
84
+ }
85
+
86
+ /**
87
+ * Encuentra componentes recursivamente dentro de un VNode
88
+ * @param {VNode} vnode - VNode a explorar
89
+ * @param {TreeNode} parentTreeNode - Nodo padre en el árbol
90
+ */
91
+ function recursivelyFindComponentsInVNode(vnode, parentTreeNode) {
92
+ if (!vnode || typeof vnode !== 'object') {
93
+ return;
94
+ }
95
+ if (vnode?.type.name === 'Suspense') {
96
+ const childComponentInstance = vnode?.suspense.activeBranch;
97
+ const childTreeNode = {
98
+ name: vnode?.type.name,
99
+ instancia: childComponentInstance,
100
+ children: [],
101
+ parent: parentTreeNode,
102
+ isRoot: false,
103
+ };
104
+ parentTreeNode.children.push(childTreeNode);
105
+ recursivelyFindComponentsInVNode(childComponentInstance, childTreeNode);
106
+ } else if (vnode.component) {
107
+ const childComponentInstance = vnode.component;
108
+
109
+ let componentName = 'Anonymous';
110
+ if (childComponentInstance.type) {
111
+ if (childComponentInstance.type.name) {
112
+ componentName = childComponentInstance.type.name;
113
+ } else if (childComponentInstance.type.__name) {
114
+ componentName = childComponentInstance.type.__name;
115
+ } else if (typeof childComponentInstance.type === 'function') {
116
+ const funcName = childComponentInstance.type.name;
117
+ if (funcName && funcName !== 'Anonymous function') {
118
+ componentName = funcName;
119
+ }
120
+ // Heurísticas para componentes comunes de Vue
121
+ const typeStr = childComponentInstance.type.toString();
122
+ if (typeStr.includes('BaseTransition')) {
123
+ componentName = 'Transition';
124
+ } else if (typeStr.includes('KeepAlive')) {
125
+ componentName = 'KeepAlive';
126
+ } else if (typeStr.includes('Suspense')) {
127
+ componentName = 'Suspense';
128
+ }
129
+ }
130
+ }
131
+
132
+ const childTreeNode = {
133
+ name: componentName,
134
+ instancia: childComponentInstance,
135
+ children: [],
136
+ parent: parentTreeNode,
137
+ isRoot: false,
138
+ };
139
+ parentTreeNode.children.push(childTreeNode);
140
+ traverseComponentInstance(childComponentInstance, childTreeNode);
141
+ } else {
142
+ const childrenToExplore = vnode.children || vnode.dynamicChildren;
143
+ if (Array.isArray(childrenToExplore)) {
144
+ childrenToExplore.forEach(childVNode => {
145
+ recursivelyFindComponentsInVNode(childVNode, parentTreeNode);
146
+ });
147
+ }
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Recorre una instancia de componente y construye el árbol
153
+ * @param {ComponentInstance} componentInstance - Instancia del componente
154
+ * @param {TreeNode} currentTreeNode - Nodo actual del árbol
155
+ */
156
+ function traverseComponentInstance(componentInstance, currentTreeNode) {
157
+ const subTreeVNode = componentInstance.subTree;
158
+
159
+ if (!subTreeVNode) {
160
+ return;
161
+ }
162
+
163
+ recursivelyFindComponentsInVNode(subTreeVNode, currentTreeNode);
164
+ }
165
+
166
+ /**
167
+ * Construye el árbol de componentes desde una instancia raíz
168
+ * @param {ComponentInstance} componentRootInstance - Instancia raíz del componente
169
+ * @returns {TreeNode|null} Árbol de componentes o null si falla
170
+ */
171
+ export const buildComponentTree = componentRootInstance => {
172
+ if (!componentRootInstance || !componentRootInstance.type) {
173
+ console.warn(
174
+ 'No se pudo construir el árbol de componentes: instancia inválida',
175
+ );
176
+ return null;
177
+ }
178
+ const tree = {
179
+ name:
180
+ componentRootInstance.type?.name ||
181
+ componentRootInstance.type?.__name ||
182
+ 'Anonymous',
183
+ instancia: componentRootInstance,
184
+ children: [],
185
+ parent: null,
186
+ isRoot: true,
187
+ from: 'root',
188
+ };
189
+ traverseComponentInstance(componentRootInstance, tree);
190
+
191
+ return tree;
192
+ };
193
+
194
+ /**
195
+ * Intenta forzar la actualización de una instancia de componente
196
+ * @param {ComponentInstance} instance - Instancia del componente a actualizar
197
+ * @returns {boolean} True si la actualización fue exitosa, false en caso contrario
198
+ */
199
+ function tryForceUpdate(instance) {
200
+ if (!instance) {
201
+ return false;
202
+ }
203
+ if (instance.proxy && typeof instance.proxy.$forceUpdate === 'function') {
204
+ instance.proxy.$forceUpdate();
205
+ if (typeof instance.update === 'function') {
206
+ instance.update();
207
+ }
208
+ // buscar una variable en el componente que se llame versaComponentKey y sumarle 1
209
+ if (instance.ctx?._.setupState?.versaComponentKey !== undefined) {
210
+ instance.ctx._.setupState.versaComponentKey++;
211
+ }
212
+ return true;
213
+ }
214
+ if (typeof instance.update === 'function') {
215
+ if (instance.ctx?._.setupState?.versaComponentKey !== undefined) {
216
+ instance.ctx._.setupState.versaComponentKey++;
217
+ }
218
+ instance.update();
219
+ return true;
220
+ }
221
+ return false;
222
+ }
223
+
224
+ /**
225
+ * Intenta actualizar un componente en el camino del árbol
226
+ * @param {TreeNode[]} path - Camino de nodos desde el componente hasta la raíz
227
+ * @param {Object} newComponent - Nuevo componente a usar
228
+ * @param {string} componentName - Nombre del componente
229
+ * @param {VueApp} App - Aplicación Vue
230
+ * @returns {boolean} True si la actualización fue exitosa
231
+ */
232
+ function tryUpdateComponentPath(path, newComponent, componentName, App) {
233
+ if (!path || !newComponent || !componentName || !App) {
234
+ console.error('❌ Parámetros inválidos para tryUpdateComponentPath');
235
+ return false;
236
+ }
237
+
238
+ // Recorrer el path desde el padre hacia la raíz (saltando el primer elemento que es el propio componente)
239
+ for (let i = 1; i < path.length; i++) {
240
+ const parent = path[i];
241
+
242
+ if (parent.isRoot || parent.name === 'KeepAlive') {
243
+ window.location.reload();
244
+ return true;
245
+ }
246
+
247
+ if (!parent || !parent.instancia) {
248
+ console.error('❌ Nodo padre no válido en el camino:', parent);
249
+ continue; // Continúa con el siguiente padre en lugar de fallar
250
+ }
251
+
252
+ // Actualizar la instancia del componente
253
+ const componentsDefinition =
254
+ parent.instancia?.type?.components || parent.instancia?.components;
255
+
256
+ if (componentsDefinition && componentsDefinition[componentName]) {
257
+ componentsDefinition[componentName] = newComponent;
258
+
259
+ // Forzar actualización de la instancia padre
260
+ return (
261
+ tryForceUpdate(parent.instancia) ||
262
+ tryForceUpdate(parent.instancia.proxy)
263
+ );
264
+ }
265
+ }
266
+
267
+ return false;
268
+ }
269
+
270
+ /**
271
+ * Recarga un componente Vue con Hot Module Replacement
272
+ * @param {VueApp} App - Aplicación Vue principal
273
+ * @param {ComponentInfo} Component - Información del componente a recargar
274
+ * @returns {Promise<boolean>} Promise que resuelve a true si la recarga fue exitosa
275
+ */
276
+ export async function reloadComponent(App, Component) {
277
+ try {
278
+ const { normalizedPath: relativePath, nameFile: componentName } =
279
+ Component;
280
+ if (!App || !App._instance) {
281
+ const vueInstance = await obtenerInstanciaVue();
282
+ if (!vueInstance) {
283
+ console.error('❌ No se pudo obtener la instancia de Vue');
284
+ return false;
285
+ }
286
+ App = vueInstance;
287
+ }
288
+
289
+ if (!relativePath) {
290
+ console.error('❌ No se proporcionó relativePath');
291
+ return false;
292
+ }
293
+
294
+ const baseUrl = window.location.href;
295
+ const newBaseUrl = new URL(baseUrl);
296
+ const urlOrigin = `${newBaseUrl.origin}/${relativePath}`;
297
+ const timestamp = Date.now();
298
+ const moduleUrl = `${urlOrigin}?t=${timestamp}`;
299
+
300
+ const module = await import(moduleUrl);
301
+
302
+ if (!module.default) {
303
+ console.error('❌ El módulo importado no tiene export default');
304
+ return false;
305
+ }
306
+
307
+ const componentTree = buildComponentTree(App._instance);
308
+ if (!componentTree) {
309
+ console.error('❌ No se pudo construir el árbol de componentes');
310
+ return false;
311
+ }
312
+
313
+ const targetNodes = findNodeByInstance(componentTree, componentName);
314
+ if (!targetNodes) {
315
+ console.warn(
316
+ '⚠️ No se encontró el nodo objetivo para:',
317
+ componentName,
318
+ );
319
+
320
+ return false;
321
+ }
322
+
323
+ console.log(
324
+ `🔍 Se encontraron ${targetNodes.length} instancias del componente ${componentName}`,
325
+ );
326
+
327
+ let successfulUpdates = 0; // Procesar TODAS las instancias encontradas
328
+ for (let i = 0; i < targetNodes.length; i++) {
329
+ const node = targetNodes[i];
330
+ if (node) {
331
+ const path = getPathToRoot(node);
332
+ const updateResult = await tryUpdateComponentPath(
333
+ path,
334
+ module.default,
335
+ componentName,
336
+ App,
337
+ );
338
+
339
+ if (updateResult) {
340
+ successfulUpdates++;
341
+ } else {
342
+ console.error(
343
+ `❌ No se pudo actualizar la instancia ${i + 1}`,
344
+ );
345
+ }
346
+ }
347
+ }
348
+
349
+ const hasSuccessfulUpdate = successfulUpdates > 0;
350
+ console.log(
351
+ `\n📊 Resultado final: ${successfulUpdates}/${targetNodes.length} instancias actualizadas`,
352
+ );
353
+
354
+ return hasSuccessfulUpdate;
355
+ } catch (error) {
356
+ console.error('❌ Error en reloadComponent:', error);
357
+ return false;
358
+ }
359
+ }