venom-cli-toolkit
Version:
A sample CLI tool with advanced features
201 lines (200 loc) • 7.17 kB
JavaScript
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);