You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.7 KiB
93 lines
2.7 KiB
/**
|
|
* 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}`);
|