Fonte: https://www.udemy.com/course/tdd-com-mango/learn/lecture/17664692#overview
https://www.conventionalcommits.org/en/v1.0.0/
Configurando o git-commit-msg-linter
npm i -D git-commit-msg-linter
# Cria um hook por trás dos panos no git e sempre que dermos um commit ele irá validar a nossa msg para ver se está dentro dos padrões do convetionalcommits.org.
Instalar a extensão no vscode/theia: https://marketplace.visualstudio.com/items?itemName=vivaxy.vscode-conventional-commits
Instalar no webstorm: https://github.com/lppedd/idea-conventional-commit
https://plugins.jetbrains.com/plugin/14046-commitlint-conventional-commit
plugins > search marketplace : Conventional Commit
Types: fix, feat, build, chore, ci, docs, style, refactor, perf, test.
Tradução: corrigir, façanha, construir, tarefa, refatorar, ...
Podemos usar também scope através do parenteses: feat(parser): add ability to parse arrays.
Não vamos usar scope, body e nem footer.
chore - é muito usado quando adicionamos uma lib nova.
Exemplo:
chore: add npm
Não usar verbos no gerundio ou passado, sempre no imperativo. Nunca usar adding ou added, sempre add.
https://www.conjugacao.com.br/verbos-no-imperativo/
O imperativo é um dos modos verbais, juntamente com o modo indicativo e o modo subjuntivo. No modo imperativo a pessoa falante leva o seu interlocutor a realizar uma ação, expressando o que quer que ele faça.
Assim, a ação transmitida por um verbo no imperativo é um pedido, convite, exortação, ordem, comando, conselho ou súplica.
O imperativo se divide em imperativo afirmativo e imperativo negativo, sendo conjugados de forma diferente. Em ambos não existe flexão na 1.ª pessoa do singular (eu).
Typescript: linguagem compilada. Então é um superset do javascript. Podemos adicionar tipagem na linguagem javascript. Ajuda bastante a não cometermos erros. Permite que usemos recursos do javascript que ainda não foram disponibilizados no javascript, EcmaScript2020 pode ser utilizado por exemplo, pois na maioria das vezes o typescript já possui.
npm i -D typescript @types/node
O @types/node adiciona tipagem
Criar o arquivo tsconfig.json
{
"compilerOptions": {
"outDir": "./dist",
"module": "commonjs", // Força o typescript quando for gerar o javascript gerar na versão antiga dos imports da vida = require para que os navegadores entendam.
"target": "es2019",
"esModuleInterop": true, // Para fazer uma conversão do import para require
"allowJs": true // Para arquivos de configuraçao em javascript ao invés de json
}
}
Para se ver as novidades e suporte das versões do nodejs: https://node.green/
Iremos utilizar o eslint-config-standard-with-typescript, para isso deveremos instalar:
https://github.com/standard/eslint-config-standard-with-typescript
npm install --save-dev eslint@6 eslint-plugin-standard@4 eslint-plugin-promise@4 eslint-plugin-import@2 eslint-plugin-node@11 @typescript-eslint/eslint-plugin@2 eslint-config-standard-with-typescript
Um outro ponto importante é desabilitar o plugin standardjs caso tenha instalado o mesmo no vscode para não conflitar com o plugin eslint. Quando formos desabilitar, podemos desabiliar no workspace.
Criar o arquivo .eslintrc.josn
{
"extends": "sandard-with-typescript",
"parserOptions": {
"project": "./tsconfig.json"
}
}
npm i -D standard-version
ou
npm i -g standard-version
Adicionar no package.json
{
"scripts": {
"release": "standard-version"
}
}
Comandos para rodar
# npm run script
npm run release -- --first-release
# global bin
standard-version --first-release
# npx
npx standard-version --first-release
Aí para publicar, precisamos estar logados no npm
npm whoami
Para logar-se no npm
npm adduser
# Preencher os dados de login: farnetani, senha e email = [email protected]
Aí para publicar a RELEASE (npm run release) tem que executar o comando:
git push --follow-tags origin master && npm publish
OBS: não pode esquecer de se logar-se no npm (npm adduser e npm whoami pra ver se deu certo)
Adicionar o .gitignore
node_modules
dist
coverage
data
!src/data
.vscode
.idea
Para criarmos hooks antes do commit. Podemos colocar comandos antes do commit ou antes do push.
npm i -D husky
Criar o arquivo huskyrs.json
{
"hooks": {
"pre-commit": "eslint"
}
}
Vamos usar o husky com outra lib para tratar filtros. Ele permite que rodemos a validação apenas nos arquivos staged (add --all).
npm i -D lint-staged
Criar o arquivo .lintstagedrc.json
{
"*.ts": [
"eslint 'src/**' --fix",
"npm run test:staged",
"git add"
]
}
Não esquecer de criar o script : "test:staged": "jest
Reeditar o arquivo .huskyrc.json
{
"hooks": {
"pre-commit": "lint-staged"
}
}
npm i -D jest @types/jest ts-jest
jest init
ou
./node_modules/.bin/jest --init
Y
node
yes
Será criado o arquivo jet.config.js
na raiz do projeto
roots: ['<rootDir>/src'],
collectCoverageFrom: ['<rootDir>/src/**/*.ts'],
coverageDirectory: 'coverage',
testEnvironment: 'node',
transform: {
'.+\\.ts$': 'ts-jest' // Expressão regular que fala que qualquer texto/arquivo terminado com .ts vai rodar o ts-jest
}
- git-commit-msg-linter : Cria um hook por trás dos panos no git e sempre que dermos um commit ele irá validar a nossa msg para ver se está dentro dos padrões do convetionalcommits.org.
- typescript : instalação.
- eslint-config-standard-with-typescript : eslint para typescript.
- hustky - npmjs.com/package/husky : permite que coloquemos hooks para o nosso git. Criar o arquivo .huskyrc.json.
- lint-staged - lib para fazer a validação apenas nos arquivos staged. Criar o arquivo .lintstagedrc.json.
.gitignore
node_modules
dist
coverage
data
!src/data
.vscode
.idea
tsconfig.json
{
"compilerOptions": {
"outDir": "./dist",
"module": "commonjs",
"target": "es2019",
"esModuleInterop": true,
"allowJs": true
}
}
.huskyrc.json
{
"hooks": {
"pre-commit": "lint-staged"
}
}
.intstagedrc.json
{
"*.ts": [
"eslint 'src/**' --fix",
"npm run test:staged", // Criar o script no package.json como test:staged
"git add"
]
}
package.json
...
"scripts": {
"test": "jest",
"test:staged": "jest",
"release": "standard-version"
},
...
jest.config.js
// For a detailed explanation regarding each configuration property, visit:
// https://jestjs.io/docs/en/configuration.html
module.exports = {
roots: ['<rootDir>/src'],
collectCoverageFrom: ['<rootDir>/src/**/*.ts'], // path de onde irei pegar os arquivos de teste
coverageDirectory: "coverage",
transform: {
'.+\\.ts$': 'ts-jest' // Expressão regular que fala que qualquer texto/arquivo terminado com .ts vai rodar o ts-jest
}
};
Exemplo de teste: src\controller.spec.ts
describe('', () => {
test('test-jets', () => {
expect(1).toBe(1)
})
})
npm i -D git-commit-msg-linter
npm i -D typescript @types/node
npm install --save-dev eslint@6 eslint-plugin-standard@4 eslint-plugin-promise@4 eslint-plugin-import@2 eslint-plugin-node@11 @typescript-eslint/eslint-plugin@2 eslint-config-standard-with-typescript
npm i -D standard-version
ou
npm i -g standard-version
npm i -D husky
npm i -D lint-staged
npm i -D jest @types/jest ts-jest
./node_modules/.bin/jest --init
Dica de git como juntar algumas modificações ao último commit:
## Junta essas mudanças no último commit e use o mesmo texto anterior e não abra o editor
git commit --amend --no-edit