testes/.agent/scripts/create-hook.js

77 lines
1.8 KiB
JavaScript

#!/usr/bin/env node
/**
* Script: Criar novo hook customizado
* Uso: node create-hook.js useNomeDoHook [feature]
* Exemplo: node create-hook.js useUserData rh
*/
const fs = require('fs');
const path = require('path');
const [, , hookName, feature] = process.argv;
if (!hookName || !hookName.startsWith('use')) {
console.error('❌ Nome do hook é obrigatório e deve começar com "use"!');
console.log('Uso: node create-hook.js useNomeDoHook [feature]');
process.exit(1);
}
// Definir caminho
const basePath = feature
? path.join(__dirname, '../../src/features', feature, 'hooks')
: path.join(__dirname, '../../src/hooks');
const fileName = `${hookName}.js`;
const filePath = path.join(basePath, fileName);
// Criar pasta se não existir
if (!fs.existsSync(basePath)) {
fs.mkdirSync(basePath, { recursive: true });
}
// Template do hook
const hookTemplate = `import { useState, useEffect } from 'react';
/**
* ${hookName} - Hook customizado
* @returns {Object} - Estado e funções do hook
*/
export const ${hookName} = () => {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
useEffect(() => {
// Implementar lógica
}, []);
const handleAction = async () => {
try {
setLoading(true);
// Implementar ação
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
};
return {
data,
loading,
error,
handleAction,
};
};
`;
// Escrever arquivo
fs.writeFileSync(filePath, hookTemplate);
console.log(`✅ Hook ${hookName} criado com sucesso!`);
console.log(`📁 Caminho: ${filePath}`);
console.log(`\n📝 Próximos passos:`);
console.log(`1. Implementar lógica do hook`);
console.log(`2. Adicionar testes se necessário`);
console.log(`3. Importar nas views que precisam`);