@govbr-ds/commitlint-config 4.6.1 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,82 +1,218 @@
1
- # GovBR-DS - Commit Config
1
+ # GovBR-DS - Commitlint Config
2
2
 
3
3
  ## Objetivo
4
4
 
5
- Compartilhar os padrões de commit entre os projetos do [GovBR-DS](https://gitlab.com/govbr-ds 'GovBR-DS').
5
+ Compartilhar uma convenção de commits clara e verificável entre os projetos do GovBR-DS.
6
6
 
7
- ## Como instalar
7
+ Além de validar o formato das mensagens, esta configuração prepara os commits para:
8
8
 
9
- 1. Instale as seguintes dependências
9
+ - gerar changelogs legíveis;
10
+ - calcular versões automaticamente com Semantic Release;
11
+ - relacionar commits a issues do GitLab;
12
+ - explicar ao próximo desenvolvedor o contexto e o impacto da mudança.
10
13
 
11
- ```bash
12
- npm install --save-dev @govbr-ds/commitlint-config husky @commitlint/cz-commitlint
13
- ```
14
+ ## Formato
14
15
 
15
- ## Como configurar
16
+ As mensagens seguem o formato do [Conventional Commits](https://www.conventionalcommits.org/pt-br/v1.0.0/):
16
17
 
17
- 1. Crie um arquivo `.commitlintrc.js` na raiz do seu projeto e e importe a configuração:
18
+ ```text
19
+ tipo(escopo): resumo
18
20
 
19
- ```javascript
20
- export default {
21
- extends: ['@govbr-ds/commitlint-config'],
22
- }
23
- ```
21
+ corpo opcional com contexto, causa e impacto
24
22
 
25
- 1. Inclua o seguinte código no seu `package.json`
23
+ rodapé opcional, como Closes #123
24
+ ```
26
25
 
27
- ```json
28
- "scripts": {
29
- "commit": "git-cz",
30
- },
31
- "config": {
32
- "commitizen": {
33
- "path": "@commitlint/cz-commitlint"
34
- }
35
- }
36
- ```
26
+ Exemplo:
37
27
 
38
- 1. Conforme a documentação do [Husky](https://github.com/typicode/husky) inclua o hook `commit-msg` com o código abaixo:
28
+ ```text
29
+ fix(datepicker): validar data máxima antes de emitir o evento
39
30
 
40
- ```bash
41
- npx commitlint --edit ${1}
42
- ```
31
+ A data máxima era ignorada quando o valor vinha do teclado, permitindo um estado inválido.
43
32
 
44
- E configure o `package.json` com o seguinte script:
33
+ Closes #123
34
+ ```
45
35
 
46
- ```json
47
- "scripts": {
48
- "prepare": "husky || true"
49
- }
50
- ```
36
+ ### Tipo
51
37
 
52
- ## Como contribuir?
38
+ Indica a intenção da mudança. Escolha o tipo pelo efeito da alteração, não pelo arquivo modificado.
53
39
 
54
- Antes de abrir um Merge Request tenha em mente algumas informações:
40
+ | Tipo | Quando usar | Efeito no release |
41
+ | ------------ | -------------------------------------------------------- | ------------------------------- |
42
+ | `feat` | Nova capacidade ou comportamento compatível | `minor` |
43
+ | `fix` | Correção de comportamento incorreto | `patch` |
44
+ | `docs` | Documentação, exemplos e guias | `patch` |
45
+ | `perf` | Melhoria de desempenho sem alterar a API | `patch` |
46
+ | `refactor` | Reorganização interna sem mudar comportamento | `patch` |
47
+ | `removed` | Remoção definitiva de API ou recurso público | `major` |
48
+ | `revert` | Reversão de uma mudança publicada | `minor` |
49
+ | `deprecated` | Marcação de API ou recurso como obsoleto | Sem release automático |
50
+ | `build` | Build, bundler ou dependências de desenvolvimento | Sem release automático |
51
+ | `chore` | Manutenção interna sem efeito no produto | Sem release automático |
52
+ | `ci` | Pipelines, jobs e automações de CI | Sem release automático |
53
+ | `lint` | Formatação e estilo sem mudança executável | Sem release automático |
54
+ | `ops` | Atividades operacionais de design ou desenvolvimento | Sem release automático |
55
+ | `site` | Site ou documentação publicada fora do pacote | Sem release automático |
56
+ | `test` | Criação ou ajuste de testes | Sem release automático |
57
+ | `wip` | Trabalho incompleto; não deve chegar à branch de release | Sem release automático |
58
+ | `bump` | Atualização manual de versão | Evite; prefira Semantic Release |
55
59
 
56
- - Esse é um projeto opensource e contribuições são bem-vindas.
57
- - Para facilitar a aprovação da sua contribuição, escolha um título curto, simples e explicativo para o MR, e siga os padrões da nossa [wiki](https://gov.br/ds/wiki/ 'Wiki').
58
- - Quer contribuir com o projeto? Confira o nosso guia [como contribuir](../../CONTRIBUTING.md 'Como contribuir?').
60
+ Os tipos sem release continuam disponíveis para manter o histórico consistente e permitir que o changelog diferencie mudanças de produto de manutenção interna.
59
61
 
60
- ## Reportar bugs/necessidades
62
+ ### Escopo
61
63
 
62
- Você pode usar as [issues](https://gitlab.com/govbr-ds/tools/govbr-ds-config-tools/-/issues/new) para nos informar os problemas que tem enfrentado ao usar nossa biblioteca ou mesmo o que gostaria que fizesse parte do projeto. Por favor use o modelo que mais se encaixa na sua necessidade e preencha com o máximo de detalhes possível.
64
+ Indica a área alterada. Use um nome curto, específico e estável:
63
65
 
64
- Nos comprometemos a responder a todas as issues
66
+ ```text
67
+ fix(button): corrigir foco após o clique
68
+ feat(tokens): adicionar cor semântica de informação
69
+ docs(install): explicar instalação via pnpm
70
+ ```
65
71
 
66
- ## Precisa de ajuda?
72
+ O escopo não deve ser `minor` ou `patch` para forçar uma versão. A versão é determinada pelo tipo e pelas breaking changes.
67
73
 
68
- > Por favor **não** crie issues para fazer perguntas...
74
+ ### Resumo
69
75
 
70
- Use nossos canais abaixo para obter tirar suas dúvidas:
76
+ Escreva um resumo curto, objetivo e no infinitivo:
71
77
 
72
- - Site do GovBR-DS [http://gov.br/ds](http://gov.br/ds)
78
+ ```text
79
+ feat: adicionar suporte a tema escuro
80
+ fix(menu): corrigir fechamento ao pressionar Escape
81
+ ```
73
82
 
74
- - Usando nosso canal no discord [https://discord.gg/U5GwPfqhUP](https://discord.gg/U5GwPfqhUP)
83
+ Evite ponto final, frases vagas e referências sem contexto como `fix: issue 123`.
75
84
 
76
- ## Padrão de commits
85
+ ### Corpo
77
86
 
78
- Para mais informações sobre o padrão de commits consulte [a nossa Wiki](https://gov.br/ds/wiki/git-gitlab/guias/commit/ 'Padrão de commit').
87
+ Use o corpo quando o título não explicar a decisão. Responda, quando fizer sentido:
88
+
89
+ - qual era o problema;
90
+ - por que ele acontecia;
91
+ - qual comportamento foi alterado;
92
+ - qual impacto existe para quem usa o projeto.
93
+
94
+ Ao usar o `czg`, digite `|` para inserir uma quebra de linha manualmente. Se não
95
+ for necessário separar o texto, não use esse caractere.
96
+
97
+ ### Issues
98
+
99
+ Relacione a issue no rodapé:
100
+
101
+ ```text
102
+ Closes #123
103
+ ```
104
+
105
+ Use `Closes`, `Fixes` ou `Resolves` quando o commit deve fechar a issue após o merge. Use apenas `#123` quando a issue deve ser relacionada, mas permanecer aberta.
106
+
107
+ ### Breaking changes
108
+
109
+ Uma breaking change altera ou remove um contrato que consumidores existentes dependem. Exemplos:
110
+
111
+ - remover uma propriedade, evento, método ou componente;
112
+ - tornar obrigatório um campo antes opcional;
113
+ - mudar o formato de retorno;
114
+ - alterar comportamento esperado de forma incompatível.
115
+
116
+ Marque a mudança no cabeçalho ou no rodapé e explique como migrar:
117
+
118
+ ```text
119
+ feat(api)!: tornar token obrigatório
120
+
121
+ BREAKING CHANGE: o token não é mais aceito como propriedade opcional. Envie-o no cabeçalho Authorization.
122
+ ```
123
+
124
+ Toda breaking change gera uma versão `major`, independentemente do tipo escolhido.
125
+
126
+ No `czg`, responda que o commit é uma breaking change para abrir o campo de
127
+ incompatibilidade e migração. Esse campo não aparece para commits compatíveis.
128
+
129
+ ## Instalação
130
+
131
+ ```bash
132
+ pnpm add -D @govbr-ds/commitlint-config @commitlint/cli czg husky
133
+ ```
134
+
135
+ O `czg` é opcional: instale-o apenas se quiser usar o prompt interativo. O
136
+ `@commitlint/cli` é necessário para validar os commits, e o `husky` é necessário
137
+ apenas para executar essa validação automaticamente no commit local.
138
+
139
+ ## Configuração
140
+
141
+ Crie `.commitlintrc.js` na raiz:
142
+
143
+ ```javascript
144
+ export default {
145
+ extends: ['@govbr-ds/commitlint-config'],
146
+ }
147
+ ```
148
+
149
+ O exemplo usa `export default`; portanto, o projeto deve usar módulos ES (`"type":
150
+ "module"` no `package.json`). Em projetos que não usam módulos ES, utilize a
151
+ extensão de configuração compatível com a versão do commitlint instalada.
152
+
153
+ Para usar o `czg`, crie `cz.config.cjs` na raiz e reutilize a configuração
154
+ compartilhada:
155
+
156
+ ```javascript
157
+ module.exports = require('@govbr-ds/commitlint-config/czg')
158
+ ```
159
+
160
+ Adicione o czg ao `package.json`:
161
+
162
+ ```json
163
+ {
164
+ "scripts": {
165
+ "commit": "czg --config=./cz.config.cjs",
166
+ "prepare": "husky"
167
+ }
168
+ }
169
+ ```
170
+
171
+ Inicialize o Husky e crie o hook `.husky/commit-msg`:
172
+
173
+ ```bash
174
+ pnpm exec husky init
175
+ ```
176
+
177
+ No arquivo `.husky/commit-msg`, use:
178
+
179
+ ```bash
180
+ pnpm exec commitlint --edit "$1"
181
+ ```
182
+
183
+ Adicione o script `prepare` caso ele ainda não exista, para que o Husky seja
184
+ configurado após a instalação das dependências:
185
+
186
+ ```json
187
+ {
188
+ "scripts": {
189
+ "prepare": "husky"
190
+ }
191
+ }
192
+ ```
193
+
194
+ Execute `pnpm commit` (ou o script equivalente configurado no projeto) para
195
+ abrir o prompt interativo. O `czg` reutiliza os tipos compartilhados, oferece a
196
+ marcação de breaking change e gera a mensagem; o hook do commitlint continua
197
+ sendo a validação obrigatória, inclusive para mensagens criadas manualmente.
198
+
199
+ O hook impede mensagens inválidas no commit local. O pipeline deve executar a mesma validação para proteger commits criados sem os hooks locais.
200
+
201
+ ## Exemplos rápidos
202
+
203
+ ```text
204
+ feat(header): adicionar navegação responsiva
205
+ fix(input): preservar valor ao exibir mensagem de erro
206
+ docs(tokens): explicar token de superfície
207
+ refactor(core): separar parser de validação
208
+ test(select): cobrir navegação por teclado
209
+ ci: atualizar imagem do pipeline
210
+ ```
211
+
212
+ ## Contribuição
213
+
214
+ Antes de abrir um Merge Request, consulte o guia de contribuição e mantenha esta documentação alinhada com as regras do pacote release. Alterações em tipos, regras ou impacto SemVer devem incluir exemplos de mensagens válidas e inválidas.
79
215
 
80
216
  ## Licença
81
217
 
82
- Nesse projeto usamos a licença MIT.
218
+ Este projeto utiliza a licença MIT.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@govbr-ds/commitlint-config",
3
- "version": "4.6.1",
3
+ "version": "5.0.1",
4
4
  "private": false,
5
5
  "description": "Padrão de commits para projetos do Padrão Digital de Governo",
6
6
  "keywords": [
@@ -18,17 +18,24 @@
18
18
  },
19
19
  "license": "MIT",
20
20
  "author": "SERPRO (http://serpro.gov.br/)",
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
21
24
  "type": "module",
22
25
  "main": "src/.commitlintrc.js",
26
+ "exports": {
27
+ ".": "./src/.commitlintrc.js",
28
+ "./czg": "./src/czg.cjs"
29
+ },
23
30
  "files": [
24
- "src/.commitlintrc.js"
31
+ "src/.commitlintrc.js",
32
+ "src/czg.cjs"
25
33
  ],
26
34
  "dependencies": {
27
- "@commitlint/cli": "^19.8.1",
28
- "@commitlint/config-conventional": "^19.8.1",
29
- "@commitlint/cz-commitlint": "^19.8.1",
30
- "@commitlint/format": "^19.8.1",
31
- "@commitlint/lint": "^19.8.1",
32
- "commitizen": "^4.3.1"
35
+ "@commitlint/cli": "^21.2.1",
36
+ "@commitlint/config-conventional": "^21.2.0",
37
+ "@commitlint/format": "^21.2.0",
38
+ "@commitlint/lint": "^21.2.0",
39
+ "@govbr-ds/commit-types": "5.0.1"
33
40
  }
34
41
  }
@@ -1,109 +1,88 @@
1
+ import commitTypesModule from '@govbr-ds/commit-types'
2
+
3
+ const { commitTypes } = commitTypesModule
4
+
5
+ const promptTypes = Object.fromEntries(
6
+ commitTypes.map(({ value, description, semverBump }) => [
7
+ value,
8
+ {
9
+ description: `${description}. ${
10
+ semverBump === 'none'
11
+ ? 'Não gera uma nova versão por conta própria.'
12
+ : `Gera uma nova versão do tipo ${semverBump}.`
13
+ }`,
14
+ },
15
+ ])
16
+ )
17
+
1
18
  export default {
2
19
  defaultIgnores: true,
3
20
  extends: ['@commitlint/config-conventional'],
4
21
  formatter: '@commitlint/format',
5
22
  helpUrl: 'https://gov.br/ds/wiki/git-gitlab/guias/commit/',
6
23
  ignores: [(commit) => commit.includes('[skip ci]')],
24
+
7
25
  prompt: {
8
26
  messages: {
9
- emptyWarning: 'Item obrigatório. Por favor preencha conforme orientação.',
10
- lowerLimitWarning: 'Abaixo do limite de caracteres',
11
- max: 'Máximo de %d caracteres',
12
- min: 'Mínimo de %d caracteres',
13
- skip: '(OPCIONAL)',
14
- upperLimitWarning: 'Acima do limite de caracteres',
27
+ emptyWarning: 'Este campo é obrigatório. Preencha-o conforme a orientação.',
28
+ lowerLimitWarning: 'O conteúdo está abaixo do número mínimo de caracteres.',
29
+ max: 'Use no máximo %d caracteres.',
30
+ min: 'Use pelo menos %d caracteres.',
31
+ skip: '(opcional)',
32
+ upperLimitWarning: 'O conteúdo ultrapassa o número máximo de caracteres.',
15
33
  },
34
+
16
35
  questions: {
17
36
  body: {
18
- description: 'Descrição DETALHADA da mudança (Use \\n para quebrar linhas)',
37
+ description: 'Explique o contexto, a motivação e o impacto da mudança. Use \\n para inserir quebras de linha.',
19
38
  },
39
+
20
40
  breaking: {
21
- description: 'Descrição BREVE da(s) BREAKING CHANGE(S)',
41
+ description: 'Resuma a mudança incompatível e informe quais consumidores precisarão adaptar o código.',
22
42
  },
43
+
23
44
  breakingBody: {
24
45
  description:
25
- 'A descrição DETALHADA é obrigatória para BREAKING CHANGE(S). Descreva EM DETALHES a mudança. (Use \\n para quebrar linhas)',
46
+ 'Descreva o comportamento anterior, o novo comportamento e as etapas necessárias para migração. Use \\n para inserir quebras de linha.',
26
47
  },
48
+
27
49
  isBreaking: {
28
- description: 'Existe BREAKING CHANGE?',
50
+ description: 'Esta mudança quebra a compatibilidade com versões anteriores?',
29
51
  },
52
+
30
53
  isIssueAffected: {
31
- description: 'Essa mudança relaciona/fecha alguma(s) issue(s)?',
54
+ description: 'Este commit está relacionado a uma issue ou deve encerrá-la?',
32
55
  },
56
+
33
57
  issues: {
34
- description:
35
- 'Liste a(s) issue(s) (Veja https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)',
58
+ description: 'Informe as issues relacionadas. Exemplos: #123, Closes #123 ou Fixes #123.',
36
59
  },
60
+
37
61
  issuesBody: {
38
62
  description:
39
- 'A descrição DETALHADA é obrigatória quando um commit relaciona/fecha uma issue. Descreva EM DETALHES a mudança. (Use \\n para quebrar linhas)',
63
+ 'Explique como este commit atende à issue e quais pontos foram resolvidos. Use \\n para inserir quebras de linha.',
40
64
  },
65
+
41
66
  scope: {
42
- description: 'Qual é o escopo dessa mudança? (ex: button, table, package.json)',
67
+ description:
68
+ 'Informe a área afetada usando um nome curto, específico e estável. Exemplos: button, table ou package.json.',
43
69
  },
70
+
44
71
  subject: {
45
- description: 'Descrição BREVE sobre a mudança (Veja https://gov.br/ds/wiki/git-gitlab/guias/commit/)',
72
+ description:
73
+ 'Descreva objetivamente a mudança no infinitivo, sem ponto final e sem repetir o tipo. Exemplo: adicionar estado loading.',
46
74
  },
75
+
47
76
  type: {
48
77
  description:
49
- 'ANTES DE ENVIAR UM COMMIT, LEIA A NOSSA DOCUMENTAÇÃO SOBRE O ASSUNTO: https://gov.br/ds/wiki/git-gitlab/guias/commit/\n\n Selecione o tipo da mudança',
50
- enum: {
51
- build: {
52
- description: 'Mudanças no sistema de build (ex: npm, node, webpack, vite...)',
53
- },
54
- bump: {
55
- description: 'Commit sem alterações, apenas atualização de versão',
56
- },
57
- chore: {
58
- description: 'Alterações diversas que não se encaixam em outros tipos',
59
- },
60
- ci: {
61
- description: 'Alterações nos arquivos e scripts de configuração de ambiente (Gitlab, Pipelines, Permissões...)',
62
- },
63
- deprecated: {
64
- description: 'Marca o recurso como obsoleto. Provavelmente será removido em uma próxima versão',
65
- },
66
- docs: {
67
- description: 'Atividades de documentação (tutorial, guia, etc...)',
68
- },
69
- feat: {
70
- description: 'Nova feature, recurso, elemento, comportamento, etc...',
71
- },
72
- fix: {
73
- description: 'Correção em feature, recurso, elemento, comportamento, etc...',
74
- },
75
- lint: {
76
- description: 'Mudanças que não alteram o significado/comportamento (espaços, formatação, semi-vírgulas ausentes...)',
77
- },
78
- ops: {
79
- description: 'Atividades operacionais relacionadas a design e desenvolvimento',
80
- },
81
- perf: {
82
- description: 'Melhoria de desempenho (tempo de execução, tamanho, carregamento...)',
83
- },
84
- refactor: {
85
- description: 'Altera o conteúdo sem mudar o resultado final (ex: organização de pastas, camadas...)',
86
- },
87
- removed: {
88
- description: 'Recurso excluído definitivamente do projeto',
89
- },
90
- revert: {
91
- description: 'Reverte um commit',
92
- },
93
- site: {
94
- description: 'Alterações relacionadas ao site ou documentação online',
95
- },
96
- test: {
97
- description: 'Atividades relacionadas a testes',
98
- },
99
- wip: {
100
- description: 'Trabalho ainda não finalizado',
101
- },
102
- },
78
+ 'Escolha o tipo que melhor representa a intenção da mudança. Ele pode influenciar o changelog e a próxima versão.',
79
+ enum: promptTypes,
103
80
  },
104
81
  },
105
82
  },
106
- // https://commitlint.js.org/#/reference-rules
83
+
84
+ // Estas regras validam apenas o formato da mensagem.
85
+ // O impacto no SemVer é definido por commitTypes e pelo release-config.
107
86
  rules: {
108
87
  'body-full-stop': [0, 'always', '.'],
109
88
  'body-leading-blank': [2, 'always'],
@@ -122,29 +101,7 @@ export default {
122
101
  'subject-full-stop': [0, 'always', '.'],
123
102
  'subject-max-length': [0, 'always', Infinity],
124
103
  'type-case': [0, 'always', 'lower-case'],
125
- 'type-enum': [
126
- 2,
127
- 'always',
128
- [
129
- 'build',
130
- 'bump',
131
- 'chore',
132
- 'ci',
133
- 'deprecated',
134
- 'docs',
135
- 'feat',
136
- 'fix',
137
- 'lint',
138
- 'ops',
139
- 'perf',
140
- 'refactor',
141
- 'removed',
142
- 'revert',
143
- 'site',
144
- 'test',
145
- 'wip'
146
- ],
147
- ],
104
+ 'type-enum': [2, 'always', commitTypes.map(({ value }) => value)],
148
105
  'type-max-length': [2, 'always', Infinity],
149
106
  },
150
107
  }
package/src/czg.cjs ADDED
@@ -0,0 +1,22 @@
1
+ const { commitTypes } = require('@govbr-ds/commit-types')
2
+
3
+ module.exports = {
4
+ types: commitTypes.map(({ value, description }) => ({
5
+ value,
6
+ name: `${value}: ${description}`,
7
+ })),
8
+ messages: {
9
+ type: 'Selecione o tipo que melhor representa a intenção da mudança:',
10
+ scope: 'Informe a área, o componente ou o arquivo afetado (opcional):',
11
+ subject: 'Resuma objetivamente a mudança no infinitivo e sem ponto final:',
12
+ body: 'Explique o contexto, a motivação e o impacto da mudança (opcional; use | para quebrar linha):',
13
+ breaking:
14
+ 'Descreva a incompatibilidade introduzida e as etapas necessárias para migração (use | para quebrar linha):',
15
+ footer: 'Informe issues relacionadas, referências ou outros metadados (opcional):',
16
+ confirmCommit: 'Deseja confirmar esta mensagem de commit?',
17
+ },
18
+ markBreakingChangeMode: true,
19
+ // czg usa Infinity para quebrar o texto palavra por palavra. Este limite alto
20
+ // mantém a formatação em uma linha na prática sem limitar a validação.
21
+ breaklineNumber: 1000,
22
+ }