create-next15-tailwind4-guibus-template
Version:
CLI para criar um projeto Next.js 15 + Tailwind 4 rapidamente
128 lines (109 loc) • 3.82 kB
JavaScript
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();