/** * Script para agregar assertDataContract a todos los componentes de Terra */ import { readFileSync, writeFileSync, existsSync } from 'node:fs'; import { resolve, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // Archivos a procesar (rutas relativas al proyecto) const files = [ 'accordion/accordion.svelte.ts', 'alert-dialog/alert-dialog.svelte.ts', 'aspect-ratio/aspect-ratio.svelte.ts', 'avatar/avatar.svelte.ts', 'calendar/calendar.svelte.ts', 'collapsible/collapsible.svelte.ts', 'color-picker/color-picker.svelte.ts', 'command/command.svelte.ts', 'date-field/date-field.svelte.ts', 'date-picker/date-picker.svelte.ts', 'date-range-field/date-range-field.svelte.ts', 'date-range-picker/date-range-picker.svelte.ts', 'dialog/dialog.svelte.ts', 'drawer/drawer.svelte.ts', 'dropdown-menu/dropdown-menu.svelte.ts', 'editable/editable.svelte.ts', 'file-upload/file-upload.svelte.ts', 'form/form.svelte.ts', 'link-preview/link-preview.svelte.ts', 'menu/menu.svelte.ts', 'menubar/menubar.svelte.ts', 'meter/meter.svelte.ts', 'number-field/number-field.svelte.ts', 'pagination/pagination.svelte.ts', 'pin-input/pin-input.svelte.ts', 'popover/popover.svelte.ts', 'progress/progress.svelte.ts', 'range-calendar/range-calendar.svelte.ts', 'rating-group/rating-group.svelte.ts', 'scroll-area/scroll-area.svelte.ts', 'select/select.svelte.ts', 'separator/separator.svelte.ts', 'slider/slider.svelte.ts', 'spinner/spinner.svelte.ts', 'splitter/splitter.svelte.ts', 'stepper/stepper.svelte.ts', 'tabs/tabs.svelte.ts', 'tags-input/tags-input.svelte.ts', 'thumb/thumb.svelte.ts', 'time-field/time-field.svelte.ts', 'time-range-field/time-range-field.svelte.ts', 'toggle-group/toggle-group.svelte.ts', 'toolbar/toolbar.svelte.ts', 'tooltip/tooltip.svelte.ts', 'virtual-list/virtual-list.svelte.ts' ].map((f) => resolve(__dirname, '../src/uix/terra', f)); let modified = 0; let skipped = 0; let notFound = 0; for (const file of files) { try { if (!existsSync(file)) { notFound++; continue; } let content = readFileSync(file, 'utf-8'); const original = content; // Ya tiene el import if (content.includes('assertDataContract')) { skipped++; continue; } // Buscar la última línea de import desde utils/attrs o ../utils/attrs const attrsImportMatch = content.match(/from ["'].*?\/utils\/attrs["']/); if (!attrsImportMatch) { console.log(`⚠️ No se encontró import de attrs en: ${file}`); skipped++; continue; } const lastAttrsLineEnd = content.indexOf( '\n', attrsImportMatch.index + attrsImportMatch[0].length ); if (lastAttrsLineEnd === -1) { skipped++; continue; } // Insertar el nuevo import después del import de attrs const importStatement = `\nimport { assertDataContract } from "$terra/utils/contracts";`; content = content.slice(0, lastAttrsLineEnd + 1) + importStatement + content.slice(lastAttrsLineEnd + 1); if (content !== original) { writeFileSync(file, content, 'utf-8'); modified++; const componentName = file.replace(/.*src\\uix\\terra\\/, '').replace(/\.svelte\.ts$/, ''); console.log(`✅ ${componentName}`); } } catch (e) { console.log(`❌ Error procesando ${file}:`, e.message); } } console.log(`\n📊 Resumen:`); console.log(` Modificados: ${modified}`); console.log(` Skippeados (ya tenían import): ${skipped}`); console.log(` No encontrados: ${notFound}`); console.log(` Total procesados: ${modified + skipped + notFound}`);