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.
svelte-kit-vice/scripts/remove-private-fields.ts

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}`);

Powered by TurnKey Linux.