Guía de contribución
¡Gracias por tu interés en contribuir a este proyecto! Esta guía te ayudará a entender el proceso de contribución y te proporcionará las pautas necesarias para que tu aportación sea efectiva y valiosa.
Filosofía del proyecto
Este proyecto se ha creado para facilitar el desarrollo de bibliotecas TypeScript profesionales, proporcionando una estructura base sólida, herramientas modernas y flujos de trabajo optimizados. Nos regimos por los siguientes principios:
- Simplicidad: Buscamos soluciones simples pero completas, evitando la complejidad innecesaria.
- Calidad: Mantenemos altos estándares de código, pruebas exhaustivas y documentación clara.
- Modularidad: Diseñamos cada parte para que sea independiente pero bien integrada con el resto.
- Accesibilidad: Facilitamos el uso tanto para principiantes como para desarrolladores experimentados.
- Comunidad: Valoramos y fomentamos la colaboración y el intercambio de ideas.
Proceso de contribución paso a paso
1. Preparación inicial
Antes de empezar a contribuir, asegúrate de:
- Revisar los issues existentes: Comprueba si alguien ya ha reportado el mismo problema o está trabajando en la misma mejora.
- Discutir cambios mayores: Para contribuciones significativas, abre primero un issue para discutir tu propuesta.
- Configurar tu entorno: Asegúrate de tener Node.js (versión LTS o superior) y git instalados.
2. Configuración del repositorio
Para empezar a trabajar en el proyecto:
Haz un fork del repositorio a tu cuenta de GitHub.
Clona tu fork localmente:
bashgit clone https://github.com/tu-usuario/typescript-library-template-pro.git cd typescript-library-template-pro
Añade el repositorio original como remoto:
bashgit remote add upstream https://github.com/fvena/typescript-library-template-pro.git
Instala las dependencias:
bashnpm install
3. Creación de una rama para tus cambios
Siempre crea una nueva rama para tus contribuciones:
git checkout -b tipo/descripcion-breve
Donde tipo
puede ser:
feature
: Para nuevas característicasfix
: Para correcciones de erroresdocs
: Para cambios en la documentaciónrefactor
: Para refactorizaciones que no añaden funcionalidades ni corrigen errorestest
: Para añadir o modificar pruebaschore
: Para tareas de mantenimiento
Por ejemplo:
git checkout -b feature/soporte-react
4. Desarrollo de tu contribución
Durante el desarrollo, ten en cuenta estas recomendaciones:
Sigue las convenciones de código: Usa el estilo y las prácticas del proyecto.
Escribe pruebas: Añade pruebas para las nuevas funcionalidades o correcciones.
Haz commits frecuentes: Realiza commits pequeños y específicos.
Usa mensajes de commit descriptivos: Sigue el formato de Conventional Commits:
tipo(alcance): descripción corta Cuerpo del mensaje con más detalles (opcional)
Mantén tu rama actualizada: Regularmente sincroniza tu rama con los últimos cambios del repositorio principal:
bashgit fetch upstream git rebase upstream/main
5. Verificación de tu contribución
Antes de enviar tu Pull Request, asegúrate de que todo esté correcto:
Ejecuta las pruebas:
bashnpm test
Verifica el linting:
bashnpm run lint
Comprueba los tipos:
bashnpm run typecheck
Asegúrate de que la compilación funciona:
bashnpm run build
Revisa la documentación si has añadido o modificado características.
6. Envío de tu Pull Request
Cuando estés listo para enviar tus cambios:
Haz push de tu rama a tu fork:
bashgit push origin tu-rama
Crea un Pull Request desde tu rama a la rama
main
del repositorio original.Completa la plantilla de PR con toda la información necesaria.
Responde a los comentarios durante la revisión de código y realiza los cambios solicitados si es necesario.
7. Después de la fusión
Una vez que tu PR sea fusionado:
Actualiza tu fork con los últimos cambios:
bashgit checkout main git pull upstream main git push origin main
Elimina tu rama local y remota:
bashgit branch -d tu-rama git push origin --delete tu-rama
Estándares de código
Estilo de código
Seguimos un conjunto específico de reglas de estilo para mantener la coherencia en todo el proyecto:
- Indentación: Usamos 2 espacios para la indentación.
- Longitud máxima de línea: 100 caracteres.
- Comillas: Preferimos comillas simples ('') para strings.
- Punto y coma: Son obligatorios al final de cada declaración.
- Espaciado: Un espacio después de las palabras clave y antes de los paréntesis en las estructuras de control.
La configuración de ESLint y Prettier en el proyecto ayuda a mantener estos estándares automáticamente.
Nomenclatura
Seguimos estas convenciones de nomenclatura:
Variables y funciones: camelCase
typescriptconst userId = 123; function getUserData() { /* ... */ }
Clases e interfaces: PascalCase
typescriptclass UserRepository { /* ... */ } interface ApiResponse { /* ... */ }
Constantes: UPPER_SNAKE_CASE
typescriptconst MAX_RETRY_COUNT = 3;
Tipos genéricos: Prefijo T
typescriptfunction identity<T>(value: T): T { return value; }
Archivos: kebab-case para nombre de archivos
string-utils.ts api-client.ts
Documentación y comentarios
Documentamos nuestro código siguiendo estas pautas:
Documentación de API: Usamos JSDoc para documentar interfaces públicas.
typescript/** * Formatea una fecha según el patrón especificado. * * @param date - La fecha a formatear * @param format - El formato deseado (por defecto: 'YYYY-MM-DD') * @returns La fecha formateada como string * * @example * ```ts * formatDate(new Date(2023, 0, 1), 'DD/MM/YYYY') * // Resultado: '01/01/2023' * ``` */ function formatDate(date: Date, format = "YYYY-MM-DD"): string { /* ... */ }
Comentarios de implementación: Para código complejo, añadimos comentarios que explican el "por qué" y no solo el "qué".
typescript// Usamos una expresión regular aquí en lugar de 'split' // porque necesitamos preservar los delimitadores const matches = text.match(/([a-z]+)/gi);
TODOs: Para mejoras futuras o trabajo pendiente, usamos comentarios
TODO
con una referencia a un issue cuando es posible.typescript// TODO: Mejorar el rendimiento de esta función (#123) function expensiveOperation() { /* ... */ }
Buenas prácticas
Código
Inmutabilidad: Preferimos estructuras de datos inmutables y funciones puras.
typescript// Bien const newArray = originalArray.map((item) => transformItem(item)); // Evitar originalArray.forEach((item, index) => { originalArray[index] = transformItem(item); });
Manejo de errores: Usa excepciones para errores excepcionales y resultados/opcionales para casos esperados.
typescript// Para errores excepcionales function readConfigFile(path: string): Config { if (!fileExists(path)) { throw new Error(`Config file not found: ${path}`); } // ... } // Para casos esperados function findUser(id: string): User | null { return users.find((user) => user.id === id) || null; }
Evita any: Usa tipos específicos o
unknown
si el tipo no está claro.typescript// Evitar function process(data: any): any { // ... } // Preferir function process<T>(data: T): Result<T> { // ... }
Testing
Unidades de prueba aisladas: Cada unidad de prueba debe ser independiente.
Nombrado descriptivo: Los nombres de las pruebas deben describir el comportamiento esperado.
typescript// Bien test("debería retornar null cuando el usuario no existe", () => { // ... }); // Evitar test("findUser caso 2", () => { // ... });
Estructura AAA: Arrange-Act-Assert para organizar cada caso de prueba.
typescripttest("debería filtrar usuarios inactivos", () => { // Arrange const users = [ { id: 1, active: true }, { id: 2, active: false }, { id: 3, active: true }, ]; // Act const activeUsers = filterActiveUsers(users); // Assert expect(activeUsers).toHaveLength(2); expect(activeUsers[0].id).toBe(1); expect(activeUsers[1].id).toBe(3); });
Optimización
- Optimiza para legibilidad primero: El código claro es más importante que pequeñas optimizaciones.
- Mide antes de optimizar: Usa herramientas de profiling para identificar cuellos de botella reales.
- Evita optimizaciones prematuras: No añadas complejidad por optimizaciones sin evidencia de necesidad.
Recursos útiles
Para ayudarte a contribuir efectivamente, aquí tienes algunos recursos útiles:
Documentación oficial
Artículos y guías
- Conventional Commits
- Semantic Versioning
- Effective TypeScript: 62 Specific Ways to Improve Your TypeScript
Herramientas recomendadas
- Editor: VS Code con las extensiones:
- ESLint
- Prettier
- TypeScript Hero
- GitLens
- Automatización: Husky y lint-staged (ya configurados en el proyecto)
- Depuración: Node.js Debugging en VS Code
Comunicación
Canales
- Issues de GitHub: Para reportar bugs, proponer mejoras o discutir cambios.
- Discusiones de GitHub: Para preguntas, ideas o conversaciones más generales.
- Pull Requests: Para enviar contribuciones de código.
Etiqueta
- Sé respetuoso: Trata a todos con respeto y considera diferentes perspectivas.
- Sé constructivo: Proporciona feedback útil y contextualizado.
- Sé paciente: No todos pueden responder inmediatamente.
- Sé conciso: Mantén tus comunicaciones claras y al punto.
Reconocimiento de contribuciones
Valoramos todas las contribuciones, grandes o pequeñas. Los contribuyentes son reconocidos de las siguientes maneras:
- Lista de colaboradores en el archivo README.md.
- Mención en los changelogs cuando se publican nuevas versiones.
- Autoría en commits preservada en el historial del proyecto.
Manejo de problemas
Reportando bugs
Cuando reportes un bug, por favor incluye:
- Descripción del problema: ¿Qué ocurrió? ¿Qué esperabas que ocurriera?
- Pasos para reproducir: Instrucciones detalladas para reproducir el problema.
- Entorno: Versión de Node.js, sistema operativo, y cualquier otra información relevante.
- Evidencia: Capturas de pantalla, logs o trazas de error si están disponibles.
Solicitando funcionalidades
Para solicitar nuevas funcionalidades:
- Describe la necesidad: ¿Qué problema resolvería esta funcionalidad?
- Propón una solución: Si tienes ideas específicas sobre cómo implementarla.
- Proporciona contexto: ¿Cómo se relaciona con la funcionalidad existente?
- Ejemplos de uso: Casos de uso o snippets de código de ejemplo.
Licencia y atribución
Al contribuir a este proyecto:
- Aceptas que tus contribuciones serán licenciadas bajo la misma licencia MIT que cubre el proyecto.
- Confirmas que tienes los derechos necesarios sobre tu contribución y puedes licenciarla bajo estos términos.
- Entiendes que tu contribución estará disponible públicamente y podrá ser utilizada por otros según los términos de la licencia.
¡Gracias por leer esta guía y por tu interés en contribuir a TypeScript Library Template Pro! Tu ayuda es fundamental para hacer este proyecto mejor para todos. Si tienes preguntas o necesitas clarificación sobre cualquier punto, no dudes en abrir un issue o contactar con el equipo de mantenimiento.