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