El problema
Cada nueva feature en el equipo empezaba con los mismos 20 minutos de copiar y pegar una ruta, un componente, un archivo de test y una story de Storybook desde una feature existente, para luego renombrar todo a mano. Quería un CLI que generara todo eso correctamente en un solo comando.
Rol e impacto
- Proyecto individual, herramientas de desarrollo.
- Redujo el tiempo de scaffolding de una nueva feature de ~20 minutos a menos de 30 segundos.
- Adoptado por todo el equipo de frontend, usado para generar más de 40 módulos de feature.
- Eliminó toda una clase de bugs por copy-paste de archivos renombrados a medias.
Decisiones técnicas y desafíos
Los templates de texto plano quedan desactualizados en cuanto cambian las convenciones del starter, porque nadie se acuerda de actualizar el generador junto con el código. Comparé mantener templates estáticos contra generar los templates directamente a partir de un módulo de feature "de referencia" ya existente en el repo.
Elegí generar los templates a partir de un módulo de referencia vivo con tokens de reemplazo, porque actualizar las convenciones del starter una sola vez, en código real, mantiene el generador correcto automáticamente, en vez de depender de que alguien recuerde actualizar un archivo de template separado.
Un generador que sobrescribe archivos a ciegas es peligroso en cuanto alguien lo vuelve a correr sobre una carpeta que ya empezó a editar. Evalué sobrescribir siempre con una advertencia contra mostrar un preview de diff en modo dry-run antes de cualquier escritura.
Terminé exigiendo un preview de diff en dry-run por defecto, con un flag
explícito --write para aplicar los cambios, ya que las sobrescrituras
silenciosas eran el modo de fallo más peligroso para una herramienta pensada para
ahorrar tiempo, no para crear incidentes.
Stack detallado
| Capa | Tecnología | Por qué |
|---|---|---|
| CLI | Node.js, Commander.js | Parsing de comandos y subcomandos simple y bien documentado |
| Templating | Handlebars | Templates legibles con helpers para casing y pluralización |
| Testing | Vitest | Snapshot tests sobre el output generado para cada template |
Galería
Qué haría diferente
Agregaría un modo interactivo para elegir qué piezas generar (ruta, tests, stories) en vez de generar siempre el set completo. Ahora mismo, una feature que no necesita una story de Storybook igual recibe una, que alguien después tiene que acordarse de borrar.