@caioms/pre-git-auto-format 1.0.0
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/bin/setup.js +148 -0
- package/package.json +16 -0
package/bin/setup.js
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
// ^ Garante que o script seja executado com Node.js
|
3
|
+
|
4
|
+
const fs = require('fs');
|
5
|
+
const path = require('path');
|
6
|
+
const { execSync } = require('child_process');
|
7
|
+
|
8
|
+
const projectRoot = process.cwd(); // Diretório raiz do projeto consumidor
|
9
|
+
|
10
|
+
function runCommand(command) {
|
11
|
+
try {
|
12
|
+
console.log(`Executando: ${command}`);
|
13
|
+
execSync(command, { stdio: 'inherit', cwd: projectRoot });
|
14
|
+
return true;
|
15
|
+
} catch (error) {
|
16
|
+
console.error(`Falha ao executar: ${command}`, error);
|
17
|
+
return false;
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
function fileExists(filePath) {
|
22
|
+
return fs.existsSync(path.join(projectRoot, filePath));
|
23
|
+
}
|
24
|
+
|
25
|
+
function writeJsonFile(filePath, data) {
|
26
|
+
fs.writeFileSync(path.join(projectRoot, filePath), JSON.stringify(data, null, 4));
|
27
|
+
console.log(`Arquivo criado/atualizado: ${filePath}`);
|
28
|
+
}
|
29
|
+
|
30
|
+
function main() {
|
31
|
+
console.log('Configurando hooks de pré-commit com @caioms/pre-git-auto-format...');
|
32
|
+
|
33
|
+
// Etapa 0: Verificar se as peerDependencies estão instaladas (informativo)
|
34
|
+
// Idealmente, o gerenciador de pacotes já cuidou disso ou emitiu avisos.
|
35
|
+
// Uma verificação mais robusta poderia tentar importar os módulos.
|
36
|
+
console.log('Verificando dependências peer necessárias (husky, lint-staged, @biomejs/biome, @caioms/biomejs-config)...');
|
37
|
+
// (Você pode adicionar uma lógica mais sofisticada aqui para verificar se os pacotes existem em node_modules)
|
38
|
+
|
39
|
+
// Etapa 1: Inicializar Husky (se não existir .husky)
|
40
|
+
if (!fileExists('.husky')) {
|
41
|
+
if (!runCommand('npx husky init')) {
|
42
|
+
console.error('Falha ao inicializar o Husky. Por favor, verifique se o Husky está instalado e tente novamente.');
|
43
|
+
process.exit(1);
|
44
|
+
}
|
45
|
+
} else {
|
46
|
+
console.log('.husky já existe, pulando inicialização.');
|
47
|
+
}
|
48
|
+
|
49
|
+
// Etapa 2: Adicionar/Atualizar o hook pre-commit do Husky
|
50
|
+
const preCommitHookPath = path.join('.husky', 'pre-commit');
|
51
|
+
const preCommitCommand = 'npx lint-staged';
|
52
|
+
// Poderíamos verificar se o comando já existe, mas para simplificar, vamos sobrescrever.
|
53
|
+
// Em uma versão mais avançada, você poderia tentar adicionar ao invés de sobrescrever.
|
54
|
+
console.log(`Configurando hook pre-commit para executar: "${preCommitCommand}"`);
|
55
|
+
fs.writeFileSync(path.join(projectRoot, preCommitHookPath), `#!/usr/bin/env sh
|
56
|
+
. "$(dirname -- "$0")/_/husky.sh"
|
57
|
+
|
58
|
+
${preCommitCommand}
|
59
|
+
`);
|
60
|
+
runCommand(`chmod +x ${preCommitHookPath}`); // Tornar executável
|
61
|
+
console.log(`Hook pre-commit configurado em: ${preCommitHookPath}`);
|
62
|
+
|
63
|
+
|
64
|
+
// Etapa 3: Criar/Atualizar o arquivo de configuração do lint-staged
|
65
|
+
const lintStagedConfig = {
|
66
|
+
"*.{js,jsx,ts,tsx,mjs,cjs}": ["npx biome format --write"],
|
67
|
+
// Você pode adicionar mais padrões aqui se desejar, por exemplo, para JSON, Markdown, etc.
|
68
|
+
// "*.{json,md}": ["npx biome format --write"]
|
69
|
+
};
|
70
|
+
// lint-staged suporta vários nomes de arquivo de configuração.
|
71
|
+
// .lintstagedrc.json é uma boa escolha.
|
72
|
+
writeJsonFile('.lintstagedrc.json', lintStagedConfig);
|
73
|
+
|
74
|
+
|
75
|
+
// Etapa 4: Garantir que o biome.json do projeto estenda o seu @caioms/biomejs-config
|
76
|
+
const biomeConfigPath = 'biome.json';
|
77
|
+
let projectBiomeConfig = {};
|
78
|
+
|
79
|
+
if (fileExists(biomeConfigPath)) {
|
80
|
+
try {
|
81
|
+
projectBiomeConfig = JSON.parse(fs.readFileSync(path.join(projectRoot, biomeConfigPath), 'utf-8'));
|
82
|
+
} catch (e) {
|
83
|
+
console.warn(`Aviso: Não foi possível ler o ${biomeConfigPath} existente. Ele será sobrescrito com a configuração base.`);
|
84
|
+
projectBiomeConfig = {};
|
85
|
+
}
|
86
|
+
}
|
87
|
+
|
88
|
+
const biomeExtendsValue = '@caioms/biomejs-config';
|
89
|
+
if (projectBiomeConfig.extends) {
|
90
|
+
if (Array.isArray(projectBiomeConfig.extends)) {
|
91
|
+
if (!projectBiomeConfig.extends.includes(biomeExtendsValue)) {
|
92
|
+
projectBiomeConfig.extends.push(biomeExtendsValue);
|
93
|
+
}
|
94
|
+
} else if (projectBiomeConfig.extends !== biomeExtendsValue) {
|
95
|
+
// Se extends é uma string e não é a nossa, transforma em array
|
96
|
+
projectBiomeConfig.extends = [projectBiomeConfig.extends, biomeExtendsValue];
|
97
|
+
}
|
98
|
+
// Se já for a string correta, não faz nada
|
99
|
+
} else {
|
100
|
+
projectBiomeConfig.extends = [biomeExtendsValue];
|
101
|
+
}
|
102
|
+
|
103
|
+
// Adiciona um $schema se não existir, para melhor autocompletar no editor
|
104
|
+
if (!projectBiomeConfig.$schema) {
|
105
|
+
projectBiomeConfig.$schema = "./node_modules/@biomejs/biome/configuration_schema.json";
|
106
|
+
}
|
107
|
+
|
108
|
+
writeJsonFile(biomeConfigPath, projectBiomeConfig);
|
109
|
+
|
110
|
+
|
111
|
+
// Etapa 5: (Opcional) Adicionar script "prepare" ao package.json do consumidor
|
112
|
+
// Isso é útil para Husky v7+ para instalar automaticamente os hooks após o `npm install`
|
113
|
+
try {
|
114
|
+
const packageJsonPath = path.join(projectRoot, 'package.json');
|
115
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
116
|
+
if (!packageJson.scripts) {
|
117
|
+
packageJson.scripts = {};
|
118
|
+
}
|
119
|
+
if (packageJson.scripts.prepare !== 'husky' && packageJson.scripts.prepare !== 'husky install') { // Evita conflitos se já existir
|
120
|
+
// Se houver outro script prepare, avisa o usuário.
|
121
|
+
// Para simplificar, aqui vamos apenas adicionar se não existir ou for diferente.
|
122
|
+
// Uma solução mais robusta poderia tentar concatenar comandos.
|
123
|
+
if (packageJson.scripts.prepare) {
|
124
|
+
console.warn(`Aviso: O projeto já possui um script "prepare": "${packageJson.scripts.prepare}". Não foi possível adicionar "husky" automaticamente. Considere adicionar "husky" ou "husky install" manualmente ao seu script "prepare".`);
|
125
|
+
} else {
|
126
|
+
packageJson.scripts.prepare = 'husky'; // Para Husky v9+
|
127
|
+
// ou 'husky install' para Husky v7/v8
|
128
|
+
// Detectar a versão do Husky instalada pode ser mais robusto aqui.
|
129
|
+
// Por simplicidade, vamos usar 'husky' assumindo v9+.
|
130
|
+
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
131
|
+
console.log('Script "prepare": "husky" adicionado/atualizado no package.json.');
|
132
|
+
}
|
133
|
+
}
|
134
|
+
} catch (error) {
|
135
|
+
console.warn('Não foi possível modificar o package.json para adicionar o script "prepare".', error);
|
136
|
+
}
|
137
|
+
|
138
|
+
console.log('\nConfiguração concluída com sucesso!');
|
139
|
+
console.log('Certifique-se de que as seguintes dependências estão instaladas no seu projeto:');
|
140
|
+
console.log(' npm install --save-dev husky lint-staged @biomejs/biome @caioms/biomejs-config');
|
141
|
+
console.log(' (ou use pnpm/yarn)');
|
142
|
+
console.log('\nPróximos passos:');
|
143
|
+
console.log('1. Adicione arquivos ao git stage (git add .).');
|
144
|
+
console.log('2. Tente fazer um commit (git commit -m "test").');
|
145
|
+
console.log('O Biome deve formatar seus arquivos automaticamente antes do commit.');
|
146
|
+
}
|
147
|
+
|
148
|
+
main();
|
package/package.json
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
{
|
2
|
+
"name": "@caioms/pre-git-auto-format",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"license": "MIT",
|
5
|
+
"main": "biome.json",
|
6
|
+
"private": false,
|
7
|
+
"bin": {
|
8
|
+
"setup-caioms-hooks": "./bin/setup.js"
|
9
|
+
},
|
10
|
+
"files": ["bin/"],
|
11
|
+
"peerDependencies": {
|
12
|
+
"husky": "^9.1.6",
|
13
|
+
"lint-staged": "^12.3.2",
|
14
|
+
"@caioms/biomejs-config": "^1.0.0"
|
15
|
+
}
|
16
|
+
}
|