El patrón Memento permite capturar y restaurar un estado completo sin exponer su estructura interna.
1. El Problema de Partida
scripts/migrate-posts.js reescribe varios _category.json a la vez al reorganizar categorías (ej. dividir design-patterns en subcarpetas). Si la migración falla a mitad de camino, no hay forma de volver al estado exacto de los JSON antes de empezar, más allá de confiar en git checkout manual.
2. La Solución Memento
// src/lib/migration/CategorySnapshot.js
import fs from 'fs';
class CategoryMemento {
#files;
constructor(files) { this.#files = files; } // Copia inmutable, privada
restore() {
for (const [path, content] of this.#files) fs.writeFileSync(path, content);
}
}
export class CategoryOriginator {
save(categoryPaths) {
const snapshot = categoryPaths.map((p) => [p, fs.readFileSync(p, 'utf-8')]);
return new CategoryMemento(snapshot);
}
}3. Uso
// scripts/migrate-posts.js
import { CategoryOriginator } from '@/lib/migration/CategorySnapshot';
const originator = new CategoryOriginator();
const checkpoint = originator.save([
'content/knowledge/es/patrones-de-diseno/_category.json',
'content/knowledge/es/arquitectura-de-software/_category.json',
]);
try {
reorganizeCategories(); // Operación riesgosa que reescribe los JSON
} catch (err) {
console.error('Migración fallida, restaurando snapshot...', err);
checkpoint.restore(); // Vuelve exactamente al contenido original
}4. Ventajas
- El script de migración no conoce el formato interno del snapshot, solo llama a
save()yrestore(). - Rollback exacto: restaura byte a byte el contenido original, sin depender de comandos git externos.
- Reutilizable para cualquier operación destructiva sobre archivos de configuración del proyecto.