versacompiler 1.0.5 → 2.0.1

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 (48) hide show
  1. package/README.md +633 -145
  2. package/dist/compiler/compile.js +1362 -0
  3. package/dist/compiler/error-reporter.js +467 -0
  4. package/dist/compiler/linter.js +72 -0
  5. package/dist/compiler/minify.js +229 -0
  6. package/dist/compiler/module-resolution-optimizer.js +844 -0
  7. package/dist/compiler/parser.js +203 -0
  8. package/dist/compiler/performance-monitor.js +192 -0
  9. package/dist/compiler/tailwindcss.js +39 -0
  10. package/dist/compiler/transform-optimizer.js +287 -0
  11. package/dist/compiler/transformTStoJS.js +16 -0
  12. package/dist/compiler/transforms.js +578 -0
  13. package/dist/compiler/typescript-compiler.js +379 -0
  14. package/dist/compiler/typescript-error-parser.js +281 -0
  15. package/dist/compiler/typescript-manager.js +378 -0
  16. package/dist/compiler/typescript-sync-validator.js +228 -0
  17. package/dist/compiler/typescript-worker-pool.js +479 -0
  18. package/dist/compiler/typescript-worker-thread.cjs +457 -0
  19. package/dist/compiler/typescript-worker.js +339 -0
  20. package/dist/compiler/vuejs.js +390 -0
  21. package/dist/hrm/VueHRM.js +353 -0
  22. package/dist/hrm/errorScreen.js +23 -1
  23. package/dist/hrm/getInstanciaVue.js +313 -0
  24. package/dist/hrm/initHRM.js +140 -0
  25. package/dist/main.js +286 -0
  26. package/dist/servicios/browserSync.js +469 -0
  27. package/dist/servicios/file-watcher.js +316 -0
  28. package/dist/servicios/logger.js +34 -0
  29. package/dist/servicios/readConfig.js +430 -0
  30. package/dist/utils/module-resolver.js +495 -0
  31. package/dist/utils/promptUser.js +48 -0
  32. package/dist/utils/resolve-bin.js +48 -0
  33. package/dist/utils/utils.js +8 -35
  34. package/dist/wrappers/eslint-node.js +145 -0
  35. package/dist/wrappers/oxlint-node.js +120 -0
  36. package/dist/wrappers/tailwind-node.js +92 -0
  37. package/package.json +62 -17
  38. package/dist/hrm/devMode.js +0 -346
  39. package/dist/hrm/instanciaVue.js +0 -35
  40. package/dist/hrm/setupHMR.js +0 -57
  41. package/dist/index.js +0 -1010
  42. package/dist/services/acorn.js +0 -29
  43. package/dist/services/linter.js +0 -55
  44. package/dist/services/minify.js +0 -31
  45. package/dist/services/typescript.js +0 -89
  46. package/dist/services/vueLoader.js +0 -326
  47. package/dist/services/vuejs.js +0 -259
  48. package/dist/utils/transformWithAcorn.js +0 -316
@@ -0,0 +1,578 @@
1
+ import path from 'node:path';
2
+ import { env } from 'node:process';
3
+ import { logger } from '../servicios/logger.js';
4
+ import { getModuleSubPath } from '../utils/module-resolver.js';
5
+ import { analyzeAndFormatMultipleErrors } from './error-reporter.js';
6
+ import { getOptimizedAliasPath, getOptimizedModulePath, } from './module-resolution-optimizer.js';
7
+ import { parser } from './parser.js';
8
+ // Módulos built-in de Node.js que no deben ser resueltos
9
+ const NODE_BUILTIN_MODULES = new Set([
10
+ 'fs',
11
+ 'path',
12
+ 'os',
13
+ 'crypto',
14
+ 'http',
15
+ 'https',
16
+ 'url',
17
+ 'util',
18
+ 'events',
19
+ 'stream',
20
+ 'buffer',
21
+ 'child_process',
22
+ 'cluster',
23
+ 'dgram',
24
+ 'dns',
25
+ 'net',
26
+ 'readline',
27
+ 'repl',
28
+ 'tls',
29
+ 'tty',
30
+ 'vm',
31
+ 'zlib',
32
+ 'assert',
33
+ 'module',
34
+ 'process',
35
+ 'querystring',
36
+ 'string_decoder',
37
+ 'timers',
38
+ 'v8',
39
+ 'worker_threads',
40
+ ]);
41
+ /**
42
+ * Determina si un moduleRequest es un módulo externo que debe ser resuelto
43
+ * @param moduleRequest - El string del import (ej: 'vue', './local', '/absolute')
44
+ * @param pathAlias - Objeto con los alias definidos
45
+ * @returns true si es un módulo externo que debe resolverse
46
+ */
47
+ function isExternalModule(moduleRequest, pathAlias) {
48
+ // Descartar rutas relativas y absolutas
49
+ if (moduleRequest.startsWith('./') ||
50
+ moduleRequest.startsWith('../') ||
51
+ moduleRequest.startsWith('/')) {
52
+ return false;
53
+ }
54
+ // Descartar rutas que parecen ser locales (contienen carpetas conocidas del proyecto)
55
+ const localPaths = [
56
+ 'public/',
57
+ 'src/',
58
+ 'dist/',
59
+ 'components/',
60
+ 'utils/',
61
+ 'assets/',
62
+ 'styles/',
63
+ ];
64
+ if (localPaths.some(localPath => moduleRequest.startsWith(localPath))) {
65
+ return false;
66
+ } // Descartar módulos built-in de Node.js (incluyendo node: prefix)
67
+ const cleanModuleName = moduleRequest.replace(/^node:/, '');
68
+ if (NODE_BUILTIN_MODULES.has(cleanModuleName)) {
69
+ return false;
70
+ } // NUEVA LÓGICA: Verificar PRIMERO si es un módulo excluido antes de verificar alias
71
+ // Esto es importante porque algunos módulos excluidos pueden tener nombres que
72
+ // coinciden con patrones de alias (como @vue/compiler-sfc con @/*)
73
+ const EXCLUDED_MODULES = new Set([
74
+ 'vue/compiler-sfc',
75
+ 'vue/dist/vue.runtime.esm-bundler',
76
+ '@vue/compiler-sfc',
77
+ '@vue/compiler-dom',
78
+ '@vue/runtime-core',
79
+ '@vue/runtime-dom',
80
+ 'oxc-parser',
81
+ 'oxc-parser/wasm',
82
+ 'oxc-minify',
83
+ 'oxc-minify/browser',
84
+ '@oxc-parser/binding-wasm32-wasi',
85
+ '@oxc-minify/binding-wasm32-wasi',
86
+ 'typescript/lib/typescript',
87
+ ]);
88
+ if (EXCLUDED_MODULES.has(moduleRequest)) {
89
+ return true;
90
+ } // Descartar alias conocidos
91
+ for (const alias of Object.keys(pathAlias)) {
92
+ const aliasPattern = alias.replace('/*', '');
93
+ if (moduleRequest.startsWith(aliasPattern)) {
94
+ return false;
95
+ }
96
+ } // Verificar si parece ser un módulo npm (no contiene extensiones de archivo)
97
+ if (moduleRequest.includes('.js') ||
98
+ moduleRequest.includes('.ts') ||
99
+ moduleRequest.includes('.vue') ||
100
+ moduleRequest.includes('.css') ||
101
+ moduleRequest.includes('.json')) {
102
+ return false;
103
+ }
104
+ // Si llegamos aquí, es probablemente un módulo externo
105
+ return true;
106
+ }
107
+ export async function replaceAliasImportStatic(file, code) {
108
+ if (!env.PATH_ALIAS || !env.PATH_DIST) {
109
+ return code;
110
+ }
111
+ const pathAlias = JSON.parse(env.PATH_ALIAS);
112
+ let resultCode = code;
113
+ // Usar regex para transformar imports estáticos
114
+ const importRegex = /import\s+(?:(?:\{[^}]*\}|\*\s+as\s+\w+|\w+)(?:\s*,\s*(?:\{[^}]*\}|\*\s+as\s+\w+|\w+))*\s+from\s+)?['"`]([^'"`]+)['"`]/g;
115
+ // Crear un array para procesar transformaciones async
116
+ const matches = Array.from(resultCode.matchAll(importRegex));
117
+ for (const match of matches) {
118
+ const [, moduleRequest] = match;
119
+ if (!moduleRequest)
120
+ continue; // Skip if moduleRequest is undefined
121
+ let newPath = null;
122
+ let transformed = false; // 1. PRIMERO: Verificar si es un módulo excluido (prioridad máxima)
123
+ if (!transformed && isExternalModule(moduleRequest, pathAlias)) {
124
+ try {
125
+ // Usar el sistema optimizado primero
126
+ const optimizedPath = await getOptimizedModulePath(moduleRequest, file);
127
+ if (optimizedPath === null) {
128
+ // Si el optimizador retorna null, significa que es un módulo excluido
129
+ continue;
130
+ }
131
+ if (optimizedPath) {
132
+ newPath = optimizedPath;
133
+ transformed = true;
134
+ }
135
+ else {
136
+ // Fallback al sistema anterior
137
+ const modulePath = getModuleSubPath(moduleRequest, file);
138
+ if (modulePath === null) {
139
+ continue;
140
+ }
141
+ if (modulePath) {
142
+ newPath = modulePath;
143
+ transformed = true;
144
+ }
145
+ }
146
+ }
147
+ catch (error) {
148
+ if (env.VERBOSE === 'true')
149
+ logger.warn(`Error resolviendo módulo ${moduleRequest}: ${error instanceof Error ? error.message : String(error)}`);
150
+ }
151
+ } // 2. Si no es módulo externo/excluido, verificar si es un alias conocido
152
+ if (!transformed) {
153
+ // Usar el sistema optimizado de alias
154
+ const aliasPath = getOptimizedAliasPath(moduleRequest);
155
+ if (aliasPath) {
156
+ let newImportPath = aliasPath;
157
+ // Transformar extensiones
158
+ if (newImportPath.endsWith('.ts') ||
159
+ newImportPath.endsWith('.vue')) {
160
+ newImportPath = newImportPath.replace(/\.(ts|vue)$/, '.js');
161
+ }
162
+ else if (!/\.(js|mjs|css|json)$/.test(newImportPath)) {
163
+ newImportPath += '.js';
164
+ }
165
+ newPath = newImportPath;
166
+ transformed = true;
167
+ }
168
+ else {
169
+ // Fallback al sistema anterior
170
+ for (const [alias] of Object.entries(pathAlias)) {
171
+ const aliasPattern = alias.replace('/*', '');
172
+ if (moduleRequest.startsWith(aliasPattern)) {
173
+ // Reemplazar el alias con la ruta del target
174
+ const relativePath = moduleRequest.replace(aliasPattern, '');
175
+ // Para alias que apuntan a la raíz (como @/* -> /src/*),
176
+ // solo usamos PATH_DIST + relativePath
177
+ let newImportPath = path.join('/', env.PATH_DIST, relativePath);
178
+ // Normalizar la ruta para eliminar ./ extra y separadores de Windows
179
+ newImportPath = newImportPath
180
+ .replace(/\/\.\//g, '/')
181
+ .replace(/\\/g, '/');
182
+ if (newImportPath.endsWith('.ts') ||
183
+ newImportPath.endsWith('.vue')) {
184
+ newImportPath = newImportPath.replace(/\.(ts|vue)$/, '.js');
185
+ }
186
+ else if (!/\.(js|mjs|css|json)$/.test(newImportPath)) {
187
+ newImportPath += '.js';
188
+ }
189
+ newPath = newImportPath;
190
+ transformed = true;
191
+ break;
192
+ }
193
+ }
194
+ }
195
+ }
196
+ // 3. Si no es alias ni módulo externo, verificar si es ruta relativa que necesita extensión .js
197
+ if (!transformed &&
198
+ (moduleRequest.startsWith('./') || moduleRequest.startsWith('../'))) {
199
+ let relativePath = moduleRequest;
200
+ if (relativePath.endsWith('.ts') || relativePath.endsWith('.vue')) {
201
+ relativePath = relativePath.replace(/\.(ts|vue)$/, '.js');
202
+ newPath = relativePath;
203
+ transformed = true;
204
+ }
205
+ else if (!/\.(js|mjs|css|json)$/.test(relativePath)) {
206
+ newPath = relativePath + '.js';
207
+ transformed = true;
208
+ }
209
+ }
210
+ // 4. Reemplazar solo el path en las comillas, no toda la línea
211
+ if (transformed && newPath) {
212
+ // Buscar y reemplazar solo la parte entre comillas
213
+ const pathRegex = new RegExp(`(['"\`])${moduleRequest.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\1`, 'g');
214
+ resultCode = resultCode.replace(pathRegex, `$1${newPath}$1`);
215
+ }
216
+ }
217
+ return resultCode;
218
+ }
219
+ async function replaceAliasImportDynamic(code, _imports, file) {
220
+ if (!env.PATH_ALIAS || !env.PATH_DIST) {
221
+ return code;
222
+ }
223
+ const pathAlias = JSON.parse(env.PATH_ALIAS);
224
+ const pathDist = env.PATH_DIST;
225
+ let resultCode = code;
226
+ // Regex para imports dinámicos normales con string (solo comillas simples y dobles)
227
+ const dynamicImportRegex = /import\s*\(\s*['"]([^'"]+)['"]\s*\)/g;
228
+ // Regex para template literals (solo backticks)
229
+ const templateLiteralRegex = /import\s*\(\s*`([^`]+)`\s*\)/g;
230
+ // Manejar imports dinámicos normales con string
231
+ const dynamicMatches = Array.from(resultCode.matchAll(dynamicImportRegex));
232
+ for (const match of dynamicMatches) {
233
+ const [, moduleRequest] = match;
234
+ if (!moduleRequest)
235
+ continue; // Skip if moduleRequest is undefined
236
+ let newPath = null;
237
+ let transformed = false; // 1. PRIMERO: Verificar si es un módulo excluido (prioridad máxima)
238
+ if (!transformed && isExternalModule(moduleRequest, pathAlias)) {
239
+ try {
240
+ // Usar el sistema optimizado primero
241
+ const optimizedPath = await getOptimizedModulePath(moduleRequest, file);
242
+ if (optimizedPath === null) {
243
+ // Si el optimizador retorna null, significa que es un módulo excluido
244
+ continue;
245
+ }
246
+ if (optimizedPath) {
247
+ newPath = optimizedPath;
248
+ transformed = true;
249
+ }
250
+ else {
251
+ // Fallback al sistema anterior
252
+ const modulePath = getModuleSubPath(moduleRequest, file);
253
+ if (modulePath === null) {
254
+ continue;
255
+ }
256
+ if (modulePath) {
257
+ newPath = modulePath;
258
+ transformed = true;
259
+ }
260
+ }
261
+ }
262
+ catch (error) {
263
+ if (env.VERBOSE === 'true')
264
+ logger.warn(`Error resolviendo módulo dinámico ${moduleRequest}: ${error instanceof Error ? error.message : String(error)}`);
265
+ }
266
+ } // 2. Si no es módulo externo/excluido, verificar si es un alias conocido
267
+ if (!transformed) {
268
+ // Usar el sistema optimizado de alias
269
+ const aliasPath = getOptimizedAliasPath(moduleRequest);
270
+ if (aliasPath) {
271
+ let newImportPath = aliasPath;
272
+ // Transformar extensiones
273
+ if (newImportPath.endsWith('.ts') ||
274
+ newImportPath.endsWith('.vue')) {
275
+ newImportPath = newImportPath.replace(/\.(ts|vue)$/, '.js');
276
+ }
277
+ else if (!/\.(js|mjs|css|json)$/.test(newImportPath)) {
278
+ newImportPath += '.js';
279
+ }
280
+ newPath = newImportPath;
281
+ transformed = true;
282
+ }
283
+ else {
284
+ // Fallback al sistema anterior
285
+ for (const [alias] of Object.entries(pathAlias)) {
286
+ const aliasPattern = alias.replace('/*', '');
287
+ if (moduleRequest.startsWith(aliasPattern)) {
288
+ // Reemplazar el alias con la ruta del target
289
+ const relativePath = moduleRequest.replace(aliasPattern, '');
290
+ // Para alias que apuntan a la raíz (como @/* -> /src/*),
291
+ // solo usamos PATH_DIST + relativePath
292
+ let newImportPath = path.join('/', pathDist, relativePath);
293
+ // Normalizar la ruta para eliminar ./ extra y separadores de Windows
294
+ newImportPath = newImportPath
295
+ .replace(/\/\.\//g, '/')
296
+ .replace(/\\/g, '/');
297
+ if (newImportPath.endsWith('.ts') ||
298
+ newImportPath.endsWith('.vue')) {
299
+ newImportPath = newImportPath.replace(/\.(ts|vue)$/, '.js');
300
+ }
301
+ else if (!/\.(js|mjs|css|json)$/.test(newImportPath)) {
302
+ newImportPath += '.js';
303
+ }
304
+ newPath = newImportPath;
305
+ transformed = true;
306
+ break;
307
+ }
308
+ }
309
+ }
310
+ }
311
+ // 3. Si no es alias ni módulo externo, verificar si es ruta relativa que necesita extensión .js
312
+ if (!transformed &&
313
+ (moduleRequest.startsWith('./') || moduleRequest.startsWith('../'))) {
314
+ let relativePath = moduleRequest;
315
+ if (relativePath.endsWith('.ts') || relativePath.endsWith('.vue')) {
316
+ relativePath = relativePath.replace(/\.(ts|vue)$/, '.js');
317
+ newPath = relativePath;
318
+ transformed = true;
319
+ }
320
+ else if (!/\.(js|mjs|css|json)$/.test(relativePath)) {
321
+ newPath = relativePath + '.js';
322
+ transformed = true;
323
+ }
324
+ }
325
+ // 4. Reemplazar solo el path en las comillas, no toda la expresión
326
+ if (transformed && newPath) {
327
+ // Buscar y reemplazar solo la parte entre comillas en import()
328
+ const pathRegex = new RegExp(`import\\s*\\(\\s*(['"])${moduleRequest.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\1\\s*\\)`, 'g');
329
+ resultCode = resultCode.replace(pathRegex, `import($1${newPath}$1)`);
330
+ }
331
+ }
332
+ // Manejar template literals - versión mejorada
333
+ resultCode = resultCode.replace(templateLiteralRegex, (match, moduleRequest) => {
334
+ let transformed = false;
335
+ let result = match;
336
+ // 1. PRIMERO: Verificar si es un módulo excluido (prioridad máxima)
337
+ if (!transformed && isExternalModule(moduleRequest, pathAlias)) {
338
+ try {
339
+ const modulePath = getModuleSubPath(moduleRequest, file);
340
+ if (modulePath === null) {
341
+ // Si getModuleSubPath retorna null, significa que es un módulo excluido
342
+ // No transformar y retornar el match original
343
+ return match;
344
+ }
345
+ if (modulePath) {
346
+ result = match.replace(moduleRequest, modulePath);
347
+ transformed = true;
348
+ }
349
+ }
350
+ catch (error) {
351
+ if (env.VERBOSE === 'true')
352
+ logger.warn(`Error resolviendo módulo template literal ${moduleRequest}: ${error instanceof Error ? error.message : String(error)}`);
353
+ }
354
+ }
355
+ // 2. Verificar aliases en template literals
356
+ if (!transformed) {
357
+ for (const [alias] of Object.entries(pathAlias)) {
358
+ const aliasPattern = alias.replace('/*', '');
359
+ if (moduleRequest.includes(aliasPattern)) {
360
+ const relativePath = moduleRequest.replace(aliasPattern, '');
361
+ // Para alias que apuntan a la raíz (como @/* -> /src/*),
362
+ // solo usamos PATH_DIST + relativePath
363
+ let newModuleRequest = path.join('/', pathDist, relativePath);
364
+ // Normalizar la ruta para eliminar ./ extra y barras duplicadas
365
+ newModuleRequest = newModuleRequest
366
+ .replace(/\/\.\//g, '/')
367
+ .replace(/\/+/g, '/')
368
+ .replace(/\\/g, '/'); // Normalizar separadores de Windows a Unix
369
+ result = match.replace(moduleRequest, newModuleRequest);
370
+ transformed = true;
371
+ break;
372
+ }
373
+ }
374
+ }
375
+ // 3. Si no es alias ni módulo externo, verificar si necesita transformación de extensión para rutas relativas
376
+ if (!transformed) {
377
+ // Para template literals que contienen rutas relativas, solo transformar extensiones
378
+ let newModuleRequest = moduleRequest;
379
+ if (moduleRequest.includes('./') ||
380
+ moduleRequest.includes('../')) {
381
+ // Transformar extensiones .ts y .vue a .js en template literals relativos
382
+ newModuleRequest = moduleRequest
383
+ .replace(/\.ts(\b|`)/g, '.js$1')
384
+ .replace(/\.vue(\b|`)/g, '.js$1');
385
+ if (newModuleRequest !== moduleRequest) {
386
+ result = match.replace(moduleRequest, newModuleRequest);
387
+ }
388
+ }
389
+ }
390
+ return result;
391
+ });
392
+ return resultCode;
393
+ }
394
+ /**
395
+ * Reemplaza alias en strings del código JavaScript (no solo en imports)
396
+ * Maneja casos como: link.href = 'P@/vendor/sweetalert2/sweetalert2.dark.min.css';
397
+ * @param code - El código JavaScript a transformar
398
+ * @returns El código con los alias reemplazados en strings
399
+ */
400
+ async function replaceAliasInStrings(code) {
401
+ if (!env.PATH_ALIAS || !env.PATH_DIST) {
402
+ return code;
403
+ }
404
+ const pathAlias = JSON.parse(env.PATH_ALIAS);
405
+ const pathDist = env.PATH_DIST;
406
+ let resultCode = code; // Regex para encontrar strings que contengan posibles alias
407
+ // Busca strings entre comillas simples, dobles o backticks que contengan alias
408
+ const stringRegex = /(['"`])([^'"`]+)(['"`])/g;
409
+ // Crear un array para procesar todas las coincidencias
410
+ const matches = Array.from(resultCode.matchAll(stringRegex));
411
+ for (const match of matches) {
412
+ const [fullMatch, openQuote, stringContent, closeQuote] = match;
413
+ // Verificar que las comillas de apertura y cierre coincidan
414
+ if (openQuote !== closeQuote || !stringContent)
415
+ continue; // Verificar si el string contiene algún alias
416
+ let transformed = false;
417
+ let newStringContent = stringContent;
418
+ // Ordenar alias por longitud (más largos primero) para priorizar alias más específicos
419
+ const sortedAliases = Object.entries(pathAlias).sort((a, b) => {
420
+ const aliasA = a[0].replace('/*', '');
421
+ const aliasB = b[0].replace('/*', '');
422
+ return aliasB.length - aliasA.length;
423
+ });
424
+ for (const [alias, target] of sortedAliases) {
425
+ const aliasPattern = alias.replace('/*', '');
426
+ // Verificar coincidencia exacta del alias seguido de '/' o al final del string
427
+ const aliasRegex = new RegExp(`^${aliasPattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(?=/|$)`);
428
+ if (aliasRegex.test(stringContent)) {
429
+ // IMPORTANTE: Verificar si es un módulo excluido antes de transformar
430
+ if (isExternalModule(stringContent, pathAlias)) {
431
+ // Para strings que parecen ser módulos externos, verificar si están excluidos
432
+ const EXCLUDED_MODULES = new Set([
433
+ 'vue/compiler-sfc',
434
+ 'vue/dist/vue.runtime.esm-bundler',
435
+ '@vue/compiler-sfc',
436
+ '@vue/compiler-dom',
437
+ '@vue/runtime-core',
438
+ '@vue/runtime-dom',
439
+ 'oxc-parser',
440
+ 'oxc-parser/wasm',
441
+ 'oxc-minify',
442
+ 'oxc-minify/browser',
443
+ '@oxc-parser/binding-wasm32-wasi',
444
+ '@oxc-minify/binding-wasm32-wasi',
445
+ 'typescript/lib/typescript',
446
+ ]);
447
+ if (EXCLUDED_MODULES.has(stringContent)) {
448
+ // Es un módulo excluido, no transformar
449
+ continue;
450
+ }
451
+ } // Reemplazar el alias con la ruta del target
452
+ const relativePath = stringContent.replace(aliasPattern, '');
453
+ // Construir la nueva ruta basada en la configuración del target
454
+ let newPath;
455
+ // El target puede ser un array de strings o un string
456
+ const targetArray = Array.isArray(target) ? target : [target];
457
+ const targetPath = targetArray[0];
458
+ if (targetPath.startsWith('/')) {
459
+ // Si el target empieza con /, es una ruta absoluta desde la raíz del proyecto
460
+ // Para targets como "/src/*", solo usamos PATH_DIST + relativePath
461
+ // sin incluir el directorio del target en la ruta final
462
+ newPath = path.join('/', pathDist, relativePath);
463
+ if (env.VERBOSE === 'true') {
464
+ console.log(` ✅ Ruta absoluta: pathDist="${pathDist}", relativePath="${relativePath}", newPath="${newPath}"`);
465
+ }
466
+ }
467
+ else {
468
+ // Si es una ruta relativa, verificar si ya apunta al directorio de distribución
469
+ const cleanTarget = targetPath
470
+ .replace('./', '')
471
+ .replace('/*', '');
472
+ const normalizedPathDist = pathDist.replace('./', '');
473
+ if (cleanTarget === normalizedPathDist) {
474
+ // Si el target es el mismo que PATH_DIST, no duplicar
475
+ newPath = path.join('/', normalizedPathDist, relativePath);
476
+ }
477
+ else {
478
+ // Si es diferente, usar PATH_DIST como base
479
+ newPath = path.join('/', normalizedPathDist, cleanTarget, relativePath);
480
+ }
481
+ }
482
+ // Normalizar la ruta para eliminar ./ extra y separadores de Windows
483
+ newPath = newPath
484
+ .replace(/\/\.\//g, '/')
485
+ .replace(/\\/g, '/')
486
+ .replace(/\/+/g, '/');
487
+ // Para archivos estáticos (CSS, JS, imágenes, etc.), mantener la extensión original
488
+ // No agregar .js automáticamente como hacemos con imports
489
+ newStringContent = newPath;
490
+ transformed = true;
491
+ break;
492
+ }
493
+ } // Si se transformó, reemplazar en el código
494
+ if (transformed) {
495
+ const newFullMatch = `${openQuote}${newStringContent}${closeQuote}`;
496
+ // Usar una expresión regular más específica para evitar reemplazos accidentales
497
+ const escapedOriginal = fullMatch.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
498
+ const specificRegex = new RegExp(escapedOriginal, 'g');
499
+ resultCode = resultCode.replace(specificRegex, newFullMatch);
500
+ }
501
+ }
502
+ return resultCode;
503
+ }
504
+ /**
505
+ * Elimina la etiqueta "html" de una cadena de plantilla.
506
+ * @param {string} data - La cadena de plantilla de la cual eliminar la etiqueta "html".
507
+ * @returns {Promise<string>} - La cadena de plantilla modificada sin la etiqueta "html".
508
+ */
509
+ const removehtmlOfTemplateString = async (data) => {
510
+ // Regex más específico que busca la etiqueta html seguida de un template literal
511
+ // Debe estar al inicio de línea o después de espacios/operadores, no después de punto
512
+ const htmlRegExp = /(?:^|[^.])html\s*`/g;
513
+ data = data.replace(htmlRegExp, match => {
514
+ // Preservar el carácter que no es punto antes de html
515
+ const beforeHtml = match.charAt(0) !== 'h' ? match.charAt(0) : '';
516
+ return beforeHtml + '`';
517
+ });
518
+ //remove ""
519
+ const htmlGetterRegExp = /,\s*get\s+html\(\)\s*{\s*return\s*html\s*}/g;
520
+ data = data.replace(htmlGetterRegExp, '');
521
+ return data;
522
+ };
523
+ /**
524
+ * Elimina los comentarios con la etiqueta @preserve de la cadena de datos proporcionada.
525
+ * @param {string} data - La cadena de entrada que contiene el código JavaScript.
526
+ * @returns {Promise<string>} - Una promesa que se resuelve con la cadena modificada sin los comentarios @preserve.
527
+ */
528
+ const removePreserverComent = async (data) => {
529
+ const preserverRegExp = /\/\*[\s\S]*?@preserve[\s\S]*?\*\/|\/\/.*?@preserve.*?(?=\n|$)/g;
530
+ data = data.replace(preserverRegExp, (match) => match.replace(/@preserve/g, ''));
531
+ return data;
532
+ };
533
+ /**
534
+ * Elimina la declaración de importación para 'code-tag' de la cadena de datos proporcionada.
535
+ * @param {string} data - La cadena de entrada que contiene el código JavaScript.
536
+ * @returns {Promise<string>} - Una promesa que se resuelve con la cadena modificada sin la importación de 'code-tag'.
537
+ */
538
+ const removeCodeTagImport = async (data) => {
539
+ // remove import if exist code-tag
540
+ const codeTagRegExp = /import\s+{.*}\s+from\s+['"].*code-tag.*['"];/g;
541
+ data = data.replace(codeTagRegExp, '');
542
+ return data;
543
+ };
544
+ export async function estandarizaCode(code, file) {
545
+ try {
546
+ const ast = await parser(file, code);
547
+ if (ast && ast.errors && ast.errors.length > 0) {
548
+ // Debug: mostrar la estructura del error para entender mejor qué información tenemos
549
+ if (env.VERBOSE === 'true') {
550
+ console.info('DEBUG - Estructura del error:', JSON.stringify(ast.errors[0], null, 2));
551
+ }
552
+ // Usar el nuevo sistema de reporte de errores
553
+ const detailedErrorReport = analyzeAndFormatMultipleErrors(ast.errors, code, file);
554
+ if (env.VERBOSE === 'true') {
555
+ logger.error(detailedErrorReport);
556
+ }
557
+ // También mantener el mensaje simple para el sistema existente
558
+ const firstError = ast.errors[0];
559
+ throw new Error(firstError?.message || 'Error sin mensaje');
560
+ }
561
+ code = await replaceAliasImportStatic(file, code);
562
+ code = await replaceAliasImportDynamic(code, ast?.module.dynamicImports, file);
563
+ code = await replaceAliasInStrings(code);
564
+ code = await removehtmlOfTemplateString(code);
565
+ code = await removeCodeTagImport(code);
566
+ if (env.isProd === 'true') {
567
+ code = await removePreserverComent(code);
568
+ }
569
+ return { code, error: null };
570
+ }
571
+ catch (error) {
572
+ return {
573
+ code: '',
574
+ error: error instanceof Error ? error.message : 'Unknown error',
575
+ };
576
+ }
577
+ }
578
+ //# sourceMappingURL=transforms.js.map