#!/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`);