UNPKG

create-next15-tailwind4-guibus-template

Version:

CLI para criar um projeto Next.js 15 + Tailwind 4 rapidamente

128 lines (109 loc) 3.82 kB
#!/usr/bin/env node import path from 'path'; import { fileURLToPath } from 'url'; import fs from 'fs-extra'; import prompts from 'prompts'; import { execSync } from 'child_process'; import which from 'which'; import ora from 'ora'; // Corrige __dirname no ESM const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // Caminho para o seu template const templatePath = path.join(__dirname, 'template'); // Função para checar se um comando existe function isCommandAvailable(command) { try { which.sync(command); return true; } catch { return false; } } // Função principal async function main() { console.log('\n🚀 Bem-vindo ao criador de projetos!'); // Primeiro tenta pegar da linha de comando let projectName = process.argv[2]; // Se não tiver passado, pergunta if (!projectName) { const response = await prompts({ type: 'text', name: 'projectName', message: 'Qual o nome do projeto?', validate: name => name ? true : 'O nome do projeto não pode ser vazio!', }); projectName = response.projectName; } const targetPath = path.join(process.cwd(), projectName); // Spinner copiando template const copySpinner = ora('🔄 Copiando template...').start(); try { await fs.copy(templatePath, targetPath); copySpinner.succeed('✅ Template copiado com sucesso!'); } catch (err) { copySpinner.fail('❌ Falha ao copiar o template!'); console.error(err); process.exit(1); } console.log(`\n📂 Projeto ${projectName} criado!`); // Perguntar qual gerenciador de pacotes usar const { packageManager } = await prompts({ type: 'select', name: 'packageManager', message: 'Qual gerenciador de pacotes você quer usar?', choices: [ { title: 'npm', value: 'npm' }, { title: 'yarn', value: 'yarn' }, { title: 'pnpm', value: 'pnpm' }, ], initial: 0, }); // Perguntar se quer rodar install const { shouldInstall } = await prompts({ type: 'confirm', name: 'shouldInstall', message: `Deseja rodar "${packageManager} install" agora?`, initial: true, }); if (shouldInstall) { const installSpinner = ora(`🔧 Instalando dependências com ${packageManager}...`).start(); try { execSync(`${packageManager} install`, { cwd: targetPath, stdio: 'ignore' }); installSpinner.succeed('✅ Dependências instaladas!'); } catch (err) { installSpinner.fail(`❌ Falha ao instalar dependências com ${packageManager}!`); console.error(err); console.log(`\n👉 Rode manualmente depois:`); console.log(`cd ${projectName}`); console.log(`${packageManager} install`); } } else { console.log(`\n👉 Rode manualmente depois:\n`); console.log(`cd ${projectName}`); console.log(`${packageManager} install`); } // Perguntar se quer abrir no VSCode const { shouldOpenVSCode } = await prompts({ type: 'confirm', name: 'shouldOpenVSCode', message: 'Deseja abrir o projeto no VSCode?', initial: true, }); if (shouldOpenVSCode) { if (isCommandAvailable('code')) { const openSpinner = ora('🚀 Abrindo projeto no VSCode...').start(); try { execSync('code .', { cwd: targetPath, stdio: 'ignore' }); openSpinner.succeed('✅ Projeto aberto no VSCode!'); } catch (err) { openSpinner.fail('❌ Não foi possível abrir o VSCode!'); console.error(err); } } else { console.log('\n⚠️ Comando "code" não encontrado! Instale o VSCode ou adicione "code" ao PATH.'); } } console.log('\n🎉 Tudo pronto! Bom código!'); } main();