UNPKG

venom-cli-toolkit

Version:

A sample CLI tool with advanced features

201 lines (200 loc) 7.17 kB
#!/usr/bin/env node import chalk from 'chalk'; import { Command } from 'commander'; import ora from 'ora'; import fs from 'fs'; import path from 'path'; import inquirer from 'inquirer'; import { execSync } from 'child_process'; import figlet from 'figlet'; const program = new Command(); const spinner = ora(); // Initialize spinner // Display CLI header with figlet console.log(chalk.cyanBright(figlet.textSync("VeNoM CLI", { font: 'Slant' }))); console.log(chalk.gray('Advanced CLI for project creation and management\n')); // CLI Version program.version('1.0.0').description('VeNoM CLI - Advanced CLI for project creation and management'); // Greet Command program .command('greet [name]') .description('Greet someone') .action((name) => { const greetingName = name || 'World'; console.log(chalk.greenBright(`Hello, ${greetingName}!`)); }); // Version Command program .command('version') .description('Show CLI version') .action(() => { console.log(chalk.blue(`VeNoM CLI version: ${program.version()}`)); }); // ASCII Art Command program .command('ascii') .description('Display ASCII art') .option('-t, --text <text>', 'Text for ASCII art', 'Hello') .action((options) => { console.log(chalk.yellow(figlet.textSync(options.text, { font: 'Standard' }))); }); // Create New Project Command program .command('new <projectName>') .description('Create a new project') .action((projectName) => { spinner.start('Initializing project setup...'); createNewProject(projectName); }); // Info Command program .command('info') .description('Display CLI info') .action(() => { console.log(chalk.green('VeNoM CLI - Developed by Vansh')); console.log(chalk.yellow('Visit my GitHub: https://github.com/VanshVala23')); }); // Exit Command program .command('exit') .description('Exit CLI') .action(() => { console.log(chalk.red('Goodbye! Exiting CLI...')); process.exit(0); }); /// Create New Project Function function createNewProject(projectName) { const projectPath = path.resolve(process.cwd(), projectName); if (fs.existsSync(projectPath)) { spinner.fail(`Project folder "${projectName}" already exists.`); return; } inquirer .prompt([ { type: 'list', name: 'template', message: 'Choose a project template:', choices: ['React', 'Node.js', 'TypeScript', 'Angular', 'Vite', 'Empty'], }, ]) .then(({ template }) => { spinner.succeed('Template selected'); fs.mkdirSync(projectPath); fs.writeFileSync(path.join(projectPath, 'README.md'), `# ${projectName}\n\nGenerated by VeNoM CLI.`); switch (template) { case 'React': setupReactProject(projectPath, projectName); break; case 'Node.js': setupNodeProject(projectPath, projectName); break; case 'TypeScript': setupTypeScriptProject(projectPath, projectName); break; case 'Angular': setupAngularProject(projectPath, projectName); break; case 'Vite': setupViteProject(projectPath, projectName); break; default: console.log(chalk.yellow('Empty project created.')); } }); } // Angular Project Setup function setupAngularProject(projectPath, projectName) { spinner.start('Setting up Angular project...'); try { execSync(`npx @angular/cli new ${projectName} --directory . --skip-install`, { cwd: projectPath, stdio: 'inherit' }); execSync('npm install', { cwd: projectPath, stdio: 'inherit' }); spinner.succeed('Angular project setup complete.'); console.log(chalk.cyan(`cd ${projectName}`)); console.log(chalk.cyan('npm start')); } catch (error) { spinner.fail('Failed to set up Angular project.'); console.error(error); } } // Vite Project Setup function setupViteProject(projectPath, projectName) { spinner.start('Setting up Vite project...'); try { execSync(`npx create-vite@latest ${projectName} -- --template react`, { cwd: process.cwd(), stdio: 'inherit' }); execSync('npm install --legacy-peer-deps', { cwd: projectPath, stdio: 'inherit' }); spinner.succeed('Vite project setup complete.'); console.log(chalk.cyan(`cd ${projectName}`)); console.log(chalk.cyan('npm run dev')); } catch (error) { spinner.fail('Failed to set up Vite project.'); console.error(error); } } // React Project Setup function setupReactProject(projectPath, projectName) { spinner.start('Setting up React project...'); try { execSync(`npx create-react-app ${projectName}`, { cwd: process.cwd(), stdio: 'inherit' }); spinner.succeed('React project setup complete.'); console.log(chalk.green(`Navigate to your project: cd ${projectName}`)); console.log(chalk.green('Start the development server: npm start')); } catch (error) { spinner.fail('Failed to set up React project.'); if (error instanceof Error) { console.error(chalk.red('Error:'), error.message); } } } // Node.js Project Setup function setupNodeProject(projectPath, projectName) { spinner.start('Setting up Node.js app...'); const packageJson = { name: projectName, version: '1.0.0', description: 'A Node.js application', main: 'index.js', scripts: { start: 'node index.js', }, }; fs.writeFileSync(path.join(projectPath, 'package.json'), JSON.stringify(packageJson, null, 2)); fs.writeFileSync(path.join(projectPath, 'index.js'), `console.log('Hello, ${projectName}!');`); try { execSync('npm install', { cwd: projectPath, stdio: 'inherit' }); spinner.succeed('Node.js project setup complete.'); } catch (error) { spinner.fail('Failed to install dependencies.'); console.error(error); } } // TypeScript Project Setup function setupTypeScriptProject(projectPath, projectName) { spinner.start('Setting up TypeScript app...'); const packageJson = { name: projectName, version: '1.0.0', description: 'A TypeScript application', main: 'index.ts', scripts: { start: 'ts-node src/index.ts', }, }; const srcPath = path.join(projectPath, 'src'); fs.mkdirSync(srcPath, { recursive: true }); fs.writeFileSync(path.join(srcPath, 'index.ts'), `console.log('Hello, ${projectName}!');`); fs.writeFileSync(path.join(projectPath, 'package.json'), JSON.stringify(packageJson, null, 2)); try { execSync('npm install typescript ts-node @types/node --save-dev', { cwd: projectPath, stdio: 'inherit' }); spinner.succeed('TypeScript project setup complete.'); } catch (error) { spinner.fail('Failed to install dependencies.'); console.error(error); } } // Start CLI program.parse(process.argv);