versacompiler 2.0.8 → 2.1.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 (34) hide show
  1. package/dist/compiler/compile.js +8 -9
  2. package/dist/compiler/error-reporter.js +2 -2
  3. package/dist/compiler/linter.js +1 -1
  4. package/dist/compiler/minify.js +1 -1
  5. package/dist/compiler/minifyTemplate.js +1 -0
  6. package/dist/compiler/module-resolution-optimizer.js +1 -1
  7. package/dist/compiler/parser.js +1 -1
  8. package/dist/compiler/performance-monitor.js +7 -7
  9. package/dist/compiler/tailwindcss.js +1 -1
  10. package/dist/compiler/transform-optimizer.js +1 -1
  11. package/dist/compiler/transformTStoJS.js +1 -1
  12. package/dist/compiler/transforms.js +1 -1
  13. package/dist/compiler/typescript-compiler.js +1 -1
  14. package/dist/compiler/typescript-error-parser.js +8 -8
  15. package/dist/compiler/typescript-manager.js +2 -2
  16. package/dist/compiler/typescript-sync-validator.js +2 -2
  17. package/dist/compiler/typescript-worker-pool.js +1 -1
  18. package/dist/compiler/typescript-worker-thread.cjs +3 -22
  19. package/dist/compiler/typescript-worker.js +1 -1
  20. package/dist/compiler/vuejs.js +22 -22
  21. package/dist/hrm/VueHRM.js +1 -1
  22. package/dist/hrm/initHRM.js +1 -1
  23. package/dist/main.js +3 -3
  24. package/dist/servicios/browserSync.js +2 -7
  25. package/dist/servicios/file-watcher.js +3 -3
  26. package/dist/servicios/readConfig.js +2 -54
  27. package/dist/utils/module-resolver.js +1 -1
  28. package/dist/utils/proxyValidator.js +1 -1
  29. package/dist/utils/resolve-bin.js +1 -1
  30. package/dist/utils/vue-types-setup.js +1 -1
  31. package/dist/wrappers/eslint-node.js +147 -1
  32. package/dist/wrappers/oxlint-node.js +1 -1
  33. package/dist/wrappers/tailwind-node.js +1 -1
  34. package/package.json +103 -109
@@ -1,2 +1,2 @@
1
- import e from"node:fs";import i from"node:path";import*as a from"node:process";import{env as o}from"node:process";import*as s from"typescript";import{createUnifiedErrorMessage as c,parseTypeScriptErrors as l}from"./typescript-error-parser.js";import{validateTypesWithLanguageService as u}from"./typescript-sync-validator.js";import{TypeScriptWorkerPool as d}from"./typescript-worker-pool.js";let f={};export const loadTypeScriptConfig=o=>{let c=i.resolve(a.cwd(),`tsconfig.json`),l=i.dirname(o),u=e.existsSync(c)?c:s.findConfigFile(l,s.sys.fileExists,`tsconfig.json`);if(f.path===u&&f.options)return f.options;let d;if(u&&e.existsSync(u))try{let{config:e,error:a}=s.readConfigFile(u,s.sys.readFile);if(a)throw Error(`Error al leer tsconfig.json: ${a.messageText}`);{let a=s.parseJsonConfigFileContent(e,s.sys,i.dirname(u));d=a.options}}catch(e){throw console.warn(`[loadTypeScriptConfig] Error cargando ${u}:`,e),Error(`No se puede continuar sin un tsconfig.json válido. Error: ${e}`)}else throw Error(`No se encontró tsconfig.json en la raíz del proyecto (${c}) ni en el directorio del archivo. El compilador requiere un tsconfig.json para funcionar correctamente.`);return f={path:u,options:d},d};const p=e=>{let i={...e};return i};export const validateVueTypes=(e,i,a)=>{let o=``;if(i.endsWith(`.vue`)){let i=e.match(/<script[^>]*>([\s\S]*?)<\/script>/i);if(i&&i[1])o=i[1].trim();else return{diagnostics:[],hasErrors:!1}}else o=e;if(!o.trim())return{diagnostics:[],hasErrors:!1};let c=loadTypeScriptConfig(i),l;if(l=a?.compilerOptions?{...a.compilerOptions}:{...c},i.endsWith(`.vue`)){l.jsx=s.JsxEmit.Preserve,l.moduleResolution||=s.ModuleResolutionKind.NodeJs;let e=l.lib||c.lib||[`ES2020`],i=e.some(e=>typeof e==`string`&&(e.toLowerCase().includes(`dom`)||e.toLowerCase()===`dom`));i||(l.lib=[...e,`DOM`,`DOM.Iterable`]);let a=l.types||c.types||[];a.includes(`vue`)||(l.types=[...a,`vue`])}return l.skipLibCheck===void 0&&(l.skipLibCheck=!0),a?.strictMode!==void 0&&(l.noImplicitReturns===void 0&&(l.noImplicitReturns=a.strictMode),l.noImplicitThis===void 0&&(l.noImplicitThis=a.strictMode),l.strictNullChecks===void 0&&(l.strictNullChecks=a.strictMode),l.strictFunctionTypes===void 0&&(l.strictFunctionTypes=a.strictMode),l.exactOptionalPropertyTypes===void 0&&(l.exactOptionalPropertyTypes=!1),l.noFallthroughCasesInSwitch===void 0&&(l.noFallthroughCasesInSwitch=a.strictMode)),u(i,o,l)};const m=(e,i)=>{if(e.trim()===`export {};`)return``;let a=/(?:^|\s)(?:import|export)\s+(?!(?:\s*\{\s*\}\s*;?\s*$))/m.test(i);if(!a){let i=/export\s*\{\s*\}\s*;\s*$/m,a=i.test(e);if(a)return e.replace(i,``)}return e};export const preCompileTS=async(e,i)=>{try{if(!e.trim())return{error:null,data:e,lang:`ts`};let a=loadTypeScriptConfig(i),u=s.transpileModule(e,{compilerOptions:{...a,noLib:!0,skipLibCheck:!0,isolatedModules:!0},fileName:i,reportDiagnostics:!0});if(u.diagnostics?.length){let a=u.diagnostics.filter(e=>{if(e.category!==s.DiagnosticCategory.Error)return!1;let i=s.flattenDiagnosticMessageText(e.messageText,`
2
- `);return!i.includes(`Cannot find module`)&&!i.includes(`Could not find source file`)&&e.code!==2307&&e.code!==6059});if(a.length>0){let o=c(l(a,i,e));return{error:Error(o),data:null,lang:`ts`}}}if(o.typeCheck===`true`)try{let o=d.getInstance(),s=p(a),u=await o.typeCheck(i,e,s);if(u.hasErrors){let a=c(l(u.diagnostics,i,e));return{error:Error(a),data:null,lang:`ts`}}}catch(e){console.warn(`[preCompileTS] ❌ Type checking falló, usando transpilación sin verificación de tipos:`,e)}let f=u.outputText;return f=m(f,e),{error:null,data:f,lang:`ts`}}catch(e){return{error:e instanceof Error?e:Error(`Error desconocido`),data:null,lang:`ts`}}};
1
+ import e from"node:fs";import a from"node:path";import*as o from"node:process";import{env as s}from"node:process";import*as c from"typescript";import{createUnifiedErrorMessage as l,parseTypeScriptErrors as u}from"./typescript-error-parser.js";import{validateTypesWithLanguageService as d}from"./typescript-sync-validator.js";import{TypeScriptWorkerPool as f}from"./typescript-worker-pool.js";let p={};export const loadTypeScriptConfig=s=>{let l=a.resolve(o.cwd(),`tsconfig.json`),u=a.dirname(s),d=e.existsSync(l)?l:c.findConfigFile(u,c.sys.fileExists,`tsconfig.json`);if(d&&e.existsSync(d)){let a=e.statSync(d).mtimeMs;if(p.path===d&&p.mtime===a&&p.options)return p.options}let f;if(d&&e.existsSync(d)){let o=e.statSync(d).mtimeMs;try{let{config:e,error:o}=c.readConfigFile(d,c.sys.readFile);if(!o)f=c.parseJsonConfigFileContent(e,c.sys,a.dirname(d)).options;else throw Error(`Error al leer tsconfig.json: ${o.messageText}`)}catch(e){throw console.warn(`[loadTypeScriptConfig] Error cargando ${d}:`,e),Error(`No se puede continuar sin un tsconfig.json válido. Error: ${e}`,{cause:e})}return p={path:d,options:f,mtime:o},f}else throw Error(`No se encontró tsconfig.json en la raíz del proyecto (${l}) ni en el directorio del archivo. El compilador requiere un tsconfig.json para funcionar correctamente.`)};export function invalidateConfigCache(){p={}}const m=e=>({...e});export const validateVueTypes=(e,a,o)=>{let s=``;if(a.endsWith(`.vue`)){let a=e.match(/<script[^>]*>([\s\S]*?)<\/script>/i);if(a&&a[1])s=a[1].trim();else return{diagnostics:[],hasErrors:!1}}else s=e;if(!s.trim())return{diagnostics:[],hasErrors:!1};let l=loadTypeScriptConfig(a),u;if(u=o?.compilerOptions?{...o.compilerOptions}:{...l},a.endsWith(`.vue`)){u.jsx=c.JsxEmit.Preserve,u.moduleResolution||(u.moduleResolution=c.ModuleResolutionKind.NodeJs);let e=u.lib||l.lib||[`ES2020`];e.some(e=>typeof e==`string`&&(e.toLowerCase().includes(`dom`)||e.toLowerCase()===`dom`))||(u.lib=[...e,`DOM`,`DOM.Iterable`]);let a=u.types||l.types||[];a.includes(`vue`)||(u.types=[...a,`vue`])}return u.skipLibCheck===void 0&&(u.skipLibCheck=!0),o?.strictMode!==void 0&&(u.noImplicitReturns===void 0&&(u.noImplicitReturns=o.strictMode),u.noImplicitThis===void 0&&(u.noImplicitThis=o.strictMode),u.strictNullChecks===void 0&&(u.strictNullChecks=o.strictMode),u.strictFunctionTypes===void 0&&(u.strictFunctionTypes=o.strictMode),u.exactOptionalPropertyTypes===void 0&&(u.exactOptionalPropertyTypes=!1),u.noFallthroughCasesInSwitch===void 0&&(u.noFallthroughCasesInSwitch=o.strictMode)),d(a,s,u)};const h=(e,a)=>{if(e.trim()===`export {};`)return``;if(!/(?:^|\s)(?:import|export)\s+(?!(?:\s*\{\s*\}\s*;?\s*$))/m.test(a)){let a=/export\s*\{\s*\}\s*;\s*$/m;if(a.test(e))return e.replace(a,``)}return e};export const preCompileTS=async(e,a)=>{try{if(!e.trim())return{error:null,data:e,lang:`ts`};let o=loadTypeScriptConfig(a),d=c.transpileModule(e,{compilerOptions:{...o,noLib:!0,skipLibCheck:!0,isolatedModules:!0,noResolve:!0,allowSyntheticDefaultImports:!0,incremental:!1,diagnostics:!1},fileName:a,reportDiagnostics:s.VERBOSE===`true`});if(d.diagnostics?.length){let o=d.diagnostics.filter(e=>{if(e.category!==c.DiagnosticCategory.Error)return!1;let a=c.flattenDiagnosticMessageText(e.messageText,`
2
+ `);return!a.includes(`Cannot find module`)&&!a.includes(`Could not find source file`)&&e.code!==2307&&e.code!==6059});if(o.length>0){let s=l(u(o,a,e));return{error:Error(s),data:null,lang:`ts`}}}if(s.typeCheck===`true`)try{let s=f.getInstance(),c=m(o),d=await s.typeCheck(a,e,c);if(d.hasErrors){let o=l(u(d.diagnostics,a,e));return{error:Error(o),data:null,lang:`ts`}}}catch(e){console.warn(`[preCompileTS] ❌ Type checking falló, usando transpilación sin verificación de tipos:`,e)}let p=d.outputText;return p=h(p,e),{error:null,data:p,lang:`ts`}}catch(e){return{error:e instanceof Error?e:Error(`Error desconocido`),data:null,lang:`ts`}}};
@@ -28,5 +28,5 @@ declare module '*.vue' {
28
28
  const component: any;
29
29
  export default component;
30
30
  }
31
- export {};`;class a{files=new Map;compilerOptions;constructor(e){this.compilerOptions={...e,lib:e.lib||[`ES2020`,`DOM`,`DOM.Iterable`]}}addFile(e,t){let n=this.files.get(e);this.files.set(e,{version:n?n.version+1:1,content:t})}getCompilationSettings(){return this.compilerOptions}getScriptFileNames(){return Array.from(this.files.keys())}getScriptVersion(e){let t=this.files.get(e);return t?t.version.toString():`0`}getScriptSnapshot(t){let n=this.files.get(t);if(n)return r.ScriptSnapshot.fromString(n.content);if(e.existsSync(t))try{let n=e.readFileSync(t,`utf-8`);return r.ScriptSnapshot.fromString(n)}catch{return}}getCurrentDirectory(){return n.cwd()}getDefaultLibFileName(e){return r.getDefaultLibFilePath(e)}fileExists(t){return this.files.has(t)||e.existsSync(t)}readFile(t){let n=this.files.get(t);if(n)return n.content;if(e.existsSync(t))try{return e.readFileSync(t,`utf-8`)}catch{return}}getNewLine(){return r.sys.newLine}}export const validateTypesWithLanguageService=(o,s,c)=>{try{if(!s.trim())return{diagnostics:[],hasErrors:!1};let l=new a(c),u=o;if(o.endsWith(`.vue`)&&(u=o.replace(`.vue`,`.vue.ts`)),l.addFile(u,s),o.endsWith(`.vue`)){let r=n.cwd(),a=t.join(r,`src/types/vue-shims.d.ts`);try{if(e.existsSync(a)){let t=e.readFileSync(a,`utf-8`);l.addFile(a,t)}else{let e=i(),n=t.join(t.dirname(o),`vue-fallback.d.ts`);l.addFile(n,e)}}catch(e){console.warn(`Error al cargar tipos Vue:`,e);let n=i(),r=t.join(t.dirname(o),`vue-fallback.d.ts`);l.addFile(r,n)}}let d=r.createLanguageService(l);try{if(!l.fileExists(u))return console.log(`File does not exist in host, returning empty result`),{diagnostics:[],hasErrors:!1};let e=[],t=[];try{e=d.getSyntacticDiagnostics(u)}catch{}try{t=d.getSemanticDiagnostics(u)}catch{}let n=[...e,...t],i=n.filter(e=>{let t=r.flattenDiagnosticMessageText(e.messageText,`
32
- `);if(e.category!==r.DiagnosticCategory.Error)return!1;let n=[`Cannot find module`,`Could not find source file`,`has no exported member 'mergeModels'`,`Unable to resolve signature of method decorator`,`The runtime will invoke the decorator with`,`Module resolution kind is not specified`,`Cannot resolve module`,`Cannot find name 'console'`,`Do you need to change your target library`];for(let e of n)if(t.includes(e))return!1;let i=[1241,2307,2584,6133];if(i.includes(e.code))return!1;if(o.endsWith(`.vue`)){let e=[`$props`,`$setup`,`$data`,`$options`,`$event`,`_ctx`,`_cache`,`__expose`,`__emit`,`__slots`,`__props`,`__defaults`];if(t.includes(`implicitly has an 'any' type`)){let n=e.some(e=>t.includes(`'${e}'`)||t.includes(`"${e}"`));if(n)return!1}if(t.includes(`Parameter`)&&t.includes(`implicitly has an`)&&e.some(e=>t.includes(e)))return!1}return!0});return{diagnostics:i,hasErrors:i.length>0}}catch{return{diagnostics:[],hasErrors:!1}}}catch(e){let t={file:void 0,start:void 0,length:void 0,messageText:`Error en validación de tipos: ${e instanceof Error?e.message:`Error desconocido`}`,category:r.DiagnosticCategory.Error,code:0};return{diagnostics:[t],hasErrors:!0}}};export const validateVueTypes=(e,t,n)=>validateTypesWithLanguageService(t,e,n);
31
+ export {};`;class a{files=new Map;compilerOptions;constructor(e){this.compilerOptions={...e,lib:e.lib||[`ES2020`,`DOM`,`DOM.Iterable`]}}addFile(e,t){let n=this.files.get(e);this.files.set(e,{version:n?n.version+1:1,content:t})}getCompilationSettings(){return this.compilerOptions}getScriptFileNames(){return Array.from(this.files.keys())}getScriptVersion(e){let t=this.files.get(e);return t?t.version.toString():`0`}getScriptSnapshot(t){let n=this.files.get(t);if(n)return r.ScriptSnapshot.fromString(n.content);if(e.existsSync(t))try{let n=e.readFileSync(t,`utf-8`);return r.ScriptSnapshot.fromString(n)}catch{return}}getCurrentDirectory(){return n.cwd()}getDefaultLibFileName(e){return r.getDefaultLibFilePath(e)}fileExists(t){return this.files.has(t)||e.existsSync(t)}readFile(t){let n=this.files.get(t);if(n)return n.content;if(e.existsSync(t))try{return e.readFileSync(t,`utf-8`)}catch{return}}getNewLine(){return r.sys.newLine}}export const validateTypesWithLanguageService=(o,s,c)=>{try{if(!s.trim())return{diagnostics:[],hasErrors:!1};let l=new a(c),u=o;if(o.endsWith(`.vue`)&&(u=o.replace(`.vue`,`.vue.ts`)),l.addFile(u,s),o.endsWith(`.vue`)){let r=n.cwd(),a=t.join(r,`src/types/vue-shims.d.ts`);try{if(e.existsSync(a)){let t=e.readFileSync(a,`utf-8`);l.addFile(a,t)}else{let e=i(),n=t.join(t.dirname(o),`vue-fallback.d.ts`);l.addFile(n,e)}}catch(e){console.warn(`Error al cargar tipos Vue:`,e);let n=i(),r=t.join(t.dirname(o),`vue-fallback.d.ts`);l.addFile(r,n)}}let d=r.createLanguageService(l);try{if(!l.fileExists(u))return console.log(`File does not exist in host, returning empty result`),{diagnostics:[],hasErrors:!1};let e=[],t=[];try{e=d.getSyntacticDiagnostics(u)}catch{}try{t=d.getSemanticDiagnostics(u)}catch{}let n=[...e,...t].filter(e=>{let t=r.flattenDiagnosticMessageText(e.messageText,`
32
+ `);if(e.category!==r.DiagnosticCategory.Error)return!1;for(let e of[`Cannot find module`,`Could not find source file`,`has no exported member 'mergeModels'`,`Unable to resolve signature of method decorator`,`The runtime will invoke the decorator with`,`Module resolution kind is not specified`,`Cannot resolve module`,`Cannot find name 'console'`,`Do you need to change your target library`])if(t.includes(e))return!1;if([1241,2307,2584,6133].includes(e.code))return!1;if(o.endsWith(`.vue`)){let e=[`$props`,`$setup`,`$data`,`$options`,`$event`,`_ctx`,`_cache`,`__expose`,`__emit`,`__slots`,`__props`,`__defaults`];if(t.includes(`implicitly has an 'any' type`)&&e.some(e=>t.includes(`'${e}'`)||t.includes(`"${e}"`))||t.includes(`Parameter`)&&t.includes(`implicitly has an`)&&e.some(e=>t.includes(e)))return!1}return!0});return{diagnostics:n,hasErrors:n.length>0}}catch{return{diagnostics:[],hasErrors:!1}}}catch(e){return{diagnostics:[{file:void 0,start:void 0,length:void 0,messageText:`Error en validación de tipos: ${e instanceof Error?e.message:`Error desconocido`}`,category:r.DiagnosticCategory.Error,code:0}],hasErrors:!0}}};export const validateVueTypes=(e,t,n)=>validateTypesWithLanguageService(t,e,n);
@@ -1 +1 @@
1
- import*as e from"node:os";import*as t from"node:path";import*as n from"node:process";import{Worker as r}from"node:worker_threads";import{validateTypesWithLanguageService as i}from"./typescript-sync-validator.js";export class TypeScriptWorkerPool{static instance;workers=[];poolSize;workerPath;initPromise=null;isInitialized=!1;TASK_TIMEOUT=15e3;WORKER_INIT_TIMEOUT=5e3;MAX_TASKS_PER_WORKER=25;WORKER_MEMORY_CHECK_INTERVAL=50;totalTasks=0;completedTasks=0;failedTasks=0;constructor(){let r=e.cpus().length;this.poolSize=Math.min(Math.max(r-1,2),8),this.workerPath=t.join(n.env.PATH_PROY||t.join(n.cwd(),`src`),`compiler`,`typescript-worker-thread.cjs`)}startMemoryMonitoring(){setInterval(()=>{this.checkWorkersMemory()},15e3),setInterval(()=>{this.cleanupInactiveWorkers()},12e4)}async checkWorkersMemory(){let e=Date.now();for(let t of this.workers){t.lastMemoryCheck=e;try{let e=await this.getWorkerMemoryUsage(t);if(t.memoryUsage=e.heapUsed,this.shouldRecycleWorker(t)){let e=this.getRecycleReason(t);console.warn(`[WorkerPool] Worker ${t.id} requiere reciclaje: ${e}`),await this.recycleWorker(t)}}catch(e){console.warn(`[WorkerPool] Error verificando memoria del worker ${t.id}:`,e)}}}async getWorkerMemoryUsage(e){return new Promise(t=>{let n=setTimeout(()=>{t({heapUsed:e.tasksProcessed*2048,heapTotal:e.tasksProcessed*3072,rss:e.tasksProcessed*4096})},1e3),r=`memory-${e.id}-${Date.now()}`,i=a=>{a.id===r&&a.type===`memory-usage`&&(clearTimeout(n),e.worker.off(`message`,i),t({heapUsed:a.memoryUsage?.heapUsed||e.tasksProcessed*2048,heapTotal:a.memoryUsage?.heapTotal||e.tasksProcessed*3072,rss:a.memoryUsage?.rss||e.tasksProcessed*4096}))};e.worker.on(`message`,i),e.worker.postMessage({type:`get-memory-usage`,id:r})})}getRecycleReason(e){let t=Date.now(),n=50*1024*1024,r=1800*1e3,i=this.MAX_TASKS_PER_WORKER,a=[];return e.memoryUsage>n&&a.push(`memoria excede ${Math.round(n/1024/1024)}MB (actual: ${Math.round(e.memoryUsage/1024/1024)}MB)`),t-e.creationTime>r&&a.push(`tiempo de vida excede ${Math.round(r/6e4)} minutos`),e.tasksProcessed>=i&&a.push(`tareas procesadas exceden ${i} (actual: ${e.tasksProcessed})`),a.join(`, `)}async cleanupInactiveWorkers(){let e=Date.now(),t=300*1e3;for(let t of this.workers){let n=e-t.lastActivityTime;n>3e5&&!t.busy&&t.pendingTasks.size===0&&(console.info(`[WorkerPool] Worker ${t.id} inactivo por ${Math.round(n/6e4)} minutos, reciclando...`),await this.recycleWorker(t))}}shouldRecycleWorker(e){let t=Date.now(),n=30*1024*1024,r=900*1e3,i=this.MAX_TASKS_PER_WORKER;return e.memoryUsage>31457280||t-e.creationTime>9e5||e.tasksProcessed>=i}static getInstance(){return TypeScriptWorkerPool.instance||=new TypeScriptWorkerPool,TypeScriptWorkerPool.instance}setMode(t){switch(t){case`batch`:this.poolSize=Math.min(e.cpus().length,12);break;case`watch`:this.poolSize=Math.min(Math.max(e.cpus().length/2,2),6);break;case`individual`:this.poolSize=Math.min(4,e.cpus().length);break}}async initializePool(){return this.initPromise||=this._performPoolInitialization(),this.initPromise}async _performPoolInitialization(){try{let e=await import(`node:fs`),t=e.existsSync(this.workerPath);if(!t)throw Error(`Worker thread file not found: ${this.workerPath}`);let n=Array.from({length:this.poolSize},(e,t)=>this.createWorker(t));this.workers=await Promise.all(n),this.isInitialized=!0}catch(e){throw this.isInitialized=!1,e}}async createWorker(e){return new Promise((t,i)=>{try{let a=new r(this.workerPath,{env:{...n.env,NODE_OPTIONS:``,WORKER_ID:e.toString()}}),o={worker:a,id:e,busy:!1,pendingTasks:new Map,taskCounter:0,memoryUsage:0,lastMemoryCheck:Date.now(),tasksProcessed:0,creationTime:Date.now(),lastActivityTime:Date.now()};this.setupWorkerListeners(o);let s=setTimeout(()=>{i(Error(`Worker ${e} initialization timeout`))},this.WORKER_INIT_TIMEOUT),c=()=>{a.postMessage({type:`ping`})};a.on(`message`,function e(n){(n.id===`worker-ready`||n.message===`pong`)&&(clearTimeout(s),a.off(`message`,e),t(o))}),a.on(`error`,e=>{clearTimeout(s),i(e)}),c()}catch(e){i(e)}})}setupWorkerListeners(e){let{worker:t}=e;t.on(`message`,t=>{try{if(t.id===`worker-ready`||t.message===`pong`||t.type===`memory-usage`)return;let n=e.pendingTasks.get(t.id);if(!n)return;if(clearTimeout(n.timeout),e.pendingTasks.delete(t.id),e.pendingTasks.size===0&&(e.busy=!1),e.lastActivityTime=Date.now(),t.success&&t.diagnostics!==void 0&&t.hasErrors!==void 0){this.completedTasks++;let e=this.categorizeTypeScriptErrors({diagnostics:t.diagnostics,hasErrors:t.hasErrors},n.fileName);n.resolve(e)}else{this.failedTasks++;let e=t.error||`Error desconocido del worker`,r=this.createCategorizedError(e,n.fileName,t);n.reject(r)}}catch{}}),t.on(`error`,async t=>{await this.handleWorkerError(e,t)}),t.on(`exit`,async t=>{await this.handleWorkerExit(e,t)})}async handleWorkerError(e,t){console.warn(`[WorkerPool] Manejando error del worker ${e.id}:`,t.message),e.pendingTasks.forEach(n=>{clearTimeout(n.timeout),this.failedTasks++,n.reject(Error(`Worker ${e.id} failed: ${t.message}`))}),e.pendingTasks.clear();try{e.worker.removeAllListeners(),await e.worker.terminate()}catch(t){console.error(`[WorkerPool] Error terminando worker ${e.id}:`,t)}if(e.busy=!1,this.isInitialized&&this.workers.length>0)try{let t=await this.createWorker(e.id),n=this.workers.findIndex(t=>t.id===e.id);n!==-1&&(this.workers[n]=t)}catch(t){console.error(`[WorkerPool] No se pudo recrear worker ${e.id}:`,t)}}async handleWorkerExit(e,t){console.warn(`[WorkerPool] Worker ${e.id} salió con código ${t}`),e.pendingTasks.forEach(n=>{clearTimeout(n.timeout),this.failedTasks++,n.reject(Error(`Worker ${e.id} exited with code ${t}`))}),e.pendingTasks.clear(),e.busy=!1;try{e.worker.removeAllListeners()}catch{}if(this.isInitialized&&this.workers.length>0)try{await this.recreateWorker(e)}catch(t){console.error(`[WorkerPool] Error recreando worker ${e.id}:`,t)}}async recreateWorker(e){try{let t=await this.createWorker(e.id),n=this.workers.findIndex(t=>t.id===e.id);n!==-1&&(this.workers[n]=t)}catch{}}async recycleWorker(e){try{console.log(`[WorkerPool] Reciclando worker ${e.id} después de ${e.taskCounter} tareas`);let t=2e3,n=Date.now();await new Promise(t=>{let r=()=>{e.pendingTasks.size===0||Date.now()-n>=2e3?t():setTimeout(r,100)};r()}),e.pendingTasks.size>0&&(e.pendingTasks.forEach(e=>{clearTimeout(e.timeout),e.reject(Error(`Worker being recycled`))}),e.pendingTasks.clear()),e.worker.removeAllListeners(),await e.worker.terminate();let r=await this.createWorker(e.id),i=this.workers.findIndex(t=>t.id===e.id);i!==-1&&(this.workers[i]=r)}catch(t){console.error(`[WorkerPool] Error reciclando worker ${e.id}:`,t)}}findAvailableWorker(){let e=this.workers.find(e=>!e.busy&&e.pendingTasks.size===0);if(e)return e;let t=this.workers.reduce((e,t)=>t.pendingTasks.size<e.pendingTasks.size?t:e);return t.pendingTasks.size<5?t:null}async typeCheck(e,t,n){if(await this.initializePool(),!this.isInitialized)return this.typeCheckWithSyncFallback(e,t,n);let r=this.findAvailableWorker();if(!r)return this.typeCheckWithSyncFallback(e,t,n);try{return this.totalTasks++,await this.typeCheckWithWorker(r,e,t,n)}catch{return this.typeCheckWithSyncFallback(e,t,n)}}async typeCheckWithWorker(e,t,n,r){return e.taskCounter>=this.MAX_TASKS_PER_WORKER&&await this.recycleWorker(e),new Promise((i,a)=>{let o=`task-${e.id}-${++e.taskCounter}-${Date.now()}`;e.busy=!0,e.lastActivityTime=Date.now(),e.tasksProcessed++;let s=this.calculateDynamicTimeout(t,n,r),c=setTimeout(()=>{e.pendingTasks.delete(o),e.pendingTasks.size===0&&(e.busy=!1),a(Error(`Timeout (${s}ms) en type checking para ${t} - archivo complejo detectado`))},s);e.pendingTasks.set(o,{resolve:i,reject:a,timeout:c,fileName:t,startTime:Date.now()});try{let i={id:o,fileName:t,content:n,compilerOptions:{...r,_workerTimeout:s-1e3}};e.worker.postMessage(i)}catch(t){clearTimeout(c),e.pendingTasks.delete(o),e.pendingTasks.size===0&&(e.busy=!1),a(t)}})}calculateDynamicTimeout(e,t,n){let r=this.TASK_TIMEOUT,i=1,a=t.length;a>1e5?i+=1.5:a>5e4?i+=1:a>2e4&&(i+=.5);let o=(t.match(/^import\s+/gm)||[]).length,s=(t.match(/\btype\s+\w+/g)||[]).length,c=(t.match(/\binterface\s+\w+/g)||[]).length,l=(t.match(/<[^>]*>/g)||[]).length,u=o+s+c+l*.5;u>100?i+=2:u>50?i+=1:u>20&&(i+=.5),(n?.strict||n?.noImplicitAny)&&(i+=.3),e.includes(`.d.ts`)?i+=1:e.includes(`.vue`)&&(i+=.5),i=Math.min(i,5),i=Math.max(i,.5);let d=Math.round(r*i);return Math.min(d,6e4)}typeCheckWithSyncFallback(e,t,n){try{return i(e,t,n)}catch{return{diagnostics:[],hasErrors:!1}}}async terminate(){console.log(`[WorkerPool] Cerrando pool de workers...`);let e=0;for(let t of this.workers){e+=t.pendingTasks.size,t.pendingTasks.forEach(e=>{clearTimeout(e.timeout),e.reject(Error(`Worker pool cerrado`))}),t.pendingTasks.clear();try{t.worker.removeAllListeners()}catch{}}e>0&&console.log(`[WorkerPool] Se cancelaron ${e} tareas pendientes`);let t=this.workers.map(async e=>{try{await e.worker.terminate()}catch(t){console.warn(`[WorkerPool] Error terminando worker ${e.id}:`,t)}});await Promise.allSettled(t),this.workers=[],this.isInitialized=!1,this.initPromise=null,console.log(`[WorkerPool] Pool cerrado. Estadísticas finales: ${this.completedTasks} completadas, ${this.failedTasks} fallidas`)}getStats(){let e=this.workers.filter(e=>e.busy).length,t=this.workers.reduce((e,t)=>e+t.pendingTasks.size,0),n=this.totalTasks>0?Math.round(this.completedTasks/this.totalTasks*100):0;return{poolSize:this.workers.length,busyWorkers:e,totalPendingTasks:t,totalTasks:this.totalTasks,completedTasks:this.completedTasks,failedTasks:this.failedTasks,successRate:n}}categorizeTypeScriptErrors(e,t){if(!e.hasErrors||!e.diagnostics?.length)return e;let n=e.diagnostics.map(e=>{let n={...e,_category:this.getErrorCategory(e),_severity:this.getErrorSeverity(e),_fileName:t,_timestamp:Date.now()};return n});return{...e,diagnostics:n,_errorStats:this.calculateErrorStats(n)}}getErrorCategory(e){let t=e.code;return[2304,2339,2346].includes(t)?`MISSING_DECLARATION`:[2322,2322,2345].includes(t)?`TYPE_MISMATCH`:[2307,2317].includes(t)?`MODULE_RESOLUTION`:[2552,2551].includes(t)?`PROPERTY_ACCESS`:t>=1e3&&t<2e3?`SYNTAX_ERROR`:t>=2e3&&t<3e3?`SEMANTIC_ERROR`:t>=4e3?`CONFIG_ERROR`:`OTHER`}getErrorSeverity(e){let t=e.category;switch(t){case 1:return`ERROR`;case 2:return`WARNING`;case 3:return`INFO`;default:return`ERROR`}}calculateErrorStats(e){let t={totalErrors:e.length,errorsByCategory:{},errorsBySeverity:{},mostCommonError:null};e.forEach(e=>{let n=e._category||`OTHER`,r=e._severity||`ERROR`;t.errorsByCategory[n]=(t.errorsByCategory[n]||0)+1,t.errorsBySeverity[r]=(t.errorsBySeverity[r]||0)+1});let n={};e.forEach(e=>{let t=String(e.code);n[t]=(n[t]||0)+1});let r=Object.keys(n);if(r.length>0){let i=r.reduce((e,t)=>(n[e]||0)>(n[t]||0)?e:t);t.mostCommonError={code:i,count:n[i],message:e.find(e=>String(e.code)===i)?.messageText}}return t}createCategorizedError(e,t,n){let r=Error(e);return r.fileName=t,r.timestamp=Date.now(),r.workerResponse=n,r.category=this.categorizeGenericError(e),r.isRecoverable=this.isRecoverableError(e),r}categorizeGenericError(e){return e.includes(`timeout`)||e.includes(`Timeout`)?`TIMEOUT`:e.includes(`memory`)||e.includes(`Memory`)?`MEMORY`:e.includes(`Worker`)&&e.includes(`exited`)?`WORKER_CRASH`:e.includes(`initialization`)||e.includes(`init`)?`INITIALIZATION`:`UNKNOWN`}isRecoverableError(e){let t=[`timeout`,`Worker being recycled`,`Worker pool cerrado`,`temporary`];return t.some(t=>e.toLowerCase().includes(t.toLowerCase()))}}
1
+ import*as e from"node:os";import*as t from"node:path";import*as n from"node:process";import{Worker as r}from"node:worker_threads";import{validateTypesWithLanguageService as i}from"./typescript-sync-validator.js";export class TypeScriptWorkerPool{static instance;workers=[];poolSize;workerPath;initPromise=null;isInitialized=!1;TASK_TIMEOUT=8e3;WORKER_INIT_TIMEOUT=3e3;MAX_TASKS_PER_WORKER=200;WORKER_MEMORY_CHECK_INTERVAL=500;memoryCheckInterval=null;cleanupInterval=null;totalTasks=0;completedTasks=0;failedTasks=0;constructor(){let r=e.cpus().length;this.poolSize=Math.min(Math.max(r,4),16),this.workerPath=t.join(n.env.PATH_PROY||t.join(n.cwd(),`src`),`compiler`,`typescript-worker-thread.cjs`)}startMemoryMonitoring(){this.stopMemoryMonitoring(),this.memoryCheckInterval=setInterval(()=>{this.checkWorkersMemory()},15e3),this.cleanupInterval=setInterval(()=>{this.cleanupInactiveWorkers()},12e4)}stopMemoryMonitoring(){this.memoryCheckInterval&&(clearInterval(this.memoryCheckInterval),this.memoryCheckInterval=null),this.cleanupInterval&&(clearInterval(this.cleanupInterval),this.cleanupInterval=null)}async checkWorkersMemory(){let e=Date.now();for(let t of this.workers){t.lastMemoryCheck=e;try{if(t.memoryUsage=(await this.getWorkerMemoryUsage(t)).heapUsed,this.shouldRecycleWorker(t)){let e=this.getRecycleReason(t);console.warn(`[WorkerPool] Worker ${t.id} requiere reciclaje: ${e}`),await this.recycleWorker(t)}}catch(e){console.warn(`[WorkerPool] Error verificando memoria del worker ${t.id}:`,e)}}}async getWorkerMemoryUsage(e){return new Promise(t=>{let n=setTimeout(()=>{t({heapUsed:e.tasksProcessed*2048,heapTotal:e.tasksProcessed*3072,rss:e.tasksProcessed*4096})},1e3),r=`memory-${e.id}-${Date.now()}`,i=a=>{a.id===r&&a.type===`memory-usage`&&(clearTimeout(n),e.worker.off(`message`,i),t({heapUsed:a.memoryUsage?.heapUsed||e.tasksProcessed*2048,heapTotal:a.memoryUsage?.heapTotal||e.tasksProcessed*3072,rss:a.memoryUsage?.rss||e.tasksProcessed*4096}))};e.worker.on(`message`,i),e.worker.postMessage({type:`get-memory-usage`,id:r})})}getRecycleReason(e){let t=Date.now(),n=100*1024*1024,r=1800*1e3,i=this.MAX_TASKS_PER_WORKER,a=[];return e.memoryUsage>n&&a.push(`memoria excede ${Math.round(n/1024/1024)}MB (actual: ${Math.round(e.memoryUsage/1024/1024)}MB)`),t-e.creationTime>r&&a.push(`tiempo de vida excede ${Math.round(r/6e4)} minutos`),e.tasksProcessed>=i&&a.push(`tareas procesadas exceden ${i} (actual: ${e.tasksProcessed})`),a.join(`, `)}async cleanupInactiveWorkers(){let e=Date.now();for(let t of this.workers){let n=e-t.lastActivityTime;n>3e5&&!t.busy&&t.pendingTasks.size===0&&(console.info(`[WorkerPool] Worker ${t.id} inactivo por ${Math.round(n/6e4)} minutos, reciclando...`),await this.recycleWorker(t))}}shouldRecycleWorker(e){let t=Date.now(),n=this.MAX_TASKS_PER_WORKER;return e.memoryUsage>104857600||t-e.creationTime>18e5||e.tasksProcessed>=n}static getInstance(){return TypeScriptWorkerPool.instance||(TypeScriptWorkerPool.instance=new TypeScriptWorkerPool),TypeScriptWorkerPool.instance}setMode(t){switch(t){case`batch`:this.poolSize=Math.min(e.cpus().length,20);break;case`watch`:this.poolSize=Math.min(e.cpus().length,12);break;case`individual`:this.poolSize=Math.min(8,e.cpus().length);break}}async initializePool(){return this.initPromise||(this.initPromise=this._performPoolInitialization()),this.initPromise}async _performPoolInitialization(){try{if(!(await import(`node:fs`)).existsSync(this.workerPath))throw Error(`Worker thread file not found: ${this.workerPath}`);let e=Array.from({length:this.poolSize},(e,t)=>this.createWorker(t));this.workers=await Promise.all(e),this.isInitialized=!0}catch(e){throw this.isInitialized=!1,e}}async createWorker(e){return new Promise((t,i)=>{try{let a=new r(this.workerPath,{env:{...n.env,NODE_OPTIONS:``,WORKER_ID:e.toString()}}),o={worker:a,id:e,busy:!1,pendingTasks:new Map,taskCounter:0,memoryUsage:0,lastMemoryCheck:Date.now(),tasksProcessed:0,creationTime:Date.now(),lastActivityTime:Date.now()};this.setupWorkerListeners(o);let s=setTimeout(()=>{i(Error(`Worker ${e} initialization timeout`))},this.WORKER_INIT_TIMEOUT);a.on(`message`,function e(n){(n.id===`worker-ready`||n.message===`pong`)&&(clearTimeout(s),a.off(`message`,e),t(o))}),a.on(`error`,e=>{clearTimeout(s),i(e)}),a.postMessage({type:`ping`})}catch(e){i(e)}})}setupWorkerListeners(e){let{worker:t}=e;t.on(`message`,t=>{try{if(t.id===`worker-ready`||t.message===`pong`||t.type===`memory-usage`)return;let n=e.pendingTasks.get(t.id);if(!n)return;if(clearTimeout(n.timeout),e.pendingTasks.delete(t.id),e.pendingTasks.size===0&&(e.busy=!1),e.lastActivityTime=Date.now(),t.success&&t.diagnostics!==void 0&&t.hasErrors!==void 0){this.completedTasks++;let e=this.categorizeTypeScriptErrors({diagnostics:t.diagnostics,hasErrors:t.hasErrors},n.fileName);n.resolve(e)}else{this.failedTasks++;let e=t.error||`Error desconocido del worker`,r=this.createCategorizedError(e,n.fileName,t);n.reject(r)}}catch{}}),t.on(`error`,async t=>{await this.handleWorkerError(e,t)}),t.on(`exit`,async t=>{await this.handleWorkerExit(e,t)})}async handleWorkerError(e,t){console.warn(`[WorkerPool] Manejando error del worker ${e.id}:`,t.message),e.pendingTasks.forEach(n=>{clearTimeout(n.timeout),this.failedTasks++,n.reject(Error(`Worker ${e.id} failed: ${t.message}`))}),e.pendingTasks.clear();try{e.worker.removeAllListeners(),await e.worker.terminate()}catch(t){console.error(`[WorkerPool] Error terminando worker ${e.id}:`,t)}if(e.busy=!1,this.isInitialized&&this.workers.length>0)try{let t=await this.createWorker(e.id),n=this.workers.findIndex(t=>t.id===e.id);n!==-1&&(this.workers[n]=t)}catch(t){console.error(`[WorkerPool] No se pudo recrear worker ${e.id}:`,t)}}async handleWorkerExit(e,t){console.warn(`[WorkerPool] Worker ${e.id} salió con código ${t}`),e.pendingTasks.forEach(n=>{clearTimeout(n.timeout),this.failedTasks++,n.reject(Error(`Worker ${e.id} exited with code ${t}`))}),e.pendingTasks.clear(),e.busy=!1;try{e.worker.removeAllListeners()}catch{}if(this.isInitialized&&this.workers.length>0)try{await this.recreateWorker(e)}catch(t){console.error(`[WorkerPool] Error recreando worker ${e.id}:`,t)}}async recreateWorker(e){try{let t=await this.createWorker(e.id),n=this.workers.findIndex(t=>t.id===e.id);n!==-1&&(this.workers[n]=t)}catch{}}async recycleWorker(e){try{console.log(`[WorkerPool] Reciclando worker ${e.id} después de ${e.taskCounter} tareas`);let t=Date.now();await new Promise(n=>{let r=()=>{e.pendingTasks.size===0||Date.now()-t>=2e3?n():setTimeout(r,100)};r()});let n=Array.from(e.pendingTasks.entries());for(let[e,t]of n)clearTimeout(t.timeout),t.reject(Error(`Worker being recycled`));e.pendingTasks.clear();let r=e.worker;r.removeAllListeners(`message`),r.removeAllListeners(`error`),r.removeAllListeners(`exit`),r.removeAllListeners(`online`),r.removeAllListeners(`messageerror`);let i=e.worker;e.worker=null;let a=i.terminate(),o=new Promise((e,t)=>setTimeout(()=>t(Error(`Terminate timeout`)),3e3));await Promise.race([a,o]).catch(t=>{console.warn(`[WorkerPool] Warning al terminar worker ${e.id}:`,t)});let s=await this.createWorker(e.id),c=this.workers.findIndex(t=>t.id===e.id);c!==-1&&(this.workers[c]=s)}catch(t){console.error(`[WorkerPool] Error reciclando worker ${e.id}:`,t)}}findAvailableWorker(){let e=this.workers.find(e=>!e.busy&&e.pendingTasks.size===0);if(e)return e;let t=this.workers.reduce((e,t)=>t.pendingTasks.size<e.pendingTasks.size?t:e);return t.pendingTasks.size<5?t:null}async typeCheck(e,t,n){if(await this.initializePool(),!this.isInitialized)return this.typeCheckWithSyncFallback(e,t,n);let r=this.findAvailableWorker();if(!r)return this.typeCheckWithSyncFallback(e,t,n);try{return this.totalTasks++,await this.typeCheckWithWorker(r,e,t,n)}catch{return this.typeCheckWithSyncFallback(e,t,n)}}async typeCheckWithWorker(e,t,n,r){return e.taskCounter>=this.MAX_TASKS_PER_WORKER&&await this.recycleWorker(e),new Promise((i,a)=>{let o=`task-${e.id}-${++e.taskCounter}-${Date.now()}`;e.busy=!0,e.lastActivityTime=Date.now(),e.tasksProcessed++;let s=this.calculateDynamicTimeout(t,n,r),c=setTimeout(()=>{e.pendingTasks.delete(o),e.pendingTasks.size===0&&(e.busy=!1),a(Error(`Timeout (${s}ms) en type checking para ${t} - archivo complejo detectado`))},s);e.pendingTasks.set(o,{resolve:i,reject:a,timeout:c,fileName:t,startTime:Date.now()});try{let i={id:o,fileName:t,content:n,compilerOptions:{...r,_workerTimeout:s-1e3}};e.worker.postMessage(i)}catch(t){clearTimeout(c),e.pendingTasks.delete(o),e.pendingTasks.size===0&&(e.busy=!1),a(t)}})}calculateDynamicTimeout(e,t,n){let r=this.TASK_TIMEOUT,i=1,a=t.length;a>1e5?i+=1.5:a>5e4?i+=1:a>2e4&&(i+=.5);let o=(t.match(/^import\s+/gm)||[]).length,s=(t.match(/\btype\s+\w+/g)||[]).length,c=(t.match(/\binterface\s+\w+/g)||[]).length,l=(t.match(/<[^>]*>/g)||[]).length,u=o+s+c+l*.5;u>100?i+=2:u>50?i+=1:u>20&&(i+=.5),(n?.strict||n?.noImplicitAny)&&(i+=.3),e.includes(`.d.ts`)?i+=1:e.includes(`.vue`)&&(i+=.5),i=Math.min(i,5),i=Math.max(i,.5);let d=Math.round(r*i);return Math.min(d,6e4)}typeCheckWithSyncFallback(e,t,n){try{return i(e,t,n)}catch{return{diagnostics:[],hasErrors:!1}}}async terminate(){console.log(`[WorkerPool] Cerrando pool de workers...`),this.stopMemoryMonitoring();let e=0;for(let t of this.workers){e+=t.pendingTasks.size,t.pendingTasks.forEach(e=>{clearTimeout(e.timeout),e.reject(Error(`Worker pool cerrado`))}),t.pendingTasks.clear();try{t.worker.removeAllListeners()}catch{}}e>0&&console.log(`[WorkerPool] Se cancelaron ${e} tareas pendientes`);let t=this.workers.map(async e=>{try{await e.worker.terminate()}catch(t){console.warn(`[WorkerPool] Error terminando worker ${e.id}:`,t)}});await Promise.allSettled(t),this.workers=[],this.isInitialized=!1,this.initPromise=null,console.log(`[WorkerPool] Pool cerrado. Estadísticas finales: ${this.completedTasks} completadas, ${this.failedTasks} fallidas`)}getStats(){let e=this.workers.filter(e=>e.busy).length,t=this.workers.reduce((e,t)=>e+t.pendingTasks.size,0),n=this.totalTasks>0?Math.round(this.completedTasks/this.totalTasks*100):0;return{poolSize:this.workers.length,busyWorkers:e,totalPendingTasks:t,totalTasks:this.totalTasks,completedTasks:this.completedTasks,failedTasks:this.failedTasks,successRate:n}}categorizeTypeScriptErrors(e,t){if(!e.hasErrors||!e.diagnostics?.length)return e;let n=e.diagnostics.map(e=>({...e,_category:this.getErrorCategory(e),_severity:this.getErrorSeverity(e),_fileName:t,_timestamp:Date.now()}));return{...e,diagnostics:n,_errorStats:this.calculateErrorStats(n)}}getErrorCategory(e){let t=e.code;return[2304,2339,2346].includes(t)?`MISSING_DECLARATION`:[2322,2322,2345].includes(t)?`TYPE_MISMATCH`:[2307,2317].includes(t)?`MODULE_RESOLUTION`:[2552,2551].includes(t)?`PROPERTY_ACCESS`:t>=1e3&&t<2e3?`SYNTAX_ERROR`:t>=2e3&&t<3e3?`SEMANTIC_ERROR`:t>=4e3?`CONFIG_ERROR`:`OTHER`}getErrorSeverity(e){switch(e.category){case 1:return`ERROR`;case 2:return`WARNING`;case 3:return`INFO`;default:return`ERROR`}}calculateErrorStats(e){let t={totalErrors:e.length,errorsByCategory:{},errorsBySeverity:{},mostCommonError:null};e.forEach(e=>{let n=e._category||`OTHER`,r=e._severity||`ERROR`;t.errorsByCategory[n]=(t.errorsByCategory[n]||0)+1,t.errorsBySeverity[r]=(t.errorsBySeverity[r]||0)+1});let n={};e.forEach(e=>{let t=String(e.code);n[t]=(n[t]||0)+1});let r=Object.keys(n);if(r.length>0){let i=r.reduce((e,t)=>(n[e]||0)>(n[t]||0)?e:t);t.mostCommonError={code:i,count:n[i],message:e.find(e=>String(e.code)===i)?.messageText}}return t}createCategorizedError(e,t,n){let r=Error(e);return r.fileName=t,r.timestamp=Date.now(),r.workerResponse=n,r.category=this.categorizeGenericError(e),r.isRecoverable=this.isRecoverableError(e),r}categorizeGenericError(e){return e.includes(`timeout`)||e.includes(`Timeout`)?`TIMEOUT`:e.includes(`memory`)||e.includes(`Memory`)?`MEMORY`:e.includes(`Worker`)&&e.includes(`exited`)?`WORKER_CRASH`:e.includes(`initialization`)||e.includes(`init`)?`INITIALIZATION`:`UNKNOWN`}isRecoverableError(e){return[`timeout`,`Worker being recycled`,`Worker pool cerrado`,`temporary`].some(t=>e.toLowerCase().includes(t.toLowerCase()))}}
@@ -1,4 +1,4 @@
1
- const e=require(`node:fs`),t=require(`node:path`),{parentPort:n}=require(`node:worker_threads`);let r;try{r=require(`typescript`)}catch(e){console.error(`[Worker] Error cargando TypeScript:`,e),process.exit(1)}class i{constructor(e){this.files=new Map,this.compilerOptions=this.createUltraCleanCompilerOptions(e)}createUltraCleanCompilerOptions(e){let t={...e};return t}addFile(e,t){let n=this.files.get(e);this.files.set(e,{version:n?n.version+1:1,content:t})}getCompilationSettings(){return this.compilerOptions}getScriptFileNames(){return Array.from(this.files.keys())}getScriptVersion(e){let t=this.files.get(e);return t?t.version.toString():`0`}getScriptSnapshot(t){let n=this.files.get(t);if(n)return r.ScriptSnapshot.fromString(n.content);if(e.existsSync(t))try{let n=e.readFileSync(t,`utf-8`);return r.ScriptSnapshot.fromString(n)}catch{return}}getCurrentDirectory(){return process.cwd()}getDefaultLibFileName(e){return r.getDefaultLibFilePath(e)}fileExists(t){return this.files.has(t)||e.existsSync(t)}readFile(t){let n=this.files.get(t);if(n)return n.content;if(e.existsSync(t))try{return e.readFileSync(t,`utf-8`)}catch{return}}getNewLine(){return r.sys.newLine}}function a(e,n,a){let o=e;try{let s=n;if(!s.trim())return{diagnostics:[],hasErrors:!1};let c=new i(a);if(e.endsWith(`.vue`)){let t=`${e}.ts`;c.addFile(t,s),o=t}else c.addFile(e,s),o=e;if(e.endsWith(`.vue`)){let e=t.dirname(o),n=t.join(e,`vue-types.d.ts`),r=`// Declaraciones de tipos Vue para validación
1
+ const e=require(`node:fs`),t=require(`node:path`),{parentPort:n}=require(`node:worker_threads`);let r;try{r=require(`typescript`)}catch(e){console.error(`[Worker] Error cargando TypeScript:`,e),process.exit(1)}class i{constructor(e){this.files=new Map,this.compilerOptions=this.createUltraCleanCompilerOptions(e)}createUltraCleanCompilerOptions(e){return{...e}}addFile(e,t){let n=this.files.get(e);this.files.set(e,{version:n?n.version+1:1,content:t})}getCompilationSettings(){return this.compilerOptions}getScriptFileNames(){return Array.from(this.files.keys())}getScriptVersion(e){let t=this.files.get(e);return t?t.version.toString():`0`}getScriptSnapshot(t){let n=this.files.get(t);if(n)return r.ScriptSnapshot.fromString(n.content);if(e.existsSync(t))try{let n=e.readFileSync(t,`utf-8`);return r.ScriptSnapshot.fromString(n)}catch{return}}getCurrentDirectory(){return process.cwd()}getDefaultLibFileName(e){return r.getDefaultLibFilePath(e)}fileExists(t){return this.files.has(t)||e.existsSync(t)}readFile(t){let n=this.files.get(t);if(n)return n.content;if(e.existsSync(t))try{return e.readFileSync(t,`utf-8`)}catch{return}}getNewLine(){return r.sys.newLine}}function a(e,n,a){let o=e;try{let s=n;if(!s.trim())return{diagnostics:[],hasErrors:!1};let c=new i(a);if(e.endsWith(`.vue`)){let t=`${e}.ts`;c.addFile(t,s),o=t}else c.addFile(e,s),o=e;if(e.endsWith(`.vue`)){let e=t.dirname(o),n=t.join(e,`vue-types.d.ts`);c.addFile(n,`// Declaraciones de tipos Vue para validación
2
2
  declare global {
3
3
  function ref<T>(value: T): { value: T };
4
4
  function reactive<T extends object>(target: T): T;
@@ -17,25 +17,6 @@ const e=require(`node:fs`),t=require(`node:path`),{parentPort:n}=require(`node:w
17
17
  function onUnmounted(fn: () => void): void;
18
18
  function watch<T>(source: () => T, callback: (newValue: T, oldValue: T) => void): void;
19
19
  }
20
- export {};`;c.addFile(n,`// Declaraciones de tipos Vue para validación
21
- declare global {
22
- function ref<T>(value: T): { value: T };
23
- function reactive<T extends object>(target: T): T;
24
- function computed<T>(getter: () => T): { value: T };
25
- function defineComponent<T>(options: T): T;
26
- function defineProps<T = {}>(): T;
27
- function defineEmits<T = {}>(): T;
28
- function defineExpose<T = {}>(exposed: T): void;
29
- function mergeModels<T>(models: T): T;
30
- function provide<T>(key: string | symbol, value: T): void;
31
- function inject<T>(key: string | symbol, defaultValue?: T): T | undefined;
32
- function useSlots(): { [key: string]: (...args: any[]) => any };
33
- function useAttrs(): { [key: string]: any };
34
- function useModel<T>(modelName: string): { value: T };
35
- function onMounted(fn: () => void): void;
36
- function onUnmounted(fn: () => void): void;
37
- function watch<T>(source: () => T, callback: (newValue: T, oldValue: T) => void): void;
38
- }
39
- export {};`)}let l=r.createLanguageService(c);try{if(!c.fileExists(o))return{diagnostics:[],hasErrors:!1};let e=[],t=[];try{e=l.getSyntacticDiagnostics(o)}catch(e){console.error(`[Worker] Error obteniendo diagnósticos sintácticos:`,e.message)}try{t=l.getSemanticDiagnostics(o)}catch(e){console.error(`[Worker] Error obteniendo diagnósticos semánticos:`,e.message)}let n=[...e,...t],i=n.filter(e=>{let t=r.flattenDiagnosticMessageText(e.messageText,`
40
- `);return e.category===r.DiagnosticCategory.Error?!t.includes(`Cannot find module`)&&!t.includes(`Could not find source file`)&&!t.includes(`has no exported member 'mergeModels'`)&&!t.includes(`Parameter '$props' implicitly has an 'any' type`)&&!t.includes(`Parameter '$setup' implicitly has an 'any' type`)&&!t.includes(`Parameter '$data' implicitly has an 'any' type`)&&!t.includes(`Parameter '$options' implicitly has an 'any' type`)&&!t.includes(`Parameter '$event' implicitly has an 'any' type`)&&!t.includes(`Parameter '_ctx' implicitly has an 'any' type`)&&!t.includes(`Parameter '_cache' implicitly has an 'any' type`)&&!t.includes(`Unable to resolve signature of method decorator when called as an expression`)&&!t.includes(`The runtime will invoke the decorator with`)&&e.code!==1241&&!(t.includes(`implicitly has an 'any' type`)&&(t.includes(`_ctx`)||t.includes(`_cache`)||t.includes(`$props`)||t.includes(`$setup`)||t.includes(`__expose`)||t.includes(`__emit`))):!1});return{diagnostics:i,hasErrors:i.length>0}}catch{return{diagnostics:[],hasErrors:!1}}}catch(e){let t={file:void 0,start:void 0,length:void 0,messageText:`Error en validación de tipos: ${e instanceof Error?e.message:`Error desconocido`}`,category:r.DiagnosticCategory.Error,code:0};return{diagnostics:[t],hasErrors:!0}}}n&&n.on(`message`,e=>{try{let{id:t,fileName:i,content:o,compilerOptions:s}=e;if(!t||!i||typeof o!=`string`){n.postMessage({id:t||`unknown`,success:!1,error:`Mensaje del worker inválido`});return}let c=a(i,o,s),l=c.diagnostics.map(e=>({category:e.category,code:e.code,messageText:typeof e.messageText==`string`?e.messageText:r.flattenDiagnosticMessageText(e.messageText,`
20
+ export {};`)}let l=r.createLanguageService(c);try{if(!c.fileExists(o))return{diagnostics:[],hasErrors:!1};let e=[],t=[];try{e=l.getSyntacticDiagnostics(o)}catch(e){console.error(`[Worker] Error obteniendo diagnósticos sintácticos:`,e.message)}try{t=l.getSemanticDiagnostics(o)}catch(e){console.error(`[Worker] Error obteniendo diagnósticos semánticos:`,e.message)}let n=[...e,...t].filter(e=>{let t=r.flattenDiagnosticMessageText(e.messageText,`
21
+ `);return e.category===r.DiagnosticCategory.Error?!t.includes(`Cannot find module`)&&!t.includes(`Could not find source file`)&&!t.includes(`has no exported member 'mergeModels'`)&&!t.includes(`Parameter '$props' implicitly has an 'any' type`)&&!t.includes(`Parameter '$setup' implicitly has an 'any' type`)&&!t.includes(`Parameter '$data' implicitly has an 'any' type`)&&!t.includes(`Parameter '$options' implicitly has an 'any' type`)&&!t.includes(`Parameter '$event' implicitly has an 'any' type`)&&!t.includes(`Parameter '_ctx' implicitly has an 'any' type`)&&!t.includes(`Parameter '_cache' implicitly has an 'any' type`)&&!t.includes(`Unable to resolve signature of method decorator when called as an expression`)&&!t.includes(`The runtime will invoke the decorator with`)&&e.code!==1241&&!(t.includes(`implicitly has an 'any' type`)&&(t.includes(`_ctx`)||t.includes(`_cache`)||t.includes(`$props`)||t.includes(`$setup`)||t.includes(`__expose`)||t.includes(`__emit`))):!1});return{diagnostics:n,hasErrors:n.length>0}}catch{return{diagnostics:[],hasErrors:!1}}}catch(e){return{diagnostics:[{file:void 0,start:void 0,length:void 0,messageText:`Error en validación de tipos: ${e instanceof Error?e.message:`Error desconocido`}`,category:r.DiagnosticCategory.Error,code:0}],hasErrors:!0}}}n&&n.on(`message`,e=>{try{let{id:t,fileName:i,content:o,compilerOptions:s}=e;if(!t||!i||typeof o!=`string`){n.postMessage({id:t||`unknown`,success:!1,error:`Mensaje del worker inválido`});return}let c=a(i,o,s),l=c.diagnostics.map(e=>({category:e.category,code:e.code,messageText:typeof e.messageText==`string`?e.messageText:r.flattenDiagnosticMessageText(e.messageText,`
41
22
  `),file:e.file?{fileName:e.file.fileName,text:e.file.text}:void 0,start:e.start,length:e.length}));n.postMessage({id:t,success:!0,diagnostics:l,hasErrors:c.hasErrors})}catch(t){n.postMessage({id:e?.id||`unknown`,success:!1,error:t instanceof Error?t.message:`Error desconocido en worker`})}}),process.on(`uncaughtException`,e=>{console.error(`[Worker] Error no capturado en TypeScript worker:`,e),n&&n.postMessage({id:`error`,success:!1,error:`Error crítico en worker: ${e.message}`}),process.exit(1)}),n&&n.postMessage({id:`worker-ready`,success:!0,message:`TypeScript worker iniciado correctamente`});
@@ -1 +1 @@
1
- import*as e from"node:path";import*as t from"node:process";import{Worker as n}from"node:worker_threads";import{validateTypesWithLanguageService as r}from"./typescript-sync-validator.js";export class TypeScriptWorkerManager{static instance;worker=null;pendingTasks=new Map;taskCounter=0;workerReady=!1;initPromise=null;MAX_RETRY_ATTEMPTS=2;MAX_CONCURRENT_TASKS=20;TASK_TIMEOUT=15e3;currentMode=null;constructor(){}setMode(e){this.currentMode=e,console.log(`[WorkerManager] Modo establecido: ${e}`)}static getInstance(){return TypeScriptWorkerManager.instance||=new TypeScriptWorkerManager,TypeScriptWorkerManager.instance}async initializeWorker(){return this.initPromise||=this._performWorkerInitialization(),this.initPromise}async _performWorkerInitialization(){try{console.log(`[WorkerManager] 🚀 Iniciando proceso de inicialización del worker...`);let r=e.join(t.env.PATH_PROY||e.join(t.cwd(),`src`),`compiler`,`typescript-worker-thread.cjs`);console.log(`[WorkerManager] 📂 Ruta del worker:`,r),console.log(`[WorkerManager] 🌍 PATH_PROY:`,t.env.PATH_PROY),console.log(`[WorkerManager] 📁 CWD:`,t.cwd());let i=await import(`node:fs`),a=i.existsSync(r);console.log(`[WorkerManager] 📋 Worker file exists:`,a),console.log(`[WorkerManager] 🔧 Creando Worker...`),this.worker=new n(r,{env:{...t.env,NODE_OPTIONS:``}}),console.log(`[WorkerManager] ✅ Worker creado, configurando listeners...`),this.setupWorkerListeners(),console.log(`[WorkerManager] ⏳ Esperando que el worker esté listo...`),await this.waitForWorkerReady(),console.log(`[WorkerManager] ✅ Worker inicializado exitosamente`)}catch(e){throw console.error(`[WorkerManager] ❌ Error inicializando worker:`,e),this.worker=null,this.workerReady=!1,e}}setupWorkerListeners(){this.worker&&(this.worker.on(`message`,e=>{try{if(e.id===`worker-ready`){this.workerReady=!0;return}let t=this.pendingTasks.get(e.id);if(!t){console.warn(`[WorkerManager] Respuesta para tarea desconocida:`,e.id);return}if(clearTimeout(t.timeout),this.pendingTasks.delete(e.id),e.success&&e.diagnostics!==void 0&&e.hasErrors!==void 0)t.resolve({diagnostics:e.diagnostics,hasErrors:e.hasErrors});else{let n=e.error||`Error desconocido del worker`;t.reject(Error(n))}}catch(e){console.error(`[WorkerManager] Error procesando respuesta del worker:`,e)}}),this.worker.on(`error`,e=>{console.error(`[WorkerManager] Error en worker thread:`,e),this.handleWorkerError(e)}),this.worker.on(`exit`,e=>{console.warn(`[WorkerManager] Worker thread cerrado con código:`,e),this.workerReady=!1,this.pendingTasks.forEach(t=>{clearTimeout(t.timeout),t.reject(Error(`Worker cerrado inesperadamente con código ${e}`))}),this.pendingTasks.clear()}))}async waitForWorkerReady(){return new Promise((e,t)=>{let n=setTimeout(()=>{t(Error(`Timeout esperando a que el worker esté listo`))},5e3),r=()=>{this.workerReady?(clearTimeout(n),e()):setTimeout(r,50)};r()})}handleWorkerError(e){console.error(`[WorkerManager] Manejando error del worker:`,e),this.pendingTasks.forEach(t=>{clearTimeout(t.timeout),t.reject(Error(`Error en worker: ${e.message}`))}),this.pendingTasks.clear(),this.workerReady=!1}generateTaskId(){return`task-${++this.taskCounter}-${Date.now()}`}async typeCheck(e,n,r){if(this.pendingTasks.size>=this.MAX_CONCURRENT_TASKS)return this.typeCheckWithSyncFallback(e,n,r);if(t.env.NODE_ENV===`test`||!this.worker){if(!this.worker)try{if(await this.initializeWorker(),this.worker&&this.workerReady)return console.log(`[WorkerManager] ✅ Worker inicializado exitosamente, reintentando...`),this.typeCheckWithWorker(e,n,r)}catch(e){console.error(`[WorkerManager] ❌ Error inicializando worker:`,e)}return console.log(`[WorkerManager] 🔄 Usando fallback síncrono (test mode o worker no disponible)`),this.typeCheckWithSyncFallback(e,n,r)}try{console.log(`[WorkerManager] 🚀 Intentando usar worker thread...`);let t=this.typeCheckWithWorker(e,n,r),i=new Promise((e,t)=>{setTimeout(()=>{console.log(`[WorkerManager] ⏰ Worker timeout, usando fallback`),t(Error(`Worker timeout - usando fallback`))},this.TASK_TIMEOUT)});console.log(`[WorkerManager] ⏳ Esperando respuesta del worker...`);let a=await Promise.race([t,i]);return console.log(`[WorkerManager] ✅ Worker completado exitosamente`),a}catch(t){let i=t instanceof Error?t.message:String(t);return console.warn(`[WorkerManager] ❌ Error en worker, usando fallback síncrono:`,i),this.typeCheckWithSyncFallback(e,n,r)}}async typeCheckWithWorker(e,t,n){if(await this.initializeWorker(),!this.worker||!this.workerReady)throw Error(`Worker no disponible`);return new Promise((r,i)=>{let a=this.generateTaskId(),o=setTimeout(()=>{this.pendingTasks.delete(a),i(Error(`Timeout en type checking para ${e}`))},this.TASK_TIMEOUT);this.pendingTasks.set(a,{resolve:r,reject:i,timeout:o});try{let r={id:a,fileName:e,content:t,compilerOptions:n};this.worker.postMessage(r)}catch(e){clearTimeout(o),this.pendingTasks.delete(a),i(e)}})}typeCheckWithSyncFallback(e,t,n){try{return r(e,t,n)}catch(e){return console.error(`[WorkerManager] Error en fallback síncrono:`,e),{diagnostics:[],hasErrors:!1}}}async terminate(){this.worker&&(this.pendingTasks.forEach(e=>{clearTimeout(e.timeout),e.reject(Error(`Worker manager cerrado`))}),this.pendingTasks.clear(),await this.worker.terminate(),this.worker=null,this.workerReady=!1,this.initPromise=null)}getStats(){return{workerReady:this.workerReady,pendingTasks:this.pendingTasks.size,taskCounter:this.taskCounter}}}
1
+ import*as e from"node:path";import*as t from"node:process";import{Worker as n}from"node:worker_threads";import{validateTypesWithLanguageService as r}from"./typescript-sync-validator.js";export class TypeScriptWorkerManager{static instance;worker=null;pendingTasks=new Map;taskCounter=0;workerReady=!1;initPromise=null;MAX_RETRY_ATTEMPTS=2;MAX_CONCURRENT_TASKS=20;TASK_TIMEOUT=15e3;currentMode=null;constructor(){}setMode(e){this.currentMode=e,console.log(`[WorkerManager] Modo establecido: ${e}`)}static getInstance(){return TypeScriptWorkerManager.instance||(TypeScriptWorkerManager.instance=new TypeScriptWorkerManager),TypeScriptWorkerManager.instance}async initializeWorker(){return this.initPromise||(this.initPromise=this._performWorkerInitialization()),this.initPromise}async _performWorkerInitialization(){try{console.log(`[WorkerManager] 🚀 Iniciando proceso de inicialización del worker...`);let r=e.join(t.env.PATH_PROY||e.join(t.cwd(),`src`),`compiler`,`typescript-worker-thread.cjs`);console.log(`[WorkerManager] 📂 Ruta del worker:`,r),console.log(`[WorkerManager] 🌍 PATH_PROY:`,t.env.PATH_PROY),console.log(`[WorkerManager] 📁 CWD:`,t.cwd());let i=(await import(`node:fs`)).existsSync(r);console.log(`[WorkerManager] 📋 Worker file exists:`,i),console.log(`[WorkerManager] 🔧 Creando Worker...`),this.worker=new n(r,{env:{...t.env,NODE_OPTIONS:``}}),console.log(`[WorkerManager] ✅ Worker creado, configurando listeners...`),this.setupWorkerListeners(),console.log(`[WorkerManager] ⏳ Esperando que el worker esté listo...`),await this.waitForWorkerReady(),console.log(`[WorkerManager] ✅ Worker inicializado exitosamente`)}catch(e){throw console.error(`[WorkerManager] ❌ Error inicializando worker:`,e),this.worker=null,this.workerReady=!1,e}}setupWorkerListeners(){this.worker&&(this.worker.on(`message`,e=>{try{if(e.id===`worker-ready`){this.workerReady=!0;return}let t=this.pendingTasks.get(e.id);if(!t){console.warn(`[WorkerManager] Respuesta para tarea desconocida:`,e.id);return}if(clearTimeout(t.timeout),this.pendingTasks.delete(e.id),e.success&&e.diagnostics!==void 0&&e.hasErrors!==void 0)t.resolve({diagnostics:e.diagnostics,hasErrors:e.hasErrors});else{let n=e.error||`Error desconocido del worker`;t.reject(Error(n))}}catch(e){console.error(`[WorkerManager] Error procesando respuesta del worker:`,e)}}),this.worker.on(`error`,e=>{console.error(`[WorkerManager] Error en worker thread:`,e),this.handleWorkerError(e)}),this.worker.on(`exit`,e=>{console.warn(`[WorkerManager] Worker thread cerrado con código:`,e),this.workerReady=!1,this.pendingTasks.forEach(t=>{clearTimeout(t.timeout),t.reject(Error(`Worker cerrado inesperadamente con código ${e}`))}),this.pendingTasks.clear()}))}async waitForWorkerReady(){return new Promise((e,t)=>{let n=setTimeout(()=>{t(Error(`Timeout esperando a que el worker esté listo`))},5e3),r=()=>{this.workerReady?(clearTimeout(n),e()):setTimeout(r,50)};r()})}handleWorkerError(e){console.error(`[WorkerManager] Manejando error del worker:`,e),this.pendingTasks.forEach(t=>{clearTimeout(t.timeout),t.reject(Error(`Error en worker: ${e.message}`))}),this.pendingTasks.clear(),this.workerReady=!1}generateTaskId(){return`task-${++this.taskCounter}-${Date.now()}`}async typeCheck(e,n,r){if(this.pendingTasks.size>=this.MAX_CONCURRENT_TASKS)return this.typeCheckWithSyncFallback(e,n,r);if(t.env.NODE_ENV===`test`||!this.worker){if(!this.worker)try{if(await this.initializeWorker(),this.worker&&this.workerReady)return console.log(`[WorkerManager] ✅ Worker inicializado exitosamente, reintentando...`),this.typeCheckWithWorker(e,n,r)}catch(e){console.error(`[WorkerManager] ❌ Error inicializando worker:`,e)}return console.log(`[WorkerManager] 🔄 Usando fallback síncrono (test mode o worker no disponible)`),this.typeCheckWithSyncFallback(e,n,r)}try{console.log(`[WorkerManager] 🚀 Intentando usar worker thread...`);let t=this.typeCheckWithWorker(e,n,r),i=new Promise((e,t)=>{setTimeout(()=>{console.log(`[WorkerManager] ⏰ Worker timeout, usando fallback`),t(Error(`Worker timeout - usando fallback`))},this.TASK_TIMEOUT)});console.log(`[WorkerManager] ⏳ Esperando respuesta del worker...`);let a=await Promise.race([t,i]);return console.log(`[WorkerManager] ✅ Worker completado exitosamente`),a}catch(t){let i=t instanceof Error?t.message:String(t);return console.warn(`[WorkerManager] ❌ Error en worker, usando fallback síncrono:`,i),this.typeCheckWithSyncFallback(e,n,r)}}async typeCheckWithWorker(e,t,n){if(await this.initializeWorker(),!this.worker||!this.workerReady)throw Error(`Worker no disponible`);return new Promise((r,i)=>{let a=this.generateTaskId(),o=setTimeout(()=>{this.pendingTasks.delete(a),i(Error(`Timeout en type checking para ${e}`))},this.TASK_TIMEOUT);this.pendingTasks.set(a,{resolve:r,reject:i,timeout:o});try{let r={id:a,fileName:e,content:t,compilerOptions:n};this.worker.postMessage(r)}catch(e){clearTimeout(o),this.pendingTasks.delete(a),i(e)}})}typeCheckWithSyncFallback(e,t,n){try{return r(e,t,n)}catch(e){return console.error(`[WorkerManager] Error en fallback síncrono:`,e),{diagnostics:[],hasErrors:!1}}}async terminate(){this.worker&&(this.pendingTasks.forEach(e=>{clearTimeout(e.timeout),e.reject(Error(`Worker manager cerrado`))}),this.pendingTasks.clear(),await this.worker.terminate(),this.worker=null,this.workerReady=!1,this.initPromise=null)}getStats(){return{workerReady:this.workerReady,pendingTasks:this.pendingTasks.size,taskCounter:this.taskCounter}}}
@@ -1,37 +1,37 @@
1
- import{createHash as e}from"node:crypto";import t from"node:path";import*as n from"vue/compiler-sfc";const r=n;import{logger as i}from"../servicios/logger.js";import{parser as a}from"./parser.js";let o;async function s(){return o||=(await import(`chalk`)).default,o}class c{static instance;cache=new Map;MAX_CACHE_SIZE=100;CACHE_TTL=300*1e3;static getInstance(){return c.instance||=new c,c.instance}generateContentHash(t){return e(`md5`).update(t).digest(`hex`)}getOrGenerateHMRInjection(e,t){let n=this.generateContentHash(e),r=`${t}:${n}`,i=this.cache.get(r);if(i&&Date.now()-i.timestamp<this.CACHE_TTL)return{injectedData:i.injectedCode,cached:!0};let a=/import\s*\{[^}]*\bref\b[^}]*\}\s*from\s*['"]vue['"]/,o=a.test(e),s=`
2
- ${o?``:`import { ref } from "/node_modules/vue/dist/vue.esm-browser.js";`}
1
+ import{createHash as e}from"node:crypto";import t from"node:path";import*as n from"vue/compiler-sfc";const r=n;import{logger as i}from"../servicios/logger.js";import{parser as a}from"./parser.js";let o;async function s(){return o||(o=(await import(`chalk`)).default),o}class c{static instance;cache=new Map;MAX_CACHE_SIZE=100;CACHE_TTL=300*1e3;static getInstance(){return c.instance||(c.instance=new c),c.instance}generateContentHash(t){return e(`md5`).update(t).digest(`hex`)}getOrGenerateHMRInjection(e,t){let n=this.generateContentHash(e),r=`${t}:${n}`,i=this.cache.get(r);if(i&&Date.now()-i.timestamp<this.CACHE_TTL)return{injectedData:i.injectedCode,cached:!0};let a=/import\s*\{[^}]*\bref\b[^}]*\}\s*from\s*['"]vue['"]/.test(e),o=`
2
+ ${a?``:`import { ref } from "/node_modules/vue/dist/vue.esm-browser.js";`}
3
3
  const versaComponentKey = ref(0);
4
- `,c,l=e.includes(`<script`);return c=l?e.replace(/(<script.*?>)/,`$1${s}`):`<script setup lang="ts">${s}<\/script>/n`+e,c=c.replace(/(<template[^>]*>[\s\S]*?)(<(\w+)([^>]*?))(\/?>)/,(e,t,n,r,i,a)=>{if(i.includes(`:key=`)||i.includes(`key=`))return e;let o=a===`/>`;return o?`${t}<${r}${i} :key="versaComponentKey" />`:`${t}<${r}${i} :key="versaComponentKey">`}),this.cache.set(r,{contentHash:n,injectedCode:c,hasRefImport:o,timestamp:Date.now()}),this.evictIfNeeded(),{injectedData:c,cached:!1}}evictIfNeeded(){if(this.cache.size<=this.MAX_CACHE_SIZE)return;let e=Array.from(this.cache.entries());e.sort((e,t)=>e[1].timestamp-t[1].timestamp);let t=e.slice(0,e.length-this.MAX_CACHE_SIZE);t.forEach(([e])=>this.cache.delete(e))}cleanExpired(){let e=Date.now();for(let[t,n]of this.cache.entries())e-n.timestamp>this.CACHE_TTL&&this.cache.delete(t)}getStats(){return{size:this.cache.size,maxSize:this.MAX_CACHE_SIZE,ttl:this.CACHE_TTL}}clear(){this.cache.clear()}}const l=c.getInstance(),u=async e=>{let t=[],n=e?.module?.staticImports;if(n){let e=n.filter(e=>e.moduleRequest.value.endsWith(`.vue`));t=e.map(e=>e.entries.map(e=>e.localName.value)),t=t.flat()}return t};export const preCompileVue=async(e,n,o=!1)=>{try{let c=t.basename(n).replace(`.vue`,``);if(!e||e.trim().length===0)return{error:null,data:`export default {};`,lang:`js`};if(!o){let{injectedData:t}=l.getOrGenerateHMRInjection(e,c);e=t}let{descriptor:d,errors:f}=r.parse(e,{filename:c,sourceMap:!o,sourceRoot:t.dirname(n)});if(f.length)throw Error(`Error al analizar el componente Vue ${n}:\n${f.map(e=>e.message).join(`
4
+ `,s;return s=e.includes(`<script`)?e.replace(/(<script.*?>)/,`$1${o}`):`<script setup lang="ts">${o}<\/script>/n`+e,s=s.replace(/(<template[^>]*>[\s\S]*?)(<(\w+)([^>]*?))(\/?>)/,(e,t,n,r,i,a)=>i.includes(`:key=`)||i.includes(`key=`)?e:a===`/>`?`${t}<${r}${i} :key="versaComponentKey" />`:`${t}<${r}${i} :key="versaComponentKey">`),this.cache.set(r,{contentHash:n,injectedCode:s,hasRefImport:a,timestamp:Date.now()}),this.evictIfNeeded(),{injectedData:s,cached:!1}}evictIfNeeded(){if(this.cache.size<=this.MAX_CACHE_SIZE)return;let e=Array.from(this.cache.entries());e.sort((e,t)=>e[1].timestamp-t[1].timestamp),e.slice(0,e.length-this.MAX_CACHE_SIZE).forEach(([e])=>this.cache.delete(e))}cleanExpired(){let e=Date.now();for(let[t,n]of this.cache.entries())e-n.timestamp>this.CACHE_TTL&&this.cache.delete(t)}getStats(){return{size:this.cache.size,maxSize:this.MAX_CACHE_SIZE,ttl:this.CACHE_TTL}}clear(){this.cache.clear()}}const l=c.getInstance(),u=async e=>{let t=[],n=e?.module?.staticImports;return n&&(t=n.filter(e=>e.moduleRequest.value.endsWith(`.vue`)).map(e=>e.entries.map(e=>e.localName.value)),t=t.flat()),t};export const preCompileVue=async(e,n,o=!1)=>{try{let c=t.basename(n).replace(`.vue`,``);if(!e||e.trim().length===0)return{error:null,data:`export default {};`,lang:`js`};if(!o){let{injectedData:t}=l.getOrGenerateHMRInjection(e,c);e=t}let{descriptor:d,errors:f}=r.parse(e,{filename:c,sourceMap:!o,sourceRoot:t.dirname(n)});if(f.length)throw Error(`Error al analizar el componente Vue ${n}:\n${f.map(e=>e.message).join(`
5
5
  `)}`);let p=Math.random().toString(36).slice(2,12),m=d.styles.some(e=>e.scoped)?`data-v-${p}`:null,h,g=`js`,_,v;if(d.script||d.scriptSetup){v=d.script?`script`:`scriptSetup`;let e=d.script||d.scriptSetup,t={id:p,isProd:o,sourceMap:!o,inlineTemplate:!1,propsDestructure:!0,templateOptions:{compilerOptions:{mode:`module`,scopeId:m,prefixIdentifiers:!0,hoistStatic:o,cacheHandlers:o,nodeTransforms:[],directiveTransforms:{}},transformAssetUrls:!0},customElement:!1},n=r.compileScript(d,t);h=n.content,g=e.lang?.toLowerCase()===`ts`||e.lang?.toLowerCase()===`typescript`?`ts`:`js`,_=n.bindings}else h=`export default {};`,g=`js`;let y=await a(`temp.${g}`,h,g);if(y?.errors.length>0)throw Error(`Error al analizar el script del componente Vue ${n}:\n${y.errors.map(e=>e.message).join(`
6
- `)}`);let b=await u(y);_&&Object.keys(_).forEach(e=>{b.includes(e)&&delete _[e]});let x=``;if(d.template){let e={source:d.template.content,filename:`${c}.vue`,id:p,scoped:!!m,slotted:d.slotted,isProd:o,compilerOptions:{scopeId:m,mode:`module`,bindingMetadata:_,prefixIdentifiers:!0,hoistStatic:o,cacheHandlers:o,runtimeGlobalName:`Vue`,runtimeModuleName:`/node_modules/vue/dist/vue.esm-browser.js`,whitespace:`condense`,ssr:!1,nodeTransforms:[],directiveTransforms:{}}},t=r.compileTemplate(e);t.errors?.length>0&&i.error(`Template compilation errors:`,t.errors),x=t.code}else{let e=await s();i.warn(e.yellow(`Advertencia: El componente Vue ${n} no tiene una sección de plantilla.`))}let S={content:h,lang:g,type:v},C={code:x},w=``;d.customBlocks.length>0&&(w=d.customBlocks[0]?.content.slice(0,-1)??``);let T=d.styles.map(e=>{let t=e.lang?.toLowerCase(),n;return(t===`scss`||t===`sass`||t===`less`||t===`styl`||t===`stylus`)&&(n=t),r.compileStyle({id:p,source:e.content,scoped:e.scoped,preprocessLang:n,isProd:o,trim:!0,filename:`${c}.vue`})}),E=T.length?`(function(){
6
+ `)}`);let b=await u(y);_&&Object.keys(_).forEach(e=>{b.includes(e)&&delete _[e]});let x=``;if(d.template){let e={source:d.template.content,filename:`${c}.vue`,id:p,scoped:!!m,slotted:d.slotted,isProd:o,compilerOptions:{scopeId:m,mode:`module`,bindingMetadata:_,prefixIdentifiers:!0,hoistStatic:o,cacheHandlers:o,runtimeGlobalName:`Vue`,runtimeModuleName:`/node_modules/vue/dist/vue.esm-browser.js`,whitespace:`condense`,ssr:!1,nodeTransforms:[],directiveTransforms:{}}},t=r.compileTemplate(e);t.errors?.length>0&&i.error(`Template compilation errors:`,t.errors),x=t.code}else{let e=await s();i.warn(e.yellow(`Advertencia: El componente Vue ${n} no tiene una sección de plantilla.`))}let S={content:h,lang:g,type:v},C={code:x},w=``;d.customBlocks.length>0&&(w=d.customBlocks[0]?.content.slice(0,-1)??``);let T=d.styles.map(e=>{let t=e.lang?.toLowerCase(),n;return(t===`scss`||t===`sass`||t===`less`||t===`styl`||t===`stylus`)&&(n=t),r.compileStyle({id:p,source:e.content,scoped:e.scoped,preprocessLang:n,isProd:o,trim:!0,filename:`${c}.vue`})}),E=`
7
+ ${T.length?`(function(){
7
8
  let styleTag = document.createElement('style');
8
9
  styleTag.setAttribute('data-v-${p}', '');
9
- styleTag.innerHTML = \`${T.map(e=>e.code).join(`
10
+ styleTag.innerHTML = html\`${T.map(e=>e.code).join(`
10
11
  `)}\`;
11
12
  document.head.appendChild(styleTag);
12
- })();`:``,D=`
13
- ${E}
13
+ })();`:``}
14
14
  ${S.content}
15
15
  ${C.code}
16
- `,O=c.replace(/[^a-zA-Z0-9_$]/g,``).replace(/^[0-9]/,`_$&`)||`component`,k=`${O}_component`,A=/name\s*:\s*['"`]/.test(D),j=/components\s*:\s*\{/.test(D),M=`
16
+ `,D=`${c.replace(/[^a-zA-Z0-9_$]/g,``).replace(/^[0-9]/,`_$&`)||`component`}_component`,O=/name\s*:\s*['"`]/.test(E),k=/components\s*:\s*\{/.test(E),A=`
17
17
  __file: '${n}',
18
18
  __name: '${c}',
19
- ${A?``:`name: '${c}',`}
20
- ${j?``:`components: {
19
+ ${O?``:`name: '${c}',`}
20
+ ${k?``:`components: {
21
21
  ${b.map(e=>`${e}`).join(`,
22
22
  `)}
23
23
  },`}
24
- `;D.includes(`export default {`)?D=D.replace(`export default {`,`const ${k} = {
25
- \n${M}
26
- `):D.includes(`export default defineComponent({`)?D=D.replace(`export default defineComponent({`,`const ${k} = defineComponent({
27
- \n${M}
28
- `):D.includes(`const default = /*@__PURE__*/_defineComponent({`)?D=D.replace(`const default = /*@__PURE__*/_defineComponent({`,`const ${k} = /*@__PURE__*/_defineComponent({
29
- \n${M}
30
- `):D.includes(`export default /*@__PURE__*/_defineComponent({`)&&(D=D.replace(`export default /*@__PURE__*/_defineComponent({`,`const ${k} = /*@__PURE__*/_defineComponent({
31
- \n${M}
32
- `)),D.includes(`export function render`)&&(D=D.replace(`export function render`,`function render_${k}`));let N=D.includes(`render_${k}`)||D.includes(`function render(`);!N&&d.template&&i.warn(`Warning: No render function found in compiled output`);let P=`
33
- ${N?`${k}.render = render_${k};`:``}
34
- ${m?`${k}.__scopeId = '${m}';`:``}
24
+ `;E.includes(`export default {`)?E=E.replace(`export default {`,`const ${D} = {
25
+ \n${A}
26
+ `):E.includes(`export default defineComponent({`)?E=E.replace(`export default defineComponent({`,`const ${D} = defineComponent({
27
+ \n${A}
28
+ `):E.includes(`const default = /*@__PURE__*/_defineComponent({`)?E=E.replace(`const default = /*@__PURE__*/_defineComponent({`,`const ${D} = /*@__PURE__*/_defineComponent({
29
+ \n${A}
30
+ `):E.includes(`export default /*@__PURE__*/_defineComponent({`)&&(E=E.replace(`export default /*@__PURE__*/_defineComponent({`,`const ${D} = /*@__PURE__*/_defineComponent({
31
+ \n${A}
32
+ `)),E.includes(`export function render`)&&(E=E.replace(`export function render`,`function render_${D}`));let j=E.includes(`render_${D}`)||E.includes(`function render(`);!j&&d.template&&i.warn(`Warning: No render function found in compiled output`);let M=`
33
+ ${j?`${D}.render = render_${D};`:``}
34
+ ${m?`${D}.__scopeId = '${m}';`:``}
35
35
  ${w}
36
36
 
37
- export default ${k}; `;return D=`${D}\n${P}`,{lang:S.lang,error:null,data:D}}catch(e){return i.error(`Vue compilation error:`,e),{lang:null,error:e instanceof Error?e:Error(String(e)),data:null}}};export const getVueHMRCacheStats=()=>l.getStats();export const clearVueHMRCache=()=>{l.clear()};export const cleanExpiredVueHMRCache=()=>{l.cleanExpired()};
37
+ export default ${D}; `;return E=`${E}\n${M}`,{lang:S.lang,error:null,data:E}}catch(e){return i.error(`Vue compilation error:`,e),{lang:null,error:e instanceof Error?e:Error(String(e)),data:null}}};export const getVueHMRCacheStats=()=>l.getStats();export const clearVueHMRCache=()=>{l.clear()};export const cleanExpiredVueHMRCache=()=>{l.cleanExpired()};
@@ -1 +1 @@
1
- import{obtenerInstanciaVue as e}from"./getInstanciaVue.js";function t(e,t){let n=[];function r(e){e.name===t&&n.push(e);for(let t of e.children)r(t)}return r(e),n}function n(e){let t=[];for(;e;)t.push(e),e=e.parent;return t}function r(e,t){if(!(!e||typeof e!=`object`))if(e?.type.name===`Suspense`){let n=e?.suspense.activeBranch,i={name:e?.type.name,instancia:n,children:[],parent:t,isRoot:!1};t.children.push(i),r(n,i)}else if(e.component){let n=e.component,r=`Anonymous`;if(n.type){if(n.type.name)r=n.type.name;else if(n.type.__name)r=n.type.__name;else if(typeof n.type==`function`){let e=n.type.name;e&&e!==`Anonymous function`&&(r=e);let t=n.type.toString();t.includes(`BaseTransition`)?r=`Transition`:t.includes(`KeepAlive`)?r=`KeepAlive`:t.includes(`Suspense`)&&(r=`Suspense`)}}let a={name:r,instancia:n,children:[],parent:t,isRoot:!1};t.children.push(a),i(n,a)}else{let n=e.children||e.dynamicChildren;Array.isArray(n)&&n.forEach(e=>{r(e,t)})}}function i(e,t){let n=e.subTree;n&&r(n,t)}export const buildComponentTree=e=>{if(!e||!e.type)return console.warn(`No se pudo construir el árbol de componentes: instancia inválida`),null;let t={name:e.type?.name||e.type?.__name||`Anonymous`,instancia:e,children:[],parent:null,isRoot:!0,from:`root`};return i(e,t),t};function o(e){return e?e.proxy&&typeof e.proxy.$forceUpdate==`function`?(e.proxy.$forceUpdate(),typeof e.update==`function`&&e.update(),e.ctx?._.setupState?.versaComponentKey!==void 0&&e.ctx._.setupState.versaComponentKey++,!0):typeof e.update==`function`?(e.ctx?._.setupState?.versaComponentKey!==void 0&&e.ctx._.setupState.versaComponentKey++,e.update(),!0):!1:!1}function s(e,t,n,r){if(!e||!t||!n||!r)return console.error(`❌ Parámetros inválidos para tryUpdateComponentPath`),!1;for(let r=1;r<e.length;r++){let i=e[r];if(i.isRoot||i.name===`KeepAlive`)return window.location.reload(),!0;if(!i||!i.instancia){console.error(`❌ Nodo padre no válido en el camino:`,i);continue}let a=i.instancia?.type?.components||i.instancia?.components;if(a&&a[n])return a[n]=t,o(i.instancia)||o(i.instancia.proxy)}return!1}export async function reloadComponent(r,i){try{let{normalizedPath:o,nameFile:c}=i;if(!r||!r._instance){let t=await e();if(!t)return console.error(`❌ No se pudo obtener la instancia de Vue`),!1;r=t}if(!o)return console.error(`❌ No se proporcionó relativePath`),!1;let l=window.location.href,u=new URL(l),d=`${u.origin}/${o}`,f=Date.now(),p=`${d}?t=${f}`,m=await import(p);if(!m.default)return console.error(`❌ El módulo importado no tiene export default`),!1;let h=buildComponentTree(r._instance);if(!h)return console.error(`❌ No se pudo construir el árbol de componentes`),!1;let g=t(h,c);if(!g)return console.warn(`⚠️ No se encontró el nodo objetivo para:`,c),!1;console.log(`🔍 Se encontraron ${g.length} instancias del componente ${c}`);let _=0;for(let e=0;e<g.length;e++){let t=g[e];if(t){let i=n(t),a=await s(i,m.default,c,r);a?_++:console.error(`❌ No se pudo actualizar la instancia ${e+1}`)}}let v=_>0;return console.log(`\n📊 Resultado final: ${_}/${g.length} instancias actualizadas`),v}catch(e){return console.error(`❌ Error en reloadComponent:`,e),!1}}
1
+ import{obtenerInstanciaVue as e}from"./getInstanciaVue.js";function t(e,t){let n=[];function r(e){e.name===t&&n.push(e);for(let t of e.children)r(t)}return r(e),n}function n(e){let t=[];for(;e;)t.push(e),e=e.parent;return t}function r(e,t){if(!(!e||typeof e!=`object`))if(e?.type.name===`Suspense`){let n=e?.suspense.activeBranch,i={name:e?.type.name,instancia:n,children:[],parent:t,isRoot:!1};t.children.push(i),r(n,i)}else if(e.component){let n=e.component,r=`Anonymous`;if(n.type){if(n.type.name)r=n.type.name;else if(n.type.__name)r=n.type.__name;else if(typeof n.type==`function`){let e=n.type.name;e&&e!==`Anonymous function`&&(r=e);let t=n.type.toString();t.includes(`BaseTransition`)?r=`Transition`:t.includes(`KeepAlive`)?r=`KeepAlive`:t.includes(`Suspense`)&&(r=`Suspense`)}}let a={name:r,instancia:n,children:[],parent:t,isRoot:!1};t.children.push(a),i(n,a)}else{let n=e.children||e.dynamicChildren;Array.isArray(n)&&n.forEach(e=>{r(e,t)})}}function i(e,t){let n=e.subTree;n&&r(n,t)}export const buildComponentTree=e=>{if(!e||!e.type)return console.warn(`No se pudo construir el árbol de componentes: instancia inválida`),null;let t={name:e.type?.name||e.type?.__name||`Anonymous`,instancia:e,children:[],parent:null,isRoot:!0,from:`root`};return i(e,t),t};function o(e){return e?e.proxy&&typeof e.proxy.$forceUpdate==`function`?(e.proxy.$forceUpdate(),typeof e.update==`function`&&e.update(),e.ctx?._.setupState?.versaComponentKey!==void 0&&e.ctx._.setupState.versaComponentKey++,!0):typeof e.update==`function`?(e.ctx?._.setupState?.versaComponentKey!==void 0&&e.ctx._.setupState.versaComponentKey++,e.update(),!0):!1:!1}function s(e,t,n,r){if(!e||!t||!n||!r)return console.error(`❌ Parámetros inválidos para tryUpdateComponentPath`),!1;for(let r=1;r<e.length;r++){let i=e[r];if(i.isRoot||i.name===`KeepAlive`)return window.location.reload(),!0;if(!i||!i.instancia){console.error(`❌ Nodo padre no válido en el camino:`,i);continue}let a=i.instancia?.type?.components||i.instancia?.components;if(a&&a[n])return a[n]=t,o(i.instancia)||o(i.instancia.proxy)}return!1}export async function reloadComponent(r,i){try{let{normalizedPath:o,nameFile:c}=i;if(!r||!r._instance){let t=await e();if(!t)return console.error(`❌ No se pudo obtener la instancia de Vue`),!1;r=t}if(!o)return console.error(`❌ No se proporcionó relativePath`),!1;let l=window.location.href,u=await import(`${`${new URL(l).origin}/${o}`}?t=${Date.now()}`);if(!u.default)return console.error(`❌ El módulo importado no tiene export default`),!1;let d=buildComponentTree(r._instance);if(!d)return console.error(`❌ No se pudo construir el árbol de componentes`),!1;let f=t(d,c);if(!f)return console.warn(`⚠️ No se encontró el nodo objetivo para:`,c),!1;console.log(`🔍 Se encontraron ${f.length} instancias del componente ${c}`);let p=0;for(let e=0;e<f.length;e++){let t=f[e];t&&(await s(n(t),u.default,c,r)?p++:console.error(`❌ No se pudo actualizar la instancia ${e+1}`))}let m=p>0;return console.log(`\n📊 Resultado final: ${p}/${f.length} instancias actualizadas`),m}catch(e){return console.error(`❌ Error en reloadComponent:`,e),!1}}
@@ -1 +1 @@
1
- import{hideErrorOverlay as e,showErrorOverlay as t}from"./errorScreen.js";import{obtenerInstanciaVue as n}from"./getInstanciaVue.js";import{reloadComponent as r}from"./VueHRM.js";async function i(a=0){let o=10,s=Math.min(2e3*(a+1),1e4);if(window.___browserSync___&&window.___browserSync___.socket){let o=window.___browserSync___.socket,c=o.connected;o.off(`connect`),o.off(`disconnect`),o.off(`reloadFull`),o.off(`HRMVue`),o.off(`HRMHelper`),o.off(`error`),o.on(`connect`,async()=>{c=!0,e(),console.log(`✔️ Versa HMR: Socket conectado`)}),o.on(`disconnect`,()=>{c=!1,console.log(`❌ Versa HMR: Socket desconectado, reintentando...`),setTimeout(()=>{!o.connected&&a<10?i(a+1):o.connected||(console.error(`❌ Versa HMR: Socket no conectado después de 10 reintentos tras desconexión.`),t(`HMR Desconectado`,`No se pudo reconectar a BrowserSync después de múltiples reintentos.`))},s)}),o.on(`reloadFull`,()=>window.location.reload());let l=await n();o.on(`HRMVue`,async t=>{e(),l=window.__VUE_APP__||l,l?(console.log(`🔥 Preparando HMR para Vue...`),await r(l,t)):console.log(`🔄 Usando método fallback:`,l)}),o.on(`HRMHelper`,e=>{window.location.reload(),console.log(`🔄 Recargando página por HMRHelper:`,e)}),o.on(`error`,e=>{console.error(`❌ Versa HMR: Error en el socket:`,e),t(`Error de Socket`,`Se produjo un error en la conexión de BrowserSync.`)}),c||(console.log(`Versa HMR: Objeto socket encontrado, intentando conexión (Intento ${a+1}/10)`),setTimeout(()=>{!o.connected&&a<=10?(console.warn(`Versa HMR: Sin conexión de socket después del tiempo de espera inicial, reintentando initSocket...`),i(a+1)):o.connected||(console.error(`❌ Versa HMR: Socket aún no conectado después de 10 intentos iniciales.`),t(`Falló HMR de BrowserSync`,`No se pudo conectar al socket de BrowserSync después de intentos iniciales.`))},5e3))}else console.warn(`[HMR] Socket de BrowserSync no encontrado o BrowserSync no completamente inicializado. Reintentando initSocket... (${a+1}/10)`),a<10?setTimeout(()=>i(a+1),s):(console.error(`❌ Versa HMR: Socket de BrowserSync no encontrado después de 10 reintentos.`),t(`Falló HMR de BrowserSync`,`Socket o cliente de BrowserSync no encontrado después de múltiples reintentos.`))}i();
1
+ import{hideErrorOverlay as e,showErrorOverlay as t}from"./errorScreen.js";import{obtenerInstanciaVue as n}from"./getInstanciaVue.js";import{reloadComponent as r}from"./VueHRM.js";async function i(a=0){let o=Math.min(2e3*(a+1),1e4);if(window.___browserSync___&&window.___browserSync___.socket){let s=window.___browserSync___.socket,c=s.connected;s.off(`connect`),s.off(`disconnect`),s.off(`reloadFull`),s.off(`HRMVue`),s.off(`HRMHelper`),s.off(`error`),s.on(`connect`,async()=>{c=!0,e(),console.log(`✔️ Versa HMR: Socket conectado`)}),s.on(`disconnect`,()=>{c=!1,console.log(`❌ Versa HMR: Socket desconectado, reintentando...`),setTimeout(()=>{!s.connected&&a<10?i(a+1):s.connected||(console.error(`❌ Versa HMR: Socket no conectado después de 10 reintentos tras desconexión.`),t(`HMR Desconectado`,`No se pudo reconectar a BrowserSync después de múltiples reintentos.`))},o)}),s.on(`reloadFull`,()=>window.location.reload());let l=await n();s.on(`HRMVue`,async t=>{e(),l=window.__VUE_APP__||l,l?(console.log(`🔥 Preparando HMR para Vue...`),await r(l,t)):console.log(`🔄 Usando método fallback:`,l)}),s.on(`HRMHelper`,e=>{window.location.reload(),console.log(`🔄 Recargando página por HMRHelper:`,e)}),s.on(`error`,e=>{console.error(`❌ Versa HMR: Error en el socket:`,e),t(`Error de Socket`,`Se produjo un error en la conexión de BrowserSync.`)}),c||(console.log(`Versa HMR: Objeto socket encontrado, intentando conexión (Intento ${a+1}/10)`),setTimeout(()=>{!s.connected&&a<=10?(console.warn(`Versa HMR: Sin conexión de socket después del tiempo de espera inicial, reintentando initSocket...`),i(a+1)):s.connected||(console.error(`❌ Versa HMR: Socket aún no conectado después de 10 intentos iniciales.`),t(`Falló HMR de BrowserSync`,`No se pudo conectar al socket de BrowserSync después de intentos iniciales.`))},5e3))}else console.warn(`[HMR] Socket de BrowserSync no encontrado o BrowserSync no completamente inicializado. Reintentando initSocket... (${a+1}/10)`),a<10?setTimeout(()=>i(a+1),o):(console.error(`❌ Versa HMR: Socket de BrowserSync no encontrado después de 10 reintentos.`),t(`Falló HMR de BrowserSync`,`Socket o cliente de BrowserSync no encontrado después de múltiples reintentos.`))}i();
package/dist/main.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import e from"node:path";import t,{env as n}from"node:process";import{fileURLToPath as r}from"node:url";import{logger as i}from"./servicios/logger.js";import{readConfig as a}from"./servicios/readConfig.js";let o,s,c;n.PATH_PROY=e.dirname(r(import.meta.url)),n.PATH_CONFIG_FILE=e.resolve(t.cwd(),`versacompile.config.ts`);async function l(){return o||=(await import(`chalk`)).default,o}async function u(){try{let t=await import(`node:fs/promises`),i=e.resolve(n.PATH_PROY||e.dirname(r(import.meta.url)),`..`,`package.json`),a=await t.readFile(i,`utf-8`),o=JSON.parse(a);return o.version||`unknown`}catch{return`unknown`}}async function d(){if(!s){let e=await import(`yargs`),t=await import(`yargs/helpers`);s=e.default,c=t.hideBin}return{yargs:s,hideBin:c}}async function f(){return await import(`./compiler/compile.js`)}async function p(){return await import(`./servicios/browserSync.js`)}async function m(){return await import(`./servicios/file-watcher.js`)}async function h(){return await import(`./servicios/readConfig.js`)}function g(){i.info(`VersaCompiler cerrado correctamente`)}async function _(){let{yargs:r,hideBin:o}=await d(),s=await l(),c=r(o(t.argv)).scriptName(`versa`).usage(s.blue(`VersaCompiler`)+` - Compilador de archivos Vue/TS/JS`).option(`init`,{type:`boolean`,description:`Inicializar la configuración`}).option(`watch`,{type:`boolean`,description:`Habilitar el modo de observación (watch)`,default:!1}).alias(`w`,`watch`).option(`all`,{type:`boolean`,description:`Compilar todos los archivos`}).option(`file`,{type:`string`,description:`Compilar un archivo específico`,alias:`f`}).option(`prod`,{type:`boolean`,description:`Modo producción`}).alias(`p`,`prod`).option(`verbose`,{type:`boolean`,description:`Habilitar salida detallada (verbose)`,default:!1}).alias(`v`,`verbose`).option(`cleanOutput`,{type:`boolean`,description:`Limpiar el directorio de salida antes de compilar`,default:!1}).alias(`co`,`cleanOutput`).option(`cleanCache`,{type:`boolean`,description:`Limpiar el cache de compilación antes de compilar`,default:!1}).alias(`cc`,`cleanCache`).option(`yes`,{type:`boolean`,description:`Confirmar automáticamente las acciones que requieren confirmación`,default:!1}).alias(`y`,`yes`).option(`typeCheck`,{type:`boolean`,description:`Habilitar/Deshabilitar la verificación de tipos. Por defecto --typeCheck=false`,default:!1}).alias(`t`,`typeCheck`);n.tailwindcss!==`false`&&(c=c.option(`tailwind`,{type:`boolean`,description:`Habilitar/Deshabilitar compilación de Tailwind CSS. Por defecto --tailwind=false`,default:!1})),n.linter!==`false`&&(c=c.option(`linter`,{type:`boolean`,description:`Habilitar/Deshabilitar el linter. Por defecto --linter=false`,default:!1}));let _=await c.help().alias(`h`,`help`).command(`* [files...]`,`Compilar archivos específicos`,e=>e.positional(`files`,{describe:`Archivos para compilar`,type:`string`,array:!0})).parse();try{let r=await u(),o=`━`.repeat(60);if(i.log(`
2
+ import e from"node:path";import t,{env as n}from"node:process";import{fileURLToPath as r}from"node:url";import{logger as i}from"./servicios/logger.js";import{readConfig as a}from"./servicios/readConfig.js";let o,s,c;n.PATH_PROY=e.dirname(r(import.meta.url)),n.PATH_CONFIG_FILE=e.resolve(t.cwd(),`versacompile.config.ts`);async function l(){return o||(o=(await import(`chalk`)).default),o}async function u(){try{let t=await import(`node:fs/promises`),i=e.resolve(n.PATH_PROY||e.dirname(r(import.meta.url)),`..`,`package.json`),a=await t.readFile(i,`utf-8`);return JSON.parse(a).version||`unknown`}catch{return`unknown`}}async function d(){if(!s){let e=await import(`yargs`),t=await import(`yargs/helpers`);s=e.default,c=t.hideBin}return{yargs:s,hideBin:c}}async function f(){return await import(`./compiler/compile.js`)}async function p(){return await import(`./servicios/browserSync.js`)}async function m(){return await import(`./servicios/file-watcher.js`)}async function h(){return await import(`./servicios/readConfig.js`)}function g(){i.info(`VersaCompiler cerrado correctamente`)}async function _(){let{yargs:r,hideBin:o}=await d(),s=await l(),c=r(o(t.argv)).scriptName(`versa`).usage(s.blue(`VersaCompiler`)+` - Compilador de archivos Vue/TS/JS`).option(`init`,{type:`boolean`,description:`Inicializar la configuración`}).option(`watch`,{type:`boolean`,description:`Habilitar el modo de observación (watch)`,default:!1}).alias(`w`,`watch`).option(`all`,{type:`boolean`,description:`Compilar todos los archivos`}).option(`file`,{type:`string`,description:`Compilar un archivo específico`,alias:`f`}).option(`prod`,{type:`boolean`,description:`Modo producción`}).alias(`p`,`prod`).option(`verbose`,{type:`boolean`,description:`Habilitar salida detallada (verbose)`,default:!1}).alias(`v`,`verbose`).option(`cleanOutput`,{type:`boolean`,description:`Limpiar el directorio de salida antes de compilar`,default:!1}).alias(`co`,`cleanOutput`).option(`cleanCache`,{type:`boolean`,description:`Limpiar el cache de compilación antes de compilar`,default:!1}).alias(`cc`,`cleanCache`).option(`yes`,{type:`boolean`,description:`Confirmar automáticamente las acciones que requieren confirmación`,default:!1}).alias(`y`,`yes`).option(`typeCheck`,{type:`boolean`,description:`Habilitar/Deshabilitar la verificación de tipos. Por defecto --typeCheck=false`,default:!1}).alias(`t`,`typeCheck`);n.tailwindcss!==`false`&&(c=c.option(`tailwind`,{type:`boolean`,description:`Habilitar/Deshabilitar compilación de Tailwind CSS. Por defecto --tailwind=false`,default:!1})),n.linter!==`false`&&(c=c.option(`linter`,{type:`boolean`,description:`Habilitar/Deshabilitar el linter. Por defecto --linter=false`,default:!1}));let _=await c.help().alias(`h`,`help`).command(`* [files...]`,`Compilar archivos específicos`,e=>e.positional(`files`,{describe:`Archivos para compilar`,type:`string`,array:!0})).parse();try{let r=await u(),o=`━`.repeat(60);if(i.log(`
3
3
  `+s.cyan(o)+`
4
4
  `+s.bold.cyan(` ⚡ VersaCompiler `)+s.gray(`v${r}`)+`
5
5
  `+s.gray(` Vue · TypeScript · JavaScript Compiler`)+`
6
6
  `+s.cyan(o)+`
7
- `),_.init){i.info(`Iniciando la configuración...`);let{initConfig:e}=await h();await e(),t.exit(0)}await a()||t.exit(1),n.isPROD=_.prod?`true`:`false`,n.isALL=_.all?`true`:`false`,n.TAILWIND=_.tailwind===void 0?`true`:String(_.tailwind),n.ENABLE_LINTER=String(_.linter),n.VERBOSE=_.verbose?`true`:`false`,i.info(s.bold.blue(`⚙️ Configuración`)),i.info(s.gray(` ┌─ Modo de ejecución`));let c=[{label:`Observar`,value:_.watch,icon:`👀`},{label:`Todos los archivos`,value:n.isALL===`true`,icon:`📁`},{label:`Archivo único`,value:!!_.file,icon:`📄`},{label:`Producción`,value:n.isPROD===`true`,icon:`🏭`}],l=[{label:`Tailwind`,value:n.TAILWIND===`true`,icon:`🎨`},{label:`Minificación`,value:n.isPROD===`true`,icon:`🗜️`},{label:`Linter`,value:n.ENABLE_LINTER===`true`,icon:`🔍`},{label:`Verificar tipos`,value:_.typeCheck,icon:`📘`},{label:`Detallado`,value:n.VERBOSE===`true`,icon:`📝`}];if(c.forEach(e=>{let t=e.value?s.green(`●`):s.gray(`○`),n=e.value?s.green(e.label):s.gray(e.label);i.info(s.gray(` │ `)+t+` ${e.icon} ${n}`)}),i.info(s.gray(` ├─ Características`)),l.forEach(e=>{let t=e.value?s.green(`●`):s.gray(`○`),n=e.value?s.green(e.label):s.gray(e.label);i.info(s.gray(` │ `)+t+` ${e.icon} ${n}`)}),_.file&&(i.info(s.gray(` ├─ Objetivo`)),i.info(s.gray(` │ `)+s.blue(`📄 `)+_.file)),_.cleanOutput&&(i.info(s.gray(` ├─ Limpieza`)),i.info(s.gray(` │ `)+s.yellow(`🧹 Limpiar salida`))),_.cleanCache&&i.info(s.gray(` │ `)+s.yellow(`🗑️ Limpiar caché`)),i.info(s.gray(` └─ ¡Listo para compilar!`)),i.log(``),n.typeCheck=_.typeCheck?`true`:`false`,n.cleanCache=_.cleanCache?`true`:`false`,n.yes=_.y?`true`:`false`,_.cleanOutput){let{cleanOutputDir:e}=await m();await e(n.PATH_DIST||`./dist`)}if(_.files&&_.files.length>0){i.info(s.yellow(`📄 Compilando ${_.files.length} archivo(s)...`));let e=await import(`node:fs/promises`),{compileFile:n}=await f(),r=!1;for(let t of _.files)try{await e.access(t),i.info(s.blue(`🔄 Compilando: ${t}`));let a=await n(t);a.success?i.info(s.green(`✅ ${t} → ${a.output}`)):(i.error(s.red(`❌ Error al compilar: ${t}`)),r=!0)}catch{i.error(s.red(`❌ El archivo '${t}' no existe.`)),r=!0}t.exit(r?1:0)}if(_.file){i.info(s.yellow(`📄 Compilando archivo: ${_.file}`));let n=await import(`node:fs/promises`),{compileFile:r}=await f(),a;try{await n.access(_.file),a=e.resolve(_.file)}catch{i.error(s.red(`❌ Error: El archivo '${_.file}' no existe.`)),t.exit(1)}let o=await r(a);o.success?(i.info(s.green(`✅ Archivo compilado exitosamente: ${o.output}`)),t.exit(0)):(i.error(s.red(`❌ Error al compilar el archivo: ${_.file}`)),t.exit(1))}if(_.all){let{initCompileAll:e}=await f();await e(),t.exit(0)}if(!_.watch&&n.ENABLE_LINTER===`true`){let{runLinter:e}=await f();await e(!0),t.exit(1)}if(n.TAILWIND===`true`){let e=await import(`./compiler/tailwindcss.js`),t=await e.generateTailwindCSS();if(typeof t!=`boolean`)if(t?.success)i.info(`\nTailwind CSS compilado🎨 ${t.message}\n`);else{let e=`${t.message}${t.details?`
8
- `+t.details:``}`;i.error(`\n❌ Error al generar Tailwind CSS: ${e}\n`)}}let d,v;if(_.watch){let{browserSyncServer:e}=await p(),{initChokidar:n}=await m();d=await e(),d||t.exit(1),v=await n(d),v||t.exit(1)}t.on(`SIGINT`,async()=>{d&&d.exit(),v&&v.close(),g(),t.exit(0)}),t.on(`SIGTERM`,async()=>{g(),t.exit(0)})}catch(e){i.error(`Error en la aplicación:`,e),g(),t.exit(1)}}_();
7
+ `),_.init){i.info(`Iniciando la configuración...`);let{initConfig:e}=await h();await e(),t.exit(0)}await a()||t.exit(1),n.isPROD=_.prod?`true`:`false`,n.isALL=_.all?`true`:`false`,n.TAILWIND=_.tailwind===void 0?`true`:String(_.tailwind),n.ENABLE_LINTER=String(_.linter),n.VERBOSE=_.verbose?`true`:`false`,i.info(s.bold.blue(`⚙️ Configuración`)),i.info(s.gray(` ┌─ Modo de ejecución`));let c=[{label:`Observar`,value:_.watch,icon:`👀`},{label:`Todos los archivos`,value:n.isALL===`true`,icon:`📁`},{label:`Archivo único`,value:!!_.file,icon:`📄`},{label:`Producción`,value:n.isPROD===`true`,icon:`🏭`}],l=[{label:`Tailwind`,value:n.TAILWIND===`true`,icon:`🎨`},{label:`Minificación`,value:n.isPROD===`true`,icon:`🗜️`},{label:`Linter`,value:n.ENABLE_LINTER===`true`,icon:`🔍`},{label:`Verificar tipos`,value:_.typeCheck,icon:`📘`},{label:`Detallado`,value:n.VERBOSE===`true`,icon:`📝`}];if(c.forEach(e=>{let t=e.value?s.green(`●`):s.gray(`○`),n=e.value?s.green(e.label):s.gray(e.label);i.info(s.gray(` │ `)+t+` ${e.icon} ${n}`)}),i.info(s.gray(` ├─ Características`)),l.forEach(e=>{let t=e.value?s.green(`●`):s.gray(`○`),n=e.value?s.green(e.label):s.gray(e.label);i.info(s.gray(` │ `)+t+` ${e.icon} ${n}`)}),_.file&&(i.info(s.gray(` ├─ Objetivo`)),i.info(s.gray(` │ `)+s.blue(`📄 `)+_.file)),_.cleanOutput&&(i.info(s.gray(` ├─ Limpieza`)),i.info(s.gray(` │ `)+s.yellow(`🧹 Limpiar salida`))),_.cleanCache&&i.info(s.gray(` │ `)+s.yellow(`🗑️ Limpiar caché`)),i.info(s.gray(` └─ ¡Listo para compilar!`)),i.log(``),n.typeCheck=_.typeCheck?`true`:`false`,n.cleanCache=_.cleanCache?`true`:`false`,n.yes=_.y?`true`:`false`,_.cleanOutput){let{cleanOutputDir:e}=await m();await e(n.PATH_DIST||`./dist`)}if(_.files&&_.files.length>0){i.info(s.yellow(`📄 Compilando ${_.files.length} archivo(s)...`));let e=await import(`node:fs/promises`),{compileFile:n}=await f(),r=!1;for(let t of _.files)try{await e.access(t),i.info(s.blue(`🔄 Compilando: ${t}`));let a=await n(t);a.success?i.info(s.green(`✅ ${t} → ${a.output}`)):(i.error(s.red(`❌ Error al compilar: ${t}`)),r=!0)}catch{i.error(s.red(`❌ El archivo '${t}' no existe.`)),r=!0}t.exit(r?1:0)}if(_.file){i.info(s.yellow(`📄 Compilando archivo: ${_.file}`));let n=await import(`node:fs/promises`),{compileFile:r}=await f(),a;try{await n.access(_.file),a=e.resolve(_.file)}catch{i.error(s.red(`❌ Error: El archivo '${_.file}' no existe.`)),t.exit(1)}let o=await r(a);o.success?(i.info(s.green(`✅ Archivo compilado exitosamente: ${o.output}`)),t.exit(0)):(i.error(s.red(`❌ Error al compilar el archivo: ${_.file}`)),t.exit(1))}if(_.all){let{initCompileAll:e}=await f();await e(),t.exit(0)}if(!_.watch&&n.ENABLE_LINTER===`true`){let{runLinter:e}=await f();await e(!0),t.exit(1)}if(n.TAILWIND===`true`){let e=await(await import(`./compiler/tailwindcss.js`)).generateTailwindCSS();if(typeof e!=`boolean`)if(e?.success)i.info(`\nTailwind CSS compilado🎨 ${e.message}\n`);else{let t=`${e.message}${e.details?`
8
+ `+e.details:``}`;i.error(`\n❌ Error al generar Tailwind CSS: ${t}\n`)}}let d,v;if(_.watch){let{browserSyncServer:e}=await p(),{initChokidar:n}=await m();d=await e(),d||t.exit(1),v=await n(d),v||t.exit(1)}t.once(`SIGINT`,async()=>{if(d&&d.exit(),v){let{cleanupWatcher:e}=await m();await e(v)}g(),t.exit(0)}),t.once(`SIGTERM`,async()=>{if(d&&d.exit(),v){let{cleanupWatcher:e}=await m();await e(v)}g(),t.exit(0)})}catch(e){i.error(`Error en la aplicación:`,e),g(),t.exit(1)}}_();
@@ -1,7 +1,2 @@
1
- import{createHash as e}from"node:crypto";import{promises as t}from"node:fs";import n from"node:path";import r,{env as i}from"node:process";import a from"browser-sync";import o from"get-port";import{promptUser as s}from"../utils/promptUser.js";import{getProxyInfo as c,validateProxyAvailability as l}from"../utils/proxyValidator.js";import{logger as u}from"./logger.js";class d{static instance;cache=new Map;MAX_CACHE_SIZE=200;MAX_CACHE_MEMORY=50*1024*1024;CACHE_TTL=900*1e3;currentMemoryUsage=0;cacheHits=0;cacheMisses=0;totalRequests=0;static getInstance(){return d.instance||=new d,d.instance}generateETag(t,n){let r=e(`md5`).update(`${t}:${n.mtime.getTime()}:${n.size}`).digest(`hex`);return`"${r}"`}getContentType(e){let t=n.extname(e).toLowerCase(),r={".js":`application/javascript`,".mjs":`application/javascript`,".ts":`application/javascript`,".css":`text/css`,".html":`text/html`,".json":`application/json`,".png":`image/png`,".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".gif":`image/gif`,".svg":`image/svg+xml`,".ico":`image/x-icon`,".webp":`image/webp`,".avif":`image/avif`,".woff":`font/woff`,".woff2":`font/woff2`,".ttf":`font/ttf`,".eot":`application/vnd.ms-fontobject`,".map":`application/json`,".xml":`application/xml`,".txt":`text/plain`,".pdf":`application/pdf`,".zip":`application/zip`,".mp4":`video/mp4`,".mp3":`audio/mpeg`,".wav":`audio/wav`,".ogg":`audio/ogg`};return r[t]||`application/octet-stream`}shouldCache(e){let t=n.extname(e).toLowerCase(),r=[`.js`,`.mjs`,`.css`,`.json`,`.png`,`.jpg`,`.jpeg`,`.gif`,`.svg`,`.ico`,`.webp`,`.avif`,`.woff`,`.woff2`,`.ttf`,`.eot`,`.map`];return r.includes(t)}async getOrReadFile(e){this.totalRequests++;try{let n=await t.stat(e),r=n.mtime.getTime(),i=this.generateETag(e,n);if(!this.shouldCache(e)){let n=await t.readFile(e,`utf-8`);return{content:n,contentType:this.getContentType(e),etag:i,cached:!1}}let a=this.cache.get(e);if(a&&a.lastModified===r)return this.cacheHits++,{content:a.content,contentType:a.contentType,etag:a.etag,cached:!0};this.cacheMisses++;let o=this.isBinaryFile(e),s=await t.readFile(e,o?void 0:`utf-8`),c=this.getContentType(e);return this.addToCache(e,{content:s,contentType:c,lastModified:r,etag:i,size:n.size}),{content:s,contentType:c,etag:i,cached:!1}}catch{return null}}isBinaryFile(e){let t=n.extname(e).toLowerCase(),r=[`.png`,`.jpg`,`.jpeg`,`.gif`,`.ico`,`.webp`,`.avif`,`.woff`,`.woff2`,`.ttf`,`.eot`,`.pdf`,`.zip`,`.mp4`,`.mp3`,`.wav`,`.ogg`];return r.includes(t)}addToCache(e,t){try{this.evictIfNeeded(t.size);let n={content:t.content,contentType:t.contentType,lastModified:t.lastModified,etag:t.etag,size:t.size};this.cache.set(e,n),this.currentMemoryUsage+=t.size}catch(e){console.warn(`[BrowserSyncFileCache] Error cacheando archivo:`,e)}}evictIfNeeded(e){for(;this.cache.size>=this.MAX_CACHE_SIZE;)this.evictOldest();for(;this.currentMemoryUsage+e>this.MAX_CACHE_MEMORY&&this.cache.size>0;)this.evictOldest()}evictOldest(){let e=``,t=1/0;for(let[n,r]of this.cache)r.lastModified<t&&(t=r.lastModified,e=n);if(e){let t=this.cache.get(e);t&&(this.currentMemoryUsage-=t.size,this.cache.delete(e))}}invalidateFile(e){let t=this.cache.get(e);t&&(this.currentMemoryUsage-=t.size,this.cache.delete(e))}getStats(){let e=this.totalRequests>0?Math.round(this.cacheHits/this.totalRequests*100):0;return{cacheHits:this.cacheHits,cacheMisses:this.cacheMisses,hitRate:e,totalRequests:this.totalRequests,cacheSize:this.cache.size,maxCacheSize:this.MAX_CACHE_SIZE,memoryUsage:this.currentMemoryUsage,maxMemoryUsage:this.MAX_CACHE_MEMORY}}clear(){this.cache.clear(),this.currentMemoryUsage=0,this.cacheHits=0,this.cacheMisses=0,this.totalRequests=0}}const f=d.getInstance(),p=async()=>{let{default:e}=await import(`chalk`);return e};export async function browserSyncServer(){try{let e=null,t=i.AssetsOmit===`true`,d={server:`./`};if(i.proxyUrl){u.info(`🔍 Validando disponibilidad del servidor proxy: ${i.proxyUrl}`);let e=await l(i.proxyUrl,5e3);if(e)u.info(`✅ Servidor proxy disponible`);else{let e=c(i.proxyUrl);u.warn(`⚠️ El servidor proxy no está disponible:`),u.warn(` Host: ${e.host}`),u.warn(` Puerto: ${e.port}`),u.warn(` Protocolo: ${e.protocol}`);let t=await s(`
2
- ¿Desea continuar de todos modos? El modo proxy podría no funcionar correctamente. (s/n): `,3e4);t.toLowerCase().trim()!==`s`&&t.toLowerCase().trim()!==`si`&&(u.info(`🛑 Operación cancelada por el usuario.`),r.exit(0)),u.warn(`⚠️ Continuando con el servidor proxy no disponible...`)}d={proxy:i.proxyUrl}}let m=n.join(i.PATH_PROY||r.cwd(),`hrm`),h=r.cwd(),g=n.relative(h,m);e=a.create();let _=await o({port:3e3}),v=await o({port:4e3});return e.init({...d,files:[`${i.PATH_DIST}/**/*.css`],injectChanges:!0,open:!1,port:_,ui:{port:v},socket:{path:`/browser-sync/socket.io`},snippetOptions:{rule:{match:/<\/body>/i,fn:(e,t)=>`
3
- ${e}${t}
4
- <script
5
- type="module"
6
- src="/__versa/initHRM.js"><\/script>
7
- `}},logLevel:`info`,logPrefix:`BS`,logConnections:!0,logFileChanges:!0,watchEvents:[`change`,`add`,`unlink`,`addDir`,`unlinkDir`],reloadDelay:500,reloadDebounce:500,reloadOnRestart:!0,notify:!0,watchOptions:{ignoreInitial:!0,ignored:[`node_modules`,`.git`]},middleware:[async function(e,i,a){if(i.setHeader(`Access-Control-Allow-Origin`,`*`),i.setHeader(`Access-Control-Allow-Methods`,`*`),i.setHeader(`Access-Control-Allow-Headers`,`*`),i.setHeader(`Access-Control-Allow-Credentials`,`true`),i.setHeader(`Access-Control-Max-Age`,`3600`),i.setHeader(`Cache-Control`,`no-cache, no-store, must-revalidate`),i.setHeader(`Pragma`,`no-cache`),i.setHeader(`Expires`,`0`),e.url===`/__versa/initHRM.js`){let e=n.join(g,`/initHRM.js`),t=await f.getOrReadFile(e);if(t)i.setHeader(`Content-Type`,t.contentType),i.setHeader(`ETag`,t.etag),i.end(t.content);else{let t=await p();u.error(t.red(`🚩 :Error al leer el archivo ${e}`)),i.statusCode=404,i.end(`// vueLoader.js not found`)}return}if(e.url.startsWith(`/__versa/`)){let t=n.join(g,e.url.replace(`/__versa/`,``)),r=await f.getOrReadFile(t);if(r)i.setHeader(`Content-Type`,r.contentType),i.setHeader(`ETag`,r.etag),i.end(r.content);else{let e=await p();u.error(e.red(`🚩 :Error al leer el archivo ${t}`)),i.statusCode=404,i.end(`// Not found`)}return}if(e.url.startsWith(`/node_modules/`)){let t=n.join(r.cwd(),e.url),a=await f.getOrReadFile(t);if(a)i.setHeader(`Content-Type`,a.contentType),i.setHeader(`ETag`,a.etag),i.end(a.content);else{let e=await p();u.error(e.red(`🚩 Error al leer el módulo ${t}`)),i.statusCode=404,i.end(`// Module not found`)}return}let o=e.url.match(/\.(js|css|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf|eot|map|webp|avif|json|html|xml|txt|pdf|zip|mp4|mp3|wav|ogg)(\?.*)?$/i);if(e.method===`GET`){let n=await p();o&&!t?u.info(n.white(`GET: ${e.url}`)):o||u.info(n.cyan(`GET: ${e.url}`))}else if(e.method===`POST`){let t=await p();u.info(t.blue(`POST: ${e.url}`))}else if(e.method===`PUT`){let t=await p();u.info(t.yellow(`PUT: ${e.url}`))}else if(e.method===`DELETE`){let t=await p();u.info(t.red(`DELETE: ${e.url}`))}else{let t=await p();u.info(t.gray(`${e.method}: ${e.url}`))}a()}]}),e}catch(e){u.error(`🚩 :Error al iniciar BrowserSync: ${e instanceof Error?e.message:String(e)}`),r.exit(1)}}export async function emitirCambios(e,t,r){let i=await p();u.info(i.green(`[HMR] Emitiendo cambios: ${t} ${r}\n`));let a=n.normalize(r).replace(/\\/g,`/`),o=n.basename(a,n.extname(a));e.sockets.emit(t,{action:t,filePath:r,normalizedPath:a,nameFile:o})}export const getBrowserSyncCacheStats=()=>f.getStats();export const clearBrowserSyncCache=()=>{f.clear()};export const invalidateBrowserSyncFile=e=>{f.invalidateFile(e)};
1
+ import{createHash as e}from"node:crypto";import{promises as t}from"node:fs";import n from"node:path";import r,{env as i}from"node:process";import a from"browser-sync";import o from"get-port";import{promptUser as s}from"../utils/promptUser.js";import{getProxyInfo as c,validateProxyAvailability as l}from"../utils/proxyValidator.js";import{logger as u}from"./logger.js";class d{static instance;cache=new Map;MAX_CACHE_SIZE=200;MAX_CACHE_MEMORY=50*1024*1024;CACHE_TTL=900*1e3;currentMemoryUsage=0;cleanupInterval=null;cacheHits=0;cacheMisses=0;totalRequests=0;constructor(){this.startAutoCleanup()}static getInstance(){return d.instance||(d.instance=new d),d.instance}startAutoCleanup(){this.cleanupInterval=setInterval(()=>{this.cleanupExpiredEntries()},300*1e3)}cleanupExpiredEntries(){let e=Date.now(),t=0;for(let[n,r]of this.cache.entries())e-r.lastModified>this.CACHE_TTL&&(this.currentMemoryUsage-=r.size,this.cache.delete(n),t++);t>0&&console.log(`[BrowserSync] Limpiadas ${t} entradas expiradas del cache`)}generateETag(t,n){return`"${e(`md5`).update(`${t}:${n.mtime.getTime()}:${n.size}`).digest(`hex`)}"`}getContentType(e){let t=n.extname(e).toLowerCase();return{".js":`application/javascript`,".mjs":`application/javascript`,".ts":`application/javascript`,".css":`text/css`,".html":`text/`,".json":`application/json`,".png":`image/png`,".jpg":`image/jpeg`,".jpeg":`image/jpeg`,".gif":`image/gif`,".svg":`image/svg+xml`,".ico":`image/x-icon`,".webp":`image/webp`,".avif":`image/avif`,".woff":`font/woff`,".woff2":`font/woff2`,".ttf":`font/ttf`,".eot":`application/vnd.ms-fontobject`,".map":`application/json`,".xml":`application/xml`,".txt":`text/plain`,".pdf":`application/pdf`,".zip":`application/zip`,".mp4":`video/mp4`,".mp3":`audio/mpeg`,".wav":`audio/wav`,".ogg":`audio/ogg`}[t]||`application/octet-stream`}shouldCache(e){let t=n.extname(e).toLowerCase();return[`.js`,`.mjs`,`.css`,`.json`,`.png`,`.jpg`,`.jpeg`,`.gif`,`.svg`,`.ico`,`.webp`,`.avif`,`.woff`,`.woff2`,`.ttf`,`.eot`,`.map`].includes(t)}async getOrReadFile(e){this.totalRequests++;try{let n=await t.stat(e),r=n.mtime.getTime(),i=this.generateETag(e,n);if(!this.shouldCache(e))return{content:await t.readFile(e,`utf-8`),contentType:this.getContentType(e),etag:i,cached:!1};let a=this.cache.get(e);if(a&&a.lastModified===r)return this.cacheHits++,{content:a.content,contentType:a.contentType,etag:a.etag,cached:!0};this.cacheMisses++;let o=this.isBinaryFile(e),s=await t.readFile(e,o?void 0:`utf-8`),c=this.getContentType(e);return this.addToCache(e,{content:s,contentType:c,lastModified:r,etag:i,size:n.size}),{content:s,contentType:c,etag:i,cached:!1}}catch{return null}}isBinaryFile(e){let t=n.extname(e).toLowerCase();return[`.png`,`.jpg`,`.jpeg`,`.gif`,`.ico`,`.webp`,`.avif`,`.woff`,`.woff2`,`.ttf`,`.eot`,`.pdf`,`.zip`,`.mp4`,`.mp3`,`.wav`,`.ogg`].includes(t)}addToCache(e,t){try{this.evictIfNeeded(t.size);let n={content:t.content,contentType:t.contentType,lastModified:t.lastModified,etag:t.etag,size:t.size};this.cache.set(e,n),this.currentMemoryUsage+=t.size}catch(e){console.warn(`[BrowserSyncFileCache] Error cacheando archivo:`,e)}}evictIfNeeded(e){for(;this.cache.size>=this.MAX_CACHE_SIZE;)this.evictOldest();for(;this.currentMemoryUsage+e>this.MAX_CACHE_MEMORY&&this.cache.size>0;)this.evictOldest()}evictOldest(){let e=``,t=1/0;for(let[n,r]of this.cache)r.lastModified<t&&(t=r.lastModified,e=n);if(e){let t=this.cache.get(e);t&&(this.currentMemoryUsage-=t.size,this.cache.delete(e))}}invalidateFile(e){let t=this.cache.get(e);t&&(this.currentMemoryUsage-=t.size,this.cache.delete(e))}getStats(){let e=this.totalRequests>0?Math.round(this.cacheHits/this.totalRequests*100):0;return{cacheHits:this.cacheHits,cacheMisses:this.cacheMisses,hitRate:e,totalRequests:this.totalRequests,cacheSize:this.cache.size,maxCacheSize:this.MAX_CACHE_SIZE,memoryUsage:this.currentMemoryUsage,maxMemoryUsage:this.MAX_CACHE_MEMORY}}clear(){this.cache.clear(),this.currentMemoryUsage=0,this.cacheHits=0,this.cacheMisses=0,this.totalRequests=0}terminate(){this.cleanupInterval&&(clearInterval(this.cleanupInterval),this.cleanupInterval=null),this.clear()}}const f=d.getInstance(),p=async()=>{let{default:e}=await import(`chalk`);return e};export async function browserSyncServer(){try{let e=null,t=i.AssetsOmit===`true`,d={server:`./`};if(i.proxyUrl){if(u.info(`🔍 Validando disponibilidad del servidor proxy: ${i.proxyUrl}`),await l(i.proxyUrl,5e3))u.info(`✅ Servidor proxy disponible`);else{let e=c(i.proxyUrl);u.warn(`⚠️ El servidor proxy no está disponible:`),u.warn(` Host: ${e.host}`),u.warn(` Puerto: ${e.port}`),u.warn(` Protocolo: ${e.protocol}`);let t=await s(`
2
+ ¿Desea continuar de todos modos? El modo proxy podría no funcionar correctamente. (s/n): `,3e4);t.toLowerCase().trim()!==`s`&&t.toLowerCase().trim()!==`si`&&(u.info(`🛑 Operación cancelada por el usuario.`),r.exit(0)),u.warn(`⚠️ Continuando con el servidor proxy no disponible...`)}d={proxy:i.proxyUrl}}let m=n.join(i.PATH_PROY||r.cwd(),`hrm`),h=r.cwd(),g=n.relative(h,m);e=a.create();let _=await o({port:3e3}),v=await o({port:4e3});return e.init({...d,files:[`${i.PATH_DIST}/**/*.css`],injectChanges:!0,open:!1,port:_,ui:{port:v},socket:{path:`/browser-sync/socket.io`},snippetOptions:{rule:{match:/<\/body>/i,fn:(e,t)=>`${e}${t}<script type="module" src="/__versa/initHRM.js"><\/script>`}},logLevel:`info`,logPrefix:`BS`,logConnections:!0,logFileChanges:!0,watchEvents:[`change`,`add`,`unlink`,`addDir`,`unlinkDir`],reloadDelay:500,reloadDebounce:500,reloadOnRestart:!0,notify:!0,watchOptions:{ignoreInitial:!0,ignored:[`node_modules`,`.git`]},middleware:[async function(e,i,a){if(i.setHeader(`Access-Control-Allow-Origin`,`*`),i.setHeader(`Access-Control-Allow-Methods`,`*`),i.setHeader(`Access-Control-Allow-Headers`,`*`),i.setHeader(`Access-Control-Allow-Credentials`,`true`),i.setHeader(`Access-Control-Max-Age`,`3600`),i.setHeader(`Cache-Control`,`no-cache, no-store, must-revalidate`),i.setHeader(`Pragma`,`no-cache`),i.setHeader(`Expires`,`0`),e.url===`/__versa/initHRM.js`){let e=n.join(g,`/initHRM.js`),t=await f.getOrReadFile(e);if(t)i.setHeader(`Content-Type`,t.contentType),i.setHeader(`ETag`,t.etag),i.end(t.content);else{let t=await p();u.error(t.red(`🚩 :Error al leer el archivo ${e}`)),i.statusCode=404,i.end(`// vueLoader.js not found`)}return}if(e.url.startsWith(`/__versa/`)){let t=n.join(g,e.url.replace(`/__versa/`,``)),r=await f.getOrReadFile(t);if(r)i.setHeader(`Content-Type`,r.contentType),i.setHeader(`ETag`,r.etag),i.end(r.content);else{let e=await p();u.error(e.red(`🚩 :Error al leer el archivo ${t}`)),i.statusCode=404,i.end(`// Not found`)}return}if(e.url.startsWith(`/node_modules/`)){let t=n.join(r.cwd(),e.url),a=await f.getOrReadFile(t);if(a)i.setHeader(`Content-Type`,a.contentType),i.setHeader(`ETag`,a.etag),i.end(a.content);else{let e=await p();u.error(e.red(`🚩 Error al leer el módulo ${t}`)),i.statusCode=404,i.end(`// Module not found`)}return}let o=e.url.match(/\.(js|css|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf|eot|map|webp|avif|json|html|xml|txt|pdf|zip|mp4|mp3|wav|ogg)(\?.*)?$/i);if(e.method===`GET`){let n=await p();o&&!t?u.info(n.white(`GET: ${e.url}`)):o||u.info(n.cyan(`GET: ${e.url}`))}else if(e.method===`POST`){let t=await p();u.info(t.blue(`POST: ${e.url}`))}else if(e.method===`PUT`){let t=await p();u.info(t.yellow(`PUT: ${e.url}`))}else if(e.method===`DELETE`){let t=await p();u.info(t.red(`DELETE: ${e.url}`))}else{let t=await p();u.info(t.gray(`${e.method}: ${e.url}`))}a()}]}),e}catch(e){u.error(`🚩 :Error al iniciar BrowserSync: ${e instanceof Error?e.message:String(e)}`),r.exit(1)}}export async function emitirCambios(e,t,r){let i=await p();u.info(i.green(`[HMR] Emitiendo cambios: ${t} ${r}\n`));let a=n.normalize(r).replace(/\\/g,`/`),o=n.basename(a,n.extname(a));e.sockets.emit(t,{action:t,filePath:r,normalizedPath:a,nameFile:o})}export const getBrowserSyncCacheStats=()=>f.getStats();export const clearBrowserSyncCache=()=>{f.clear()};export const invalidateBrowserSyncFile=e=>{f.invalidateFile(e)};
@@ -1,4 +1,4 @@
1
- import{readdir as e,rm as n,stat as r,unlink as i}from"node:fs/promises";import a from"node:path";import o,{env as s}from"node:process";import*as c from"chokidar";import{minimatch as l}from"minimatch";import{getOutputPath as u,initCompile as d,normalizeRuta as f}from"../compiler/compile.js";import{promptUser as p}from"../utils/promptUser.js";import{emitirCambios as m}from"./browserSync.js";import{logger as h}from"./logger.js";let g;async function _(){return g||=(await import(`chalk`)).default,g}class v{pendingChanges=new Map;debounceTimer=null;DEBOUNCE_DELAY=300;BATCH_SIZE=10;isProcessing=!1;browserSyncInstance=null;setBrowserSyncInstance(e){this.browserSyncInstance=e}addChange(e,n,r,i=!1){let a=f(e);this.pendingChanges.set(a,{filePath:a,action:n,timestamp:Date.now(),extensionAction:r,isAdditionalFile:i}),this.resetDebounceTimer()}resetDebounceTimer(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.processPendingChanges()},this.DEBOUNCE_DELAY)}async processPendingChanges(){if(this.isProcessing||this.pendingChanges.size===0)return;this.isProcessing=!0;let e=Array.from(this.pendingChanges.values());this.pendingChanges.clear();try{let n=e.filter(e=>e.action===`unlink`),r=e.filter(e=>e.action===`add`||e.action===`change`);n.length>0&&await this.processDeleteChanges(n),r.length>0&&await this.processCompileChanges(r)}catch(e){let n=await _();h.error(n.red(`🚩 Error procesando cambios en batch: ${e instanceof Error?e.message:String(e)}`))}finally{this.isProcessing=!1,this.pendingChanges.size>0&&this.resetDebounceTimer()}}async processDeleteChanges(e){for(let n of e)if(n.isAdditionalFile)h.info(`\n🗑️ Archivo adicional eliminado: ${n.filePath}`),m(this.browserSyncInstance,`reloadFull`,n.filePath);else{h.info(`\n🗑️ Eliminando archivo compilado: ${n.filePath}`);let e=await x(u(n.filePath));e&&(h.info(`Archivo eliminado: ${n.filePath}`),m(this.browserSyncInstance,`reloadFull`,n.filePath))}}async processCompileChanges(e){let n=e.filter(e=>e.isAdditionalFile),r=e.filter(e=>!e.isAdditionalFile);n.length>0&&await this.processAdditionalFiles(n),r.length>0&&await this.processCompilableFiles(r)}async processCompilableFiles(e){let n=await _();for(let r=0;r<e.length;r+=this.BATCH_SIZE){let i=e.slice(r,r+this.BATCH_SIZE);i.length>1&&h.info(n.cyan(`📦 Procesando batch de ${i.length} archivos compilables (${r+1}-${Math.min(r+this.BATCH_SIZE,e.length)} de ${e.length})`));let a=i.map(e=>this.compileFile(e));await Promise.allSettled(a)}e.length>1&&h.info(n.green(`✅ Batch completado: ${e.length} archivos compilados`))}async processAdditionalFiles(e){let n=await _();h.info(n.blue(`🔄 Recargando ${e.length} archivo(s) adicional(es) (sin compilación)`));for(let n of e)h.info(`📄 Archivo adicional modificado: ${n.filePath}`),m(this.browserSyncInstance,`reloadFull`,n.filePath)}async compileFile(e){try{let n=await d(e.filePath,!0,`watch`);if(n.success){let r=n.action||e.extensionAction;r=r===`extension`?e.extensionAction:r,m(this.browserSyncInstance,r||`reloadFull`,n.output)}}catch(n){let r=await _();h.error(r.red(`🚩 Error compilando ${e.filePath}: ${n instanceof Error?n.message:String(n)}`))}}getStats(){return{pendingChanges:this.pendingChanges.size,isProcessing:this.isProcessing,hasTimer:this.debounceTimer!==null}}}const y=new v;export async function cleanOutputDir(c,l=!0){try{if(!c)throw Error(`El directorio de salida no está definido`);if(l){let e=await r(c).catch(()=>null);if(!e||!e.isDirectory()){h.error(`🚩 El directorio de salida no existe o no es un directorio: ${c}`);return}try{if(s.yes===`false`){let e=await _(),n=await p(`
1
+ import{readdir as e,rm as r,stat as i,unlink as a}from"node:fs/promises";import o from"node:path";import s,{env as c}from"node:process";import*as l from"chokidar";import{minimatch as u}from"minimatch";import{getOutputPath as d,initCompile as f,normalizeRuta as p}from"../compiler/compile.js";import{promptUser as m}from"../utils/promptUser.js";import{emitirCambios as h}from"./browserSync.js";import{logger as g}from"./logger.js";let _;async function v(){return _||(_=(await import(`chalk`)).default),_}class y{pendingChanges=new Map;debounceTimer=null;DEBOUNCE_DELAY=100;BATCH_SIZE=10;isProcessing=!1;browserSyncInstance=null;setBrowserSyncInstance(e){this.browserSyncInstance=e}cleanup(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.pendingChanges.clear(),this.isProcessing=!1,this.browserSyncInstance=null}addChange(e,r,i,a=!1){let o=p(e);this.pendingChanges.set(o,{filePath:o,action:r,timestamp:Date.now(),extensionAction:i,isAdditionalFile:a}),this.resetDebounceTimer()}resetDebounceTimer(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.processPendingChanges()},this.DEBOUNCE_DELAY)}async processPendingChanges(){if(this.isProcessing||this.pendingChanges.size===0)return;this.isProcessing=!0;let e=Array.from(this.pendingChanges.values());this.pendingChanges.clear();try{let r=e.filter(e=>e.action===`unlink`),i=e.filter(e=>e.action===`add`||e.action===`change`);r.length>0&&await this.processDeleteChanges(r),i.length>0&&await this.processCompileChanges(i)}catch(e){let r=await v();g.error(r.red(`🚩 Error procesando cambios en batch: ${e instanceof Error?e.message:String(e)}`))}finally{this.isProcessing=!1,this.pendingChanges.size>0&&this.resetDebounceTimer()}}async processDeleteChanges(e){for(let r of e)r.isAdditionalFile?(g.info(`\n🗑️ Archivo adicional eliminado: ${r.filePath}`),h(this.browserSyncInstance,`reloadFull`,r.filePath)):(g.info(`\n🗑️ Eliminando archivo compilado: ${r.filePath}`),await S(d(r.filePath))&&(g.info(`Archivo eliminado: ${r.filePath}`),h(this.browserSyncInstance,`reloadFull`,r.filePath)))}async processCompileChanges(e){let r=e.filter(e=>e.isAdditionalFile),i=e.filter(e=>!e.isAdditionalFile);r.length>0&&await this.processAdditionalFiles(r),i.length>0&&await this.processCompilableFiles(i)}async processCompilableFiles(e){let r=await v();for(let i=0;i<e.length;i+=this.BATCH_SIZE){let a=e.slice(i,i+this.BATCH_SIZE);a.length>1&&g.info(r.cyan(`📦 Procesando batch de ${a.length} archivos compilables (${i+1}-${Math.min(i+this.BATCH_SIZE,e.length)} de ${e.length})`));let o=a.map(e=>this.compileFile(e));await Promise.allSettled(o)}e.length>1&&g.info(r.green(`✅ Batch completado: ${e.length} archivos compilados`))}async processAdditionalFiles(e){let r=await v();g.info(r.blue(`🔄 Recargando ${e.length} archivo(s) adicional(es) (sin compilación)`));for(let r of e)g.info(`📄 Archivo adicional modificado: ${r.filePath}`),h(this.browserSyncInstance,`reloadFull`,r.filePath)}async compileFile(e){try{let r=await f(e.filePath,!0,`watch`);if(r.success){let i=r.action||e.extensionAction;i=i===`extension`?e.extensionAction:i,h(this.browserSyncInstance,i||`reloadFull`,r.output)}}catch(r){let i=await v();g.error(i.red(`🚩 Error compilando ${e.filePath}: ${r instanceof Error?r.message:String(r)}`))}}getStats(){return{pendingChanges:this.pendingChanges.size,isProcessing:this.isProcessing,hasTimer:this.debounceTimer!==null}}}const b=new y;export async function cleanOutputDir(l,u=!0){try{if(!l)throw Error(`El directorio de salida no está definido`);if(u){let e=await i(l).catch(()=>null);if(!e||!e.isDirectory()){g.error(`🚩 El directorio de salida no existe o no es un directorio: ${l}`);return}try{if(c.yes===`false`&&(await m(`
2
2
 
3
- ¿Estás seguro deseas limpiar la carpeta `+e.yellow(c)+`? (s / N) : `);if(n.toLowerCase()!==`s`){h.info(`🛑 Compilación cancelada por el usuario.`),o.env.NODE_ENV!==`test`&&o.exit(0);return}}}catch(e){throw h.error(`Error en la entrada del usuario: ${e}`),o.env.NODE_ENV!==`test`&&o.exit(1),e}}let u=await _();h.info(`🗑️ Limpiando directorio de salida: ${u.yellow(c)}\n`);let d=await e(c);await Promise.all(d.map(async e=>{let o=a.join(c,e),s=await r(o);s.isDirectory()?await n(o,{recursive:!0}):await i(o)})),h.info(`✅ Directorio limpiado: ${c}`)}catch(e){h.error(`🚩 Error al limpiar directorio de salida: ${e instanceof Error?e.message:String(e)}`)}}async function x(e){try{return await i(e),!0}catch(n){return h.error(`🚩 Error eliminando archivo ${e}: ${n instanceof Error?n.message:String(n)}`),!1}}function S(e,n){let r=n.filter(e=>e!==void 0).find(n=>n.ext===e.split(`.`).pop())?.action;return r||`reloadFull`}function C(e,n){if(!n||n.length===0)return!1;let r=f(e);return n.some(e=>{let n=e.replace(/\\/g,`/`);return l(r,n)})}export async function initChokidar(e){try{if(!s.PATH_SOURCE)throw h.error(`Error: La variable de entorno PATH_SOURCE no está definida.`),o.env.NODE_ENV!==`test`&&o.exit(1),Error(`PATH_SOURCE no está definida`);let n=`${s.PATH_SOURCE}/**/*.js`,r=`${s.PATH_SOURCE}/**/*.vue`,i=`${s.PATH_SOURCE}/**/*.ts`,a=`${s.PATH_SOURCE}/**/*.cjs`,l=`${s.PATH_SOURCE}/**/*.mjs`,u=JSON.parse(s.aditionalWatch||`[]`),d=[n,r,i,a,l,...u],f={vue:`HRMVue`,js:`HRMHelper`,ts:`HRMHelper`,cjs:`HRMHelper`,mjs:`HRMHelper`},p=d.map(e=>{let n=e.split(`.`).pop();if(n)return{ext:n,action:f[n]||`reloadFull`}});if(p.length===0||p[0]===void 0)throw Error(`No se encontraron extensiones para observar`);let m=RegExp(`\\.(?!${p.filter(e=>e!==void 0).map(e=>e.ext).join(`$|`)}$).+$`);d=d.map(e=>e.replace(/\/\*\*\//g,`/`));let g=new Map;d.forEach(e=>{let n=e.substring(0,e.lastIndexOf(`/`));g.has(n)||g.set(n,[]),g.get(n).push(e)});let v=Array.from(g.keys()),b=c.watch(v,{persistent:!0,ignoreInitial:!0,ignored:m});return b.on(`ready`,async()=>{let e=await _();h.info(e.green(`👀 : Listo para observar \n${d.map(e=>`${e}`).join(`
4
- `)}\n`))}),y.setBrowserSyncInstance(e),b.on(`add`,async e=>{let n=C(e,u),r=S(e,p.filter(e=>e!==void 0));y.addChange(e,`add`,r,n)}),b.on(`change`,async e=>{let n=C(e,u),r=S(e,p.filter(e=>e!==void 0));y.addChange(e,`change`,r,n)}),b.on(`unlink`,async e=>{let n=S(e,p.filter(e=>e!==void 0)),r=C(e,u);y.addChange(e,`unlink`,n,r)}),b}catch(e){throw h.error(`🚩 :Error al iniciar watch: ${e instanceof Error?e.message:String(e)}`),o.env.NODE_ENV!==`test`&&o.exit(1),e}}
3
+ ¿Estás seguro deseas limpiar la carpeta `+(await v()).yellow(l)+`? (s / N) : `)).toLowerCase()!==`s`){g.info(`🛑 Compilación cancelada por el usuario.`),s.env.NODE_ENV!==`test`&&s.exit(0);return}}catch(e){throw g.error(`Error en la entrada del usuario: ${e}`),s.env.NODE_ENV!==`test`&&s.exit(1),e}}let d=await v();g.info(`🗑️ Limpiando directorio de salida: ${d.yellow(l)}\n`);let f=await e(l);await Promise.all(f.map(async e=>{let s=o.join(l,e);(await i(s)).isDirectory()?await r(s,{recursive:!0}):await a(s)})),g.info(`✅ Directorio limpiado: ${l}`)}catch(e){g.error(`🚩 Error al limpiar directorio de salida: ${e instanceof Error?e.message:String(e)}`)}}async function S(e){try{return await a(e),!0}catch(r){return g.error(`🚩 Error eliminando archivo ${e}: ${r instanceof Error?r.message:String(r)}`),!1}}function C(e,r){return r.filter(e=>e!==void 0).find(r=>r.ext===e.split(`.`).pop())?.action||`reloadFull`}function w(e,r){if(!r||r.length===0)return!1;let i=p(e);return r.some(e=>u(i,e.replace(/\\/g,`/`)))}export async function initChokidar(e){try{if(!c.PATH_SOURCE)throw g.error(`Error: La variable de entorno PATH_SOURCE no está definida.`),s.env.NODE_ENV!==`test`&&s.exit(1),Error(`PATH_SOURCE no está definida`);let r=`${c.PATH_SOURCE}/**/*.js`,i=`${c.PATH_SOURCE}/**/*.vue`,a=`${c.PATH_SOURCE}/**/*.ts`,o=`${c.PATH_SOURCE}/**/*.cjs`,u=`${c.PATH_SOURCE}/**/*.mjs`,d=JSON.parse(c.aditionalWatch||`[]`),f=[r,i,a,o,u,...d],p={vue:`HRMVue`,js:`HRMHelper`,ts:`HRMHelper`,cjs:`HRMHelper`,mjs:`HRMHelper`},m=f.map(e=>{let r=e.split(`.`).pop();if(r)return{ext:r,action:p[r]||`reloadFull`}});if(m.length===0||m[0]===void 0)throw Error(`No se encontraron extensiones para observar`);let h=RegExp(`\\.(?!${m.filter(e=>e!==void 0).map(e=>e.ext).join(`$|`)}$).+$`);f=f.map(e=>e.replace(/\/\*\*\//g,`/`));let _=new Map;f.forEach(e=>{let r=e.substring(0,e.lastIndexOf(`/`));_.has(r)||_.set(r,[]),_.get(r).push(e)});let y=Array.from(_.keys()),x=l.watch(y,{persistent:!0,ignoreInitial:!0,ignored:h});return x.on(`ready`,async()=>{let e=await v();g.info(e.green(`👀 : Listo para observar \n${f.map(e=>`${e}`).join(`
4
+ `)}\n`))}),b.setBrowserSyncInstance(e),x.on(`add`,async e=>{let r=w(e,d),i=C(e,m.filter(e=>e!==void 0));b.addChange(e,`add`,i,r)}),x.on(`change`,async e=>{let r=w(e,d),i=C(e,m.filter(e=>e!==void 0));b.addChange(e,`change`,i,r)}),x.on(`unlink`,async e=>{let r=C(e,m.filter(e=>e!==void 0)),i=w(e,d);b.addChange(e,`unlink`,r,i)}),x}catch(e){throw g.error(`🚩 :Error al iniciar watch: ${e instanceof Error?e.message:String(e)}`),s.env.NODE_ENV!==`test`&&s.exit(1),e}}export async function cleanupWatcher(e){try{console.log(`[FileWatcher] Limpiando recursos...`),b.cleanup(),e&&await e.close(),console.log(`[FileWatcher] Recursos limpiados correctamente`)}catch(e){console.error(`[FileWatcher] Error al limpiar recursos:`,e instanceof Error?e.message:String(e))}}
@@ -1,4 +1,4 @@
1
- import{normalize as e,relative as d,resolve as f}from"node:path";import*as p from"node:process";import{env as m}from"node:process";import{pathToFileURL as h}from"node:url";import{logger as g}from"./logger.js";const _=260,v=1024*1024,y=/^[a-zA-Z0-9.\-_/\\:@ ()[\]]+$/,b=[/\.\./,/[;&|`$]/,/\$\(/,/`.*`/,/\|\s*[a-zA-Z]/];export function validatePath(m){if(!m||typeof m!=`string`)return!1;if(m.length>260)return g.warn(`Ruta demasiado larga: ${m.length} caracteres`),!1;let h=e(m),_=f(p.cwd(),h),v=d(p.cwd(),_);return v.startsWith(`..`)||h.includes(`..`)?(g.error(`Detectado intento de path traversal: ${m}`),!1):y.test(m)?!0:(g.error(`Caracteres no permitidos en la ruta: ${m}`),!1)}export function validateCommand(e){if(!e||typeof e!=`string`)return!1;if(e.length>260)return g.warn(`Comando demasiado largo: ${e.length} caracteres`),!1;for(let d of b)if(d.test(e))return g.error(`Detectado patrón peligroso en comando: ${e}`),!1;let d=[`.exe`,`.cmd`,`.bat`,`.sh`,`.js`,`.ts`],f=d.some(d=>e.toLowerCase().includes(d)||e.startsWith(`./node_modules/.bin/`)||e.startsWith(`npx `));return f?!0:(g.error(`Comando no permitido: ${e}`),!1)}export function validateBundlers(e){if(!Array.isArray(e))return g.error(`bundlers debe ser un array`),!1;for(let d of e){if(!d||typeof d!=`object`)return g.error(`Cada entrada de bundler debe ser un objeto`),!1;if(!d.name||typeof d.name!=`string`)return g.error(`Cada entrada de bundler debe tener un nombre válido`),!1;if(!d.fileInput||typeof d.fileInput!=`string`)return g.error(`Cada entrada de bundler debe tener un fileInput válido`),!1;if(!validatePath(d.fileInput))return g.error(`Ruta de entrada no válida: ${d.fileInput}`),!1;if(!d.fileOutput||typeof d.fileOutput!=`string`)return g.error(`Cada entrada de bundler debe tener un fileOutput válido`),!1;if(!validatePath(d.fileOutput))return g.error(`Ruta de salida no válida: ${d.fileOutput}`),!1}return!0}export function validateConfigStructure(e){if(!e||typeof e!=`object`)return g.error(`La configuración debe ser un objeto`),!1;if(!e.compilerOptions||typeof e.compilerOptions!=`object`)return g.error(`compilerOptions es requerido y debe ser un objeto`),!1;if(!e.compilerOptions.pathsAlias||typeof e.compilerOptions.pathsAlias!=`object`)return g.error(`pathsAlias es requerido y debe ser un objeto`),!1;for(let[d,f]of Object.entries(e.compilerOptions.pathsAlias)){if(!Array.isArray(f))return g.error(`pathsAlias["${d}"] debe ser un array`),!1;for(let e of f){if(typeof e!=`string`)return g.error(`Todas las rutas en pathsAlias["${d}"] deben ser strings`),!1;if(!validatePath(e.replace(`/*`,``)))return g.error(`Ruta no válida en pathsAlias["${d}"]: ${e}`),!1}}if(e.compilerOptions.sourceRoot&&!validatePath(e.compilerOptions.sourceRoot)||e.compilerOptions.outDir&&!validatePath(e.compilerOptions.outDir))return!1;if(e.linter&&e.linter!==!1){if(!Array.isArray(e.linter))return g.error(`linter debe ser un array o false`),!1;for(let d of e.linter)if(!validateLinter(d))return!1}return!0}export function validateLinter(e){if(!e||typeof e!=`object`)return g.error(`Cada linter debe ser un objeto`),!1;if(!e.name||typeof e.name!=`string`)return g.error(`Linter debe tener un nombre válido`),!1;if(!e.bin||typeof e.bin!=`string`)return g.error(`Linter debe tener un bin válido`),!1;if(!validateCommand(e.bin))return!1;if(!e.configFile||typeof e.configFile!=`string`)return g.error(`Linter debe tener un configFile válido`),!1;if(!validatePath(e.configFile))return!1;if(e.paths&&!Array.isArray(e.paths))return g.error(`linter.paths debe ser un array`),!1;if(e.paths){for(let d of e.paths)if(typeof d!=`string`||!validatePath(d))return g.error(`Ruta de linter no válida: ${d}`),!1}return e.fix!==void 0&&typeof e.fix!=`boolean`?(g.error(`Linter fix debe ser un booleano`),!1):!0}export function validateConfigSize(e){try{let d=JSON.stringify(e);return d.length>1048576?(g.error(`Configuración demasiado grande: ${d.length} bytes`),!1):!0}catch(e){return g.error(`Error al serializar configuración (posible referencia circular):`,e),!1}}function x(e){return!e||typeof e!=`string`?``:e.endsWith(`/`)||e.endsWith(`\\`)?e.slice(0,-1):e}function S(e,d=`false`){try{return e==null?d:JSON.stringify(e)}catch(e){return g.warn(`Error al serializar objeto, usando valor por defecto:`,e),d}}export async function dynamicImport(e){return import(e)}export function withTimeout(e,d,f){let p=new Promise((e,p)=>setTimeout(()=>p(Error(f)),d));return Promise.race([e,p])}export async function readConfig(){try{if(!m.PATH_CONFIG_FILE)throw Error(`La variable de entorno PATH_CONFIG_FILE no está definida.`);if(!validatePath(m.PATH_CONFIG_FILE))throw Error(`Ruta de configuración no válida: ${m.PATH_CONFIG_FILE}`);let e=h(m.PATH_CONFIG_FILE).href,d=dynamicImport(e),f=await withTimeout(d,1e4,`Timeout al cargar configuración`);if(!f)throw Error(`No se pudo leer el archivo de configuración.`);let p=f.default||f;if(!validateConfigSize(p))throw Error(`Configuración demasiado grande o contiene referencias circulares.`);if(!validateConfigStructure(p))throw Error(`El archivo de configuración no tiene una estructura válida.`);let _={...p.compilerOptions.pathsAlias};for(let e in _){let d=_[e];if(d&&Array.isArray(d))for(let e=0;e<d.length;e++)typeof d[e]==`string`&&d[e]!==void 0&&(d[e]=d[e].replace(`/*`,``))}m.PATH_ALIAS=S(_,`{}`),m.tailwindcss=S(p?.tailwindConfig,`false`),m.proxyUrl=String(p?.proxyConfig?.proxyUrl||``),m.AssetsOmit=String(p?.proxyConfig?.assetsOmit||!1),m.linter=S(p?.linter,`false`),m.tsconfigFile=p?.tsconfig||`./tsconfig.json`;let v=x(p?.compilerOptions?.sourceRoot||`./src`),y=x(p?.compilerOptions?.outDir||`./dist`);if(!validatePath(v))throw Error(`sourceRoot no válido: ${v}`);if(!validatePath(y))throw Error(`outDir no válido: ${y}`);return m.PATH_SOURCE=v,m.PATH_DIST=y,m.aditionalWatch=S(p?.aditionalWatch,`[]`),m.bundlers=S(p?.bundlers,`false`),p.compilerOptions.sourceRoot||(m.tsConfig=S(p,`{}`)),g.info(`✅ Configuration loaded and validated successfully`),!0}catch(e){return g.error(`🚩 Error al leer el archivo ${m.PATH_CONFIG_FILE}: ${e}`,e),!1}}export async function initConfig(){try{let e=await dynamicImport(`fs`),d=await dynamicImport(`path`),f=d.resolve(p.cwd(),m.PATH_CONFIG_FILE||`versacompile.config.ts`);if(!validatePath(f))throw Error(`Ruta de configuración no válida: ${f}`);if(e.existsSync(f))return g.warn(`🚩 El archivo de configuración '${m.PATH_CONFIG_FILE}' ya existe.`),!0;let h=`// Archivo de configuración de VersaCompiler
1
+ import{normalize as e,relative as d,resolve as f}from"node:path";import*as p from"node:process";import{env as m}from"node:process";import{pathToFileURL as h}from"node:url";import{logger as g}from"./logger.js";const _=/^[a-zA-Z0-9.\-_/\\:@ ()[\]]+$/,v=[/\.\./,/[;&|`$]/,/\$\(/,/`.*`/,/\|\s*[a-zA-Z]/];export function validatePath(m){if(!m||typeof m!=`string`)return!1;if(m.length>260)return g.warn(`Ruta demasiado larga: ${m.length} caracteres`),!1;let h=e(m),v=f(p.cwd(),h);return d(p.cwd(),v).startsWith(`..`)||h.includes(`..`)?(g.error(`Detectado intento de path traversal: ${m}`),!1):_.test(m)?!0:(g.error(`Caracteres no permitidos en la ruta: ${m}`),!1)}export function validateCommand(e){if(!e||typeof e!=`string`)return!1;if(e.length>260)return g.warn(`Comando demasiado largo: ${e.length} caracteres`),!1;for(let d of v)if(d.test(e))return g.error(`Detectado patrón peligroso en comando: ${e}`),!1;return[`.exe`,`.cmd`,`.bat`,`.sh`,`.js`,`.ts`].some(d=>e.toLowerCase().includes(d)||e.startsWith(`./node_modules/.bin/`)||e.startsWith(`npx `))?!0:(g.error(`Comando no permitido: ${e}`),!1)}export function validateBundlers(e){if(!Array.isArray(e))return g.error(`bundlers debe ser un array`),!1;for(let d of e){if(!d||typeof d!=`object`)return g.error(`Cada entrada de bundler debe ser un objeto`),!1;if(!d.name||typeof d.name!=`string`)return g.error(`Cada entrada de bundler debe tener un nombre válido`),!1;if(!d.fileInput||typeof d.fileInput!=`string`)return g.error(`Cada entrada de bundler debe tener un fileInput válido`),!1;if(!validatePath(d.fileInput))return g.error(`Ruta de entrada no válida: ${d.fileInput}`),!1;if(!d.fileOutput||typeof d.fileOutput!=`string`)return g.error(`Cada entrada de bundler debe tener un fileOutput válido`),!1;if(!validatePath(d.fileOutput))return g.error(`Ruta de salida no válida: ${d.fileOutput}`),!1}return!0}export function validateConfigStructure(e){if(!e||typeof e!=`object`)return g.error(`La configuración debe ser un objeto`),!1;if(!e.compilerOptions||typeof e.compilerOptions!=`object`)return g.error(`compilerOptions es requerido y debe ser un objeto`),!1;if(!e.compilerOptions.pathsAlias||typeof e.compilerOptions.pathsAlias!=`object`)return g.error(`pathsAlias es requerido y debe ser un objeto`),!1;for(let[d,f]of Object.entries(e.compilerOptions.pathsAlias)){if(!Array.isArray(f))return g.error(`pathsAlias["${d}"] debe ser un array`),!1;for(let e of f){if(typeof e!=`string`)return g.error(`Todas las rutas en pathsAlias["${d}"] deben ser strings`),!1;if(!validatePath(e.replace(`/*`,``)))return g.error(`Ruta no válida en pathsAlias["${d}"]: ${e}`),!1}}if(e.compilerOptions.sourceRoot&&!validatePath(e.compilerOptions.sourceRoot)||e.compilerOptions.outDir&&!validatePath(e.compilerOptions.outDir))return!1;if(e.linter&&e.linter!==!1){if(!Array.isArray(e.linter))return g.error(`linter debe ser un array o false`),!1;for(let d of e.linter)if(!validateLinter(d))return!1}return!0}export function validateLinter(e){if(!e||typeof e!=`object`)return g.error(`Cada linter debe ser un objeto`),!1;if(!e.name||typeof e.name!=`string`)return g.error(`Linter debe tener un nombre válido`),!1;if(!e.bin||typeof e.bin!=`string`)return g.error(`Linter debe tener un bin válido`),!1;if(!validateCommand(e.bin))return!1;if(!e.configFile||typeof e.configFile!=`string`)return g.error(`Linter debe tener un configFile válido`),!1;if(!validatePath(e.configFile))return!1;if(e.paths&&!Array.isArray(e.paths))return g.error(`linter.paths debe ser un array`),!1;if(e.paths){for(let d of e.paths)if(typeof d!=`string`||!validatePath(d))return g.error(`Ruta de linter no válida: ${d}`),!1}return e.fix!==void 0&&typeof e.fix!=`boolean`?(g.error(`Linter fix debe ser un booleano`),!1):!0}export function validateConfigSize(e){try{let d=JSON.stringify(e);return d.length>1048576?(g.error(`Configuración demasiado grande: ${d.length} bytes`),!1):!0}catch(e){return g.error(`Error al serializar configuración (posible referencia circular):`,e),!1}}function y(e){return!e||typeof e!=`string`?``:e.endsWith(`/`)||e.endsWith(`\\`)?e.slice(0,-1):e}function b(e,d=`false`){try{return e==null?d:JSON.stringify(e)}catch(e){return g.warn(`Error al serializar objeto, usando valor por defecto:`,e),d}}export async function dynamicImport(e){return import(e)}export function withTimeout(e,d,f){let p=new Promise((e,p)=>setTimeout(()=>p(Error(f)),d));return Promise.race([e,p])}export async function readConfig(){try{if(!m.PATH_CONFIG_FILE)throw Error(`La variable de entorno PATH_CONFIG_FILE no está definida.`);if(!validatePath(m.PATH_CONFIG_FILE))throw Error(`Ruta de configuración no válida: ${m.PATH_CONFIG_FILE}`);let e=h(m.PATH_CONFIG_FILE).href,d=await withTimeout(dynamicImport(e),1e4,`Timeout al cargar configuración`);if(!d)throw Error(`No se pudo leer el archivo de configuración.`);let f=d.default||d;if(!validateConfigSize(f))throw Error(`Configuración demasiado grande o contiene referencias circulares.`);if(!validateConfigStructure(f))throw Error(`El archivo de configuración no tiene una estructura válida.`);let p={...f.compilerOptions.pathsAlias};for(let e in p){let d=p[e];if(d&&Array.isArray(d))for(let e=0;e<d.length;e++)typeof d[e]==`string`&&d[e]!==void 0&&(d[e]=d[e].replace(`/*`,``))}m.PATH_ALIAS=b(p,`{}`),m.tailwindcss=b(f?.tailwindConfig,`false`),m.proxyUrl=String(f?.proxyConfig?.proxyUrl||``),m.AssetsOmit=String(f?.proxyConfig?.assetsOmit||!1),m.linter=b(f?.linter,`false`),m.tsconfigFile=f?.tsconfig||`./tsconfig.json`;let _=y(f?.compilerOptions?.sourceRoot||`./src`),v=y(f?.compilerOptions?.outDir||`./dist`);if(!validatePath(_))throw Error(`sourceRoot no válido: ${_}`);if(!validatePath(v))throw Error(`outDir no válido: ${v}`);return m.PATH_SOURCE=_,m.PATH_DIST=v,m.aditionalWatch=b(f?.aditionalWatch,`[]`),m.bundlers=b(f?.bundlers,`false`),f.compilerOptions.sourceRoot||(m.tsConfig=b(f,`{}`)),g.info(`✅ Configuration loaded and validated successfully`),!0}catch(e){return g.error(`🚩 Error al leer el archivo ${m.PATH_CONFIG_FILE}: ${e}`,e),!1}}export async function initConfig(){try{let e=await dynamicImport(`fs`),d=(await dynamicImport(`path`)).resolve(p.cwd(),m.PATH_CONFIG_FILE||`versacompile.config.ts`);if(!validatePath(d))throw Error(`Ruta de configuración no válida: ${d}`);return e.existsSync(d)?(g.warn(`🚩 El archivo de configuración '${m.PATH_CONFIG_FILE}' ya existe.`),!0):(e.writeFileSync(d,`// Archivo de configuración de VersaCompiler
2
2
  export default {
3
3
  tsconfig: './tsconfig.json',
4
4
  compilerOptions: {
@@ -50,56 +50,4 @@ export default {
50
50
  }
51
51
  ],
52
52
  };
53
- `;return e.writeFileSync(f,`// Archivo de configuración de VersaCompiler
54
- export default {
55
- tsconfig: './tsconfig.json',
56
- compilerOptions: {
57
- sourceRoot: './src',
58
- outDir: './dist',
59
- pathsAlias: {
60
- '/dist/examples/*': ['src/*'],
61
- '/dist/public/*': ['public/*'],
62
- },
63
- },
64
- proxyConfig: {
65
- proxyUrl: '',
66
- assetsOmit: true,
67
- },
68
- aditionalWatch: ['./app/templates/**/*.twig', './app/templates/**/*.html'],
69
- // puede dejar en false o no agregarlo si no quiere que se ejecute el compilador de tailwind
70
- tailwindConfig: {
71
- bin: './node_modules/.bin/tailwindcss',
72
- input: './src/css/input.css',
73
- output: './public/css/output.css',
74
- },
75
- linter: [
76
- {
77
- name: 'eslint',
78
- bin: './node_modules/.bin/eslint',
79
- configFile: './.eslintrc.json',
80
- fix: false,
81
- paths: ['src/']
82
- },
83
- {
84
- name: 'oxlint',
85
- bin: './node_modules/.bin/oxlint',
86
- configFile: './.oxlintrc.json',
87
- fix: false,
88
- paths: ['src/']
89
- },
90
- ],
91
- // Configuración de bundlers
92
- bundlers: [
93
- {
94
- name: 'appLoader',
95
- fileInput: './public/module/appLoader.js',
96
- fileOutput: './public/module/appLoader.prod.js',
97
- },
98
- {
99
- name: 'mainApp',
100
- fileInput: './src/main.ts',
101
- fileOutput: './dist/main.bundle.js',
102
- }
103
- ],
104
- };
105
- `,`utf8`),g.info(`🚩 Archivo de configuración '${m.PATH_CONFIG_FILE}' creado correctamente.`),!0}catch(e){return g.error(`🚩 Error al crear el archivo de configuración: ${e}`,e),!1}}
53
+ `,`utf8`),g.info(`🚩 Archivo de configuración '${m.PATH_CONFIG_FILE}' creado correctamente.`),!0)}catch(e){return g.error(`🚩 Error al crear el archivo de configuración: ${e}`,e),!1}}
@@ -1 +1 @@
1
- import e,{readFileSync as t}from"node:fs";import{dirname as n,join as r,relative as i}from"node:path";import{cwd as a,env as o}from"node:process";import{logger as s}from"../servicios/logger.js";import{EXCLUDED_MODULES as c}from"./excluded-modules.js";function l(t,i){let a=n(i),c=i.split(`/`).pop()||``,l=c.replace(/\.[^/.]+$/,``),u=r(t,a);if(!e.existsSync(u))return i;try{let t=e.readdirSync(u),n=[`${l}.esm-browser.js`,`${l}.esm.all.js`,`${l}.esm.js`,`${l}.module.js`,`${l}.browser.js`,`${l}.web.js`,`${l}.umd.js`,`${l}.global.js`,`${l}.esm-browser.min.js`,`${l}.esm-browser.prod.js`,`${l}.esm.all.min.js`,`${l}.esm.min.js`,`${l}.module.min.js`,`${l}.browser.min.js`,`${l}.browser.prod.js`,`${l}.web.min.js`,`${l}.umd.min.js`,`${l}.global.min.js`,`${l}.min.js`,`${l}.runtime.esm-browser.js`,`${l}.runtime.esm-browser.min.js`,`${l}.runtime.esm-browser.prod.js`];for(let e of n)if(t.includes(e)){let t=r(a,e).replace(/\\/g,`/`);return t}let i=t.filter(e=>{let t=e.toLowerCase();return(t.includes(`.esm-browser.`)||t.includes(`.esm.`)||t.includes(`.module.`)||t.includes(`.browser.`)||t.includes(`.web.`)||t.includes(`.runtime.esm-browser.`))&&(e.endsWith(`.js`)||e.endsWith(`.mjs`))});if(i.length>0){let e=i.filter(e=>e.toLowerCase().includes(`.esm-browser.`)&&!e.toLowerCase().includes(`.runtime.`));if(e.length>0){let t=e.filter(e=>!e.toLowerCase().includes(`.prod.`)&&!e.toLowerCase().includes(`.min.`));if(t.length>0&&t[0]){let e=r(a,t[0]).replace(/\\/g,`/`);return e}let n=e.filter(e=>e.toLowerCase().includes(`.prod.`));if(n.length>0&&n[0]){let e=r(a,n[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión ESM-Browser producción encontrada: ${e}`),e}let i=e.filter(e=>e.toLowerCase().includes(`.min.`));if(i.length>0&&i[0]){let e=r(a,i[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión ESM-Browser minificada encontrada: ${e}`),e}if(e[0]){let t=r(a,e[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión ESM-Browser encontrada: ${t}`),t}}let t=i.filter(e=>(e.toLowerCase().includes(`.esm.`)||e.toLowerCase().includes(`.module.`))&&!e.toLowerCase().includes(`.min.`)&&!e.toLowerCase().includes(`.prod.`)&&!e.toLowerCase().includes(`.runtime.`));if(t.length>0&&t[0]){let e=r(a,t[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión ESM dev encontrada: ${e}`),e}let n=i.filter(e=>(e.toLowerCase().includes(`.min.`)||e.toLowerCase().includes(`.prod.`))&&!e.toLowerCase().includes(`.runtime.`));if(n.length>0){let e=n.filter(e=>e.toLowerCase().includes(`.esm.`)||e.toLowerCase().includes(`.module.`));if(e.length>0&&e[0]){let t=r(a,e[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión ESM minificada encontrada: ${t}`),t}if(n[0]){let e=r(a,n[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión minificada encontrada: ${e}`),e}}let c=i.filter(e=>e.toLowerCase().includes(`.runtime.esm-browser.`));if(c.length>0){let e=c.filter(e=>!e.toLowerCase().includes(`.prod.`)&&!e.toLowerCase().includes(`.min.`));if(e.length>0&&e[0]){let t=r(a,e[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión Runtime ESM-Browser dev encontrada: ${t}`),t}if(c[0]){let e=r(a,c[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión Runtime ESM-Browser encontrada: ${e}`),e}}if(i[0]){let e=r(a,i[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión browser encontrada: ${e}`),e}}}catch(e){o.VERBOSE===`true`&&s.warn(`No se pudo leer directorio ${u}:`,e instanceof Error?e.message:String(e))}return i}function u(i){try{let c=r(a(),`node_modules`,i),u;try{if(u=r(c,`package.json`),!e.existsSync(u))throw Error(`No se encontró package.json para ${i}`)}catch{return null}let d=JSON.parse(t(u,`utf-8`)),f=n(u),p=d.type===`module`,m=null;if(d.module)m=d.module;else if(d.exports){if(typeof d.exports==`string`)m=d.exports;else if(d.exports[`.`]){let e=d.exports[`.`];if(typeof e==`string`)m=e;else if(typeof e==`object`){let t=Object.keys(e),n=t.find(e=>e.includes(`browser`)&&(e.includes(`esm`)||e.includes(`module`)));m=n&&typeof e[n]==`string`?e[n]:(typeof e.import==`string`?e.import:null)||e.browser||(typeof e.default==`string`?e.default:null)}}}else d.browser?typeof d.browser==`string`?m=d.browser:typeof d.browser==`object`&&(m=d.browser[`.`]||d.browser[d.main]):d.main&&(m=d.main);m||=p?`index.js`:`index.cjs`,typeof m!=`string`&&(o.VERBOSE===`true`&&s.warn(`Entry point no es string para ${i}:`,m),m=p?`index.js`:`index.cjs`);let h=r(f,m),g=l(f,m);if(g&&g!==m&&(h=r(f,g)),p&&d.imports){let n=new Map;for(let[e,t]of Object.entries(d.imports))if(typeof t==`string`)n.set(e,r(f,t));else if(typeof t==`object`&&t){let i=t,a=i.browser||i.default||i.node;a&&n.set(e,r(f,a))}if(e.existsSync(h)){let e=t(h,`utf-8`),r=Array.from(e.matchAll(/from\s+['"]([#@][^'"]+)['"]/g));if(r.length>0){o.VERBOSE===`true`&&s.info(`Módulo ${i} usa imports privados:`,r.map(e=>e[1]));for(let e of r){let[,t]=e;n.has(t)||o.VERBOSE===`true`&&s.warn(`Import privado no resuelto: ${t} en ${i}`)}}}}if(!e.existsSync(h)){let t=[m,m.replace(`.js`,`.mjs`),m.replace(`.mjs`,`.js`),m.replace(`.js`,`.cjs`),`index.mjs`,`index.js`,`index.cjs`];for(let n of t){let t=r(f,n);if(e.existsSync(t)){h=t;break}}}return h}catch(e){return o.VERBOSE===`true`&&s.error(`Error resolviendo ${i}: ${e instanceof Error?e.message:String(e)}`),null}}function d(e,t){if(!e)return null;let n=e.indexOf(`node_modules`);if(n!==-1){let t=e.substring(n).replace(/\\/g,`/`);return`/`+t}let r=i(a(),e).replace(/\\/g,`/`);return r||=`.`,r.startsWith(`/`)||(r=`/`+r),r}export function getModulePath(e,t){return c.has(e)?null:d(u(e),t)}export function getModuleSubPath(i,l){if(c.has(i))return null;if(i.includes(`/`)){let[c,...u]=i.split(`/`),f=u.join(`/`);if(!c)return null;try{let i=r(a(),`node_modules`,c),o=r(i,`package.json`);if(!e.existsSync(o))return null;let s=JSON.parse(t(o,`utf-8`)),u=n(o);if(s.exports&&typeof s.exports==`object`){let e=`./${f}`,t=s.exports[e];if(t){if(typeof t==`string`)return d(r(u,t),l);if(typeof t==`object`){let e=t.import||t.default;if(typeof e==`string`)return d(r(u,e),l)}}}let p=r(u,f);if(e.existsSync(p))return d(p,l);let m=[`.mjs`,`.js`,`.cjs`];for(let t of m){let n=p+t;if(e.existsSync(n))return d(n,l)}}catch(e){o.VERBOSE===`true`&&s.error(`Error resolviendo subpath ${i}:`,e instanceof Error?e.message:String(e))}}return getModulePath(i,l)}
1
+ import e,{readFileSync as t}from"node:fs";import{dirname as n,join as r,relative as i}from"node:path";import{cwd as a,env as o}from"node:process";import{logger as s}from"../servicios/logger.js";import{EXCLUDED_MODULES as c}from"./excluded-modules.js";function l(t,i){let a=n(i),c=(i.split(`/`).pop()||``).replace(/\.[^/.]+$/,``),l=r(t,a);if(!e.existsSync(l))return i;try{let t=e.readdirSync(l),n=[`${c}.esm-browser.js`,`${c}.esm.all.js`,`${c}.esm.js`,`${c}.module.js`,`${c}.browser.js`,`${c}.web.js`,`${c}.umd.js`,`${c}.global.js`,`${c}.esm-browser.min.js`,`${c}.esm-browser.prod.js`,`${c}.esm.all.min.js`,`${c}.esm.min.js`,`${c}.module.min.js`,`${c}.browser.min.js`,`${c}.browser.prod.js`,`${c}.web.min.js`,`${c}.umd.min.js`,`${c}.global.min.js`,`${c}.min.js`,`${c}.runtime.esm-browser.js`,`${c}.runtime.esm-browser.min.js`,`${c}.runtime.esm-browser.prod.js`];for(let e of n)if(t.includes(e))return r(a,e).replace(/\\/g,`/`);let i=t.filter(e=>{let t=e.toLowerCase();return(t.includes(`.esm-browser.`)||t.includes(`.esm.`)||t.includes(`.module.`)||t.includes(`.browser.`)||t.includes(`.web.`)||t.includes(`.runtime.esm-browser.`))&&(e.endsWith(`.js`)||e.endsWith(`.mjs`))});if(i.length>0){let e=i.filter(e=>e.toLowerCase().includes(`.esm-browser.`)&&!e.toLowerCase().includes(`.runtime.`));if(e.length>0){let t=e.filter(e=>!e.toLowerCase().includes(`.prod.`)&&!e.toLowerCase().includes(`.min.`));if(t.length>0&&t[0])return r(a,t[0]).replace(/\\/g,`/`);let n=e.filter(e=>e.toLowerCase().includes(`.prod.`));if(n.length>0&&n[0]){let e=r(a,n[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión ESM-Browser producción encontrada: ${e}`),e}let i=e.filter(e=>e.toLowerCase().includes(`.min.`));if(i.length>0&&i[0]){let e=r(a,i[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión ESM-Browser minificada encontrada: ${e}`),e}if(e[0]){let t=r(a,e[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión ESM-Browser encontrada: ${t}`),t}}let t=i.filter(e=>(e.toLowerCase().includes(`.esm.`)||e.toLowerCase().includes(`.module.`))&&!e.toLowerCase().includes(`.min.`)&&!e.toLowerCase().includes(`.prod.`)&&!e.toLowerCase().includes(`.runtime.`));if(t.length>0&&t[0]){let e=r(a,t[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión ESM dev encontrada: ${e}`),e}let n=i.filter(e=>(e.toLowerCase().includes(`.min.`)||e.toLowerCase().includes(`.prod.`))&&!e.toLowerCase().includes(`.runtime.`));if(n.length>0){let e=n.filter(e=>e.toLowerCase().includes(`.esm.`)||e.toLowerCase().includes(`.module.`));if(e.length>0&&e[0]){let t=r(a,e[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión ESM minificada encontrada: ${t}`),t}if(n[0]){let e=r(a,n[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión minificada encontrada: ${e}`),e}}let c=i.filter(e=>e.toLowerCase().includes(`.runtime.esm-browser.`));if(c.length>0){let e=c.filter(e=>!e.toLowerCase().includes(`.prod.`)&&!e.toLowerCase().includes(`.min.`));if(e.length>0&&e[0]){let t=r(a,e[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión Runtime ESM-Browser dev encontrada: ${t}`),t}if(c[0]){let e=r(a,c[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión Runtime ESM-Browser encontrada: ${e}`),e}}if(i[0]){let e=r(a,i[0]).replace(/\\/g,`/`);return o.VERBOSE===`true`&&s.info(`Versión browser encontrada: ${e}`),e}}}catch(e){o.VERBOSE===`true`&&s.warn(`No se pudo leer directorio ${l}:`,e instanceof Error?e.message:String(e))}return i}function u(i){try{let c=r(a(),`node_modules`,i),u;try{if(u=r(c,`package.json`),!e.existsSync(u))throw Error(`No se encontró package.json para ${i}`)}catch{return null}let d=JSON.parse(t(u,`utf-8`)),f=n(u),p=d.type===`module`,m=null;if(d.module)m=d.module;else if(d.exports){if(typeof d.exports==`string`)m=d.exports;else if(d.exports[`.`]){let e=d.exports[`.`];if(typeof e==`string`)m=e;else if(typeof e==`object`){let t=Object.keys(e).find(e=>e.includes(`browser`)&&(e.includes(`esm`)||e.includes(`module`)));m=t&&typeof e[t]==`string`?e[t]:(typeof e.import==`string`?e.import:null)||e.browser||(typeof e.default==`string`?e.default:null)}}}else d.browser?typeof d.browser==`string`?m=d.browser:typeof d.browser==`object`&&(m=d.browser[`.`]||d.browser[d.main]):d.main&&(m=d.main);m||(m=p?`index.js`:`index.cjs`),typeof m!=`string`&&(o.VERBOSE===`true`&&s.warn(`Entry point no es string para ${i}:`,m),m=p?`index.js`:`index.cjs`);let h=r(f,m),g=l(f,m);if(g&&g!==m&&(h=r(f,g)),p&&d.imports){let n=new Map;for(let[e,t]of Object.entries(d.imports))if(typeof t==`string`)n.set(e,r(f,t));else if(typeof t==`object`&&t){let i=t,a=i.browser||i.default||i.node;a&&n.set(e,r(f,a))}if(e.existsSync(h)){let e=t(h,`utf-8`),r=Array.from(e.matchAll(/from\s+['"]([#@][^'"]+)['"]/g));if(r.length>0){o.VERBOSE===`true`&&s.info(`Módulo ${i} usa imports privados:`,r.map(e=>e[1]));for(let e of r){let[,t]=e;n.has(t)||o.VERBOSE===`true`&&s.warn(`Import privado no resuelto: ${t} en ${i}`)}}}}if(!e.existsSync(h)){let t=[m,m.replace(`.js`,`.mjs`),m.replace(`.mjs`,`.js`),m.replace(`.js`,`.cjs`),`index.mjs`,`index.js`,`index.cjs`];for(let n of t){let t=r(f,n);if(e.existsSync(t)){h=t;break}}}return h}catch(e){return o.VERBOSE===`true`&&s.error(`Error resolviendo ${i}: ${e instanceof Error?e.message:String(e)}`),null}}function d(e,t){if(!e)return null;let n=e.indexOf(`node_modules`);if(n!==-1)return`/`+e.substring(n).replace(/\\/g,`/`);let r=i(a(),e).replace(/\\/g,`/`);return r||(r=`.`),r.startsWith(`/`)||(r=`/`+r),r}export function getModulePath(e,t){return c.has(e)?null:d(u(e),t)}export function getModuleSubPath(i,l){if(c.has(i))return null;if(i.includes(`/`)){let[c,...u]=i.split(`/`),f=u.join(`/`);if(!c)return null;try{let i=r(r(a(),`node_modules`,c),`package.json`);if(!e.existsSync(i))return null;let o=JSON.parse(t(i,`utf-8`)),s=n(i);if(o.exports&&typeof o.exports==`object`){let e=`./${f}`,t=o.exports[e];if(t){if(typeof t==`string`)return d(r(s,t),l);if(typeof t==`object`){let e=t.import||t.default;if(typeof e==`string`)return d(r(s,e),l)}}}let u=r(s,f);if(e.existsSync(u))return d(u,l);for(let t of[`.mjs`,`.js`,`.cjs`]){let n=u+t;if(e.existsSync(n))return d(n,l)}}catch(e){o.VERBOSE===`true`&&s.error(`Error resolviendo subpath ${i}:`,e instanceof Error?e.message:String(e))}}return getModulePath(i,l)}