13 puntos por beenzinozino 2024-11-14 | 2 comentarios | Compartir por WhatsApp

Hola, desarrollé un formateador de C, C++ y Java con Clang para entornos Node.js. Este proyecto es una nueva iniciativa basada en el paquete clang-format de Angular, que ya no recibe mantenimiento (está deprecado).

Hace uno o dos meses ya había publicado algo parecido, pero como la estabilidad del paquete mejoró mucho y se agregaron nuevas funciones, decidí volver a escribir sobre él.

Actualmente, gracias al interés de muchas personas y a que varios usuarios del paquete legado se han migrado, ya superamos las 10,000 descargas semanales. Muchas gracias de verdad.

Además, este paquete alcanzó cobertura total de pruebas, y en Node.js Core ya hay un PR para cambiar del proyecto clang-format original de Angular a este paquete, así que creo que pueden usarlo con confianza en cuanto a estabilidad. (Claro, todavía puede haber cosas que se me hayan pasado...)


Este paquete, basado en clang-format de Clang —famoso como compilador de C de LLVM—, se encarga del formateo de código en C, C++ y Java. Podría decirse que cumple un rol similar al de Prettier, uno de los paquetes más conocidos en el entorno Node.js.

Sin embargo, como Prettier no soporta el formateo de C, C++ ni Java, muchas veces se recurre a clang-format para manejar el estilo en esos lenguajes.

clang-format en el entorno Node.js es especialmente útil cuando se necesita escribir tanto código JavaScript como código C/C++, como sucede en el desarrollo de Node.js Core. En el caso del clang-format anterior, era necesario instalar dependencias adicionales para usar el paquete, pero con el paquete actual eso ya no hace falta.

Además, el paquete clang-format anterior tenía varios puntos complicados al integrarse en workflows con Node.js y npm, como en CI, pero con este paquete basta con descargarlo desde npm y configurar un script, lo que ofrece muchas ventajas en entornos de CI.


Adicionalmente, con la actualización a la versión 1.2.0 se agregaron nuevas funciones. El cambio principal es la incorporación del paquete git-clang-format.

Pensemos en el caso de un proyecto en C/C++ donde surge la necesidad de aplicar formateo de código e introducir herramientas como clang-format.

En proyectos pequeños, puede que no haya mayor problema en rehacer el formateo de todo el código de una vez y hacer un solo commit. Pero en proyectos grandes, introducir formateo implica tener que rehacer masivamente el estilo del código existente, lo que puede ensuciar el seguimiento del historial de commits.

Ahora bien, si un desarrollador modifica solo 100 líneas de un archivo de 1000 líneas, ¿qué pasaría si al hacer commit se revisara el formateo únicamente de esas 100 líneas modificadas? Primero, como solo habría que aplicar formateo a esas 100 líneas, ya no sería necesario rehacer las 1000 líneas completas, lo que facilitaría seguir el historial de commits. Segundo, a medida que se sigan haciendo commits durante el desarrollo, cada vez habrá más código con formateo aplicado, por lo que con el tiempo el estilo del código irá ganando consistencia.

Para eso se usa el paquete git-clang-format. Así como lint-staged mejora la velocidad de CI revisando solo los archivos en staged, esto va un paso más allá y permite aplicar validación de formateo únicamente a las líneas modificadas dentro de los archivos cambiados. Como esta herramienta también la proporciona LLVM por defecto, la envolví en un paquete y la publiqué.

En la documentación oficial dejé explicado el uso exacto, así que agradecería mucho su interés. (Aunque la documentación oficial está en inglés) Si tienen dudas o alguna otra opinión, se los agradeceré mucho si la dejan en los comentarios. Gracias por leer este texto tan largo.

Documentación oficial: https://clang-format-node.lumir.page
Repositorio: https://github.com/lumirlumir/npm-clang-format-node

2 comentarios

 
rumbarum 2024-11-18

¡Apoyo el desarrollo de código abierto!

 
beenzinozino 2024-11-18

¡¡Gracias!!🙇‍♂️