/** * Script para eliminar todos los campos privados con # de los componentes Terra * Motivo: Los campos marcados con # se exponen vía data-* attrs, creando ambigüedad */ import { readFileSync, writeFileSync, existsSync, readdirSync } from 'node:fs'; import { resolve, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const terraDir = resolve(__dirname, '../src/uix/terra'); // Obtener todos los archivos .svelte.ts y .ts recursivamente function getAllTsFiles(dir: string, baseDir = dir): string[] { const files: string[] = []; const entries = readdirSync(dir, { withFileTypes: true }); for (const entry of entries) { const fullPath = resolve(dir, entry.name); if (entry.isDirectory()) { // Skip node_modules and similar if (!entry.name.startsWith('.') && entry.name !== 'node_modules') { files.push(...getAllTsFiles(fullPath, baseDir)); } } else if (entry.isFile() && (entry.name.endsWith('.svelte.ts') || entry.name.endsWith('.ts'))) { files.push(fullPath); } } return files; } let modified = 0; let skipped = 0; let errors = 0; const files = getAllTsFiles(terraDir); for (const file of files) { try { let content = readFileSync(file, 'utf-8'); const original = content; // Skip NAMING_CONVENTIONS.md and other non-code files if (file.includes('NAMING_CONVENTIONS.md') || file.includes('README.md')) { skipped++; continue; } // 1. Reemplazar declaraciones de campos privados con readonly // readonly #foo => readonly foo content = content.replace(/readonly\s+#(\w+)/g, 'readonly $1'); // 2. Reemplazar declaraciones de campos privados sin readonly // #foo = $state(...) => foo = $state(...) content = content.replace(/^(\s*)#(\w+)\s*=/gm, '$1$2 ='); // 3. Reemplazar uso de campos privados // this.#foo => this.foo content = content.replace(/this\.#(\w+)/g, 'this.$1'); // 4. Reemplazar métodos privados (opcional - convertir a públicos) // #methodName() => methodName() // Solo si no es seguido por "private" keyword (que no usamos) content = content.replace(/(\s+)#/g, '$1'); if (content !== original) { writeFileSync(file, content, 'utf-8'); modified++; const relativePath = file.replace(/.*src\\uix\\terra\\/, '').replace(/\.svelte\.ts$/, '').replace(/\.ts$/, ''); console.log(`✅ ${relativePath}`); } else { skipped++; } } catch (e: any) { errors++; console.log(`❌ Error procesando ${file}:`, e.message); } } console.log(`\n📊 Resumen:`); console.log(` Modificados: ${modified}`); console.log(` Skippeados (sin cambios): ${skipped}`); console.log(` Errores: ${errors}`); console.log(` Total procesados: ${modified + skipped + errors}`);