@alebat/default-alebat-config
@alebat/default-alebat-config es un paquete propio publicado en npm cuya única función real hoy es centralizar la configuración de Commitlint para que todos los repositorios de Alebat compartan exactamente la misma convención de mensajes de commit.
Repositorio: Alebat-Education/default-alebat-config
Ficha técnica
Section titled “Ficha técnica”| Concepto | Detalle |
|---|---|
| Paquete | @alebat/default-alebat-config |
| Versión | 1.1.1 |
| Tipo | Módulo ESM ("type": "module") |
| Entrada | dist/index.js (se compila con tsc) |
| Exporta | commitLintFront, commitLintBack |
| Se instala como | devDependency |
| Registro | npm público |
npm install --save-dev @alebat/default-alebat-config# o, en los proyectos que usan pnpmpnpm add -D @alebat/default-alebat-configEstructura del repositorio
Section titled “Estructura del repositorio”- commitlint-config-front.ts configuración para proyectos front-end
- commitlint-config-back.ts configuración para proyectos back-end (Strapi)
- index.ts reexporta las dos anteriores
- package.json
- tsconfig.json
- README.md
El index.ts es de dos líneas — es simplemente el punto de entrada público del paquete:
export { commitLintFront } from './commitlint-config-front'export { commitLintBack } from './commitlint-config-back'La configuración, campo por campo
Section titled “La configuración, campo por campo”Las dos exportaciones (commitLintFront y commitLintBack) comparten casi toda la estructura. Vamos primero por lo común.
extends
Section titled “extends”extends: ['@commitlint/config-conventional']Parte del preset oficial de Conventional Commits, que ya trae las reglas básicas: el tipo es obligatorio, va en minúscula, la descripción no puede estar vacía, la cabecera tiene un largo máximo, etc. Todo lo que venga después en rules sobrescribe ese preset.
formatter
Section titled “formatter”formatter: '@commitlint/format'Es el formateador de la salida de error: el que produce el mensaje con colores, la flecha ⧗ input: y el nombre de la regla entre corchetes. Sin él verías un volcado de objeto en crudo.
rules comunes
Section titled “rules comunes”Cada regla de Commitlint es un array de hasta tres posiciones: [nivel, condición, valor].
- nivel:
0desactivada,1aviso,2error. - condición:
'always'(se debe cumplir) o'never'(se debe incumplir). - valor: el parámetro de la regla, cuando aplica.
rules: { 'subject-max-length': [2, 'always', 100], 'subject-case': [2, 'never'], 'scope-empty': [2, 'never'], 'scope-case': [2, 'never'], 'type-enum': [2, 'always', ['build', 'chore', 'ci', 'docs', 'feat', 'fix', 'perf', 'refactor', 'revert', 'style', 'test']],}| Regla | Qué exige |
|---|---|
subject-max-length | La descripción no puede pasar de 100 caracteres. No es que se suba un límite del preset: config-conventional no define esta regla, se añade aquí. El límite que de verdad manda es otro — ver el aviso de abajo. |
subject-case | Nivel 2 con never y sin lista de casos: en la práctica no restringe ningún formato concreto de mayúsculas en la descripción. Es la forma de anular la restricción que config-conventional impone por defecto (que prohíbe, entre otros, empezar en mayúscula). Resultado: la descripción se puede escribir con la capitalización natural del español. |
scope-empty | never = el ámbito nunca puede estar vacío. Esta es la desviación más visible respecto a Conventional Commits estándar, donde el ámbito es opcional. En Alebat es obligatorio: fix: algo se rechaza, fix(cart): algo se acepta. |
scope-case | Igual que subject-case: anula la restricción de capitalización del ámbito. Por eso son válidos ámbitos en camelCase como coemCourses o ecomComponents. |
type-enum | La lista cerrada de tipos permitidos. Ver la tabla completa en Commitlint. |
El resto de campos
Section titled “El resto de campos”ignores: [(commit: string) => commit === ''],defaultIgnores: true,helpUrl: 'https://github.com/conventional-changelog/commitlint/#what-is-commitlint',prompt: { messages: {}, questions: { type: { description: 'please input type:' } },},| Campo | Función |
|---|---|
ignores | Lista de funciones que, si devuelven true, hacen que Commitlint no valide ese mensaje. Aquí solo se ignora el mensaje vacío (que Git ya aborta por su cuenta). |
defaultIgnores | true mantiene las exclusiones que Commitlint trae de fábrica: los mensajes que Git genera automáticamente. Es lo que permite que Merge pull request #135 from … o Revert … no sean rechazados, aunque no cumplan la convención. |
helpUrl | La URL que se imprime al fallar. |
prompt | Textos para @commitlint/prompt-cli, la utilidad interactiva que va preguntando tipo, ámbito y descripción. Está configurada pero no la usamos en el flujo habitual. |
La diferencia entre front y back
Section titled “La diferencia entre front y back”Es una sola: commitLintBack añade una regla scope-enum, es decir, restringe también los ámbitos a una lista cerrada.
No hay scope-enum. El ámbito es obligatorio pero libre: se puede usar cualquier palabra.
✅ feat(checkout): añadido el pago con Stripe Link✅ fix(cursosCoem): corregido el filtro de categorías✅ docs(ecomComponents): documentada la instalaciónPor qué: los fronts son proyectos de dominio muy variado (verticales, tiendas, campus, Inspiria). Una lista cerrada de ámbitos se quedaría obsoleta en cada feature nueva y obligaría a publicar una versión del paquete para poder commitear.
Añade una lista cerrada de 19 ámbitos, que se corresponden con la estructura de carpetas de un proyecto Strapi:
'scope-enum': [ 2, 'always', [ 'api', 'components', 'config', 'constants', 'controllers', 'dependencies', 'documentation', 'extensions', 'lifecycles', 'middlewares', 'plugins', 'readme', 'routes', 'schemas', 'services', 'styles', 'testing', 'types', 'utils', ],],✅ feat(controllers): añadido el endpoint de suscripciones✅ fix(lifecycles): corregido el afterCreate del pedido❌ feat(suscripciones): ... → 'suscripciones' no está en la listaPor qué: todos nuestros back-ends son Strapi y comparten la misma estructura. Ahí sí tiene sentido cerrar la lista: el ámbito indica en qué capa has trabajado, lo cual es información útil y estable.
Cómo se implementa en un proyecto
Section titled “Cómo se implementa en un proyecto”-
Instalar las dependencias. Hacen falta tres paquetes en
devDependencies:Terminal window pnpm add -D @alebat/default-alebat-config @commitlint/cli @commitlint/config-conventionalY
husky, si el proyecto no lo tiene ya. -
Crear el
commitlint.config.tsen la raíz del proyecto, con la exportación que corresponda:commitlint.config.ts (proyecto front) import { commitLintFront } from '@alebat/default-alebat-config'export default commitLintFrontcommitlint.config.ts (proyecto back / Strapi) import { commitLintBack } from '@alebat/default-alebat-config'export default commitLintBack -
Excluir el archivo del linter. Como el
commitlint.config.tsnormalmente no entra en eltsconfig.json, hay que añadirlo a losignoresdeeslint.config.jspara que el parser de TypeScript no falle al analizarlo. -
Crear el hook de Husky que lo ejecuta:
.husky/commit-msg npx --no -- commitlint --edit "$1" -
Comprobar que funciona, intentando un commit deliberadamente inválido:
Terminal window git commit --allow-empty -m "prueba"# ✖ subject may not be empty [subject-empty]# ✖ type may not be empty [type-empty]
Modificar la configuración compartida
Section titled “Modificar la configuración compartida”Como el paquete es compartido, cualquier cambio afecta a todos los repositorios que lo consuman en su próxima actualización. El flujo es:
-
Abrir una rama en default-alebat-config y editar
commitlint-config-front.tsocommitlint-config-back.ts. -
Compilar con
npm run build(ejecutatscy generadist/, que es lo que se publica). -
Subir la versión en el
package.jsonsiguiendo semver. Añadir un tipo o un ámbito es una minor; quitarlos o hacer una regla más estricta es un cambio que romperá commits que antes eran válidos. -
Abrir Pull Request y publicar en npm una vez aprobado.
-
En cada proyecto consumidor, actualizar la dependencia cuando se quiera adoptar el cambio.