UNPKG

@eve-tools/cli

Version:

Everest cli to speed up project start-up and standardized frontend , backend architecture

106 lines (105 loc) 4.26 kB
#!/usr/bin/env node import figlet from 'figlet'; import { logger } from './utils/logger.js'; import { Command } from 'commander'; import { ARCHITECTURE, FRAMEWORK, LANGUAGE } from './constants/constants.js'; import { checkAndUpdateCli, upgradeCli } from './helpers/commands/upgrade.js'; import projectBuilder from './helpers/project-builder.js'; import { generatePromptSeries } from './prompts/index.js'; import { getEveCliVersion } from './utils/index.js'; const program = new Command(); const version = getEveCliVersion(); program .name('eve') .usage('<command> [options]') .version(version) .description('A CLI to generate a boilerplate project with the best practices') .action(() => { program.outputHelp(); }); logger.figlet(figlet.textSync('eve cli', { font: 'ANSI Shadow', })); await checkAndUpdateCli().catch((err) => logger.error('Update check failed')); process.removeAllListeners('warning'); program .command('init [name]') .description('Initialize a new project') .option('-t, --type <type>', 'Project type (frontend/backend)') .option('-a, --arch <architecture>', `Project architecture (${ARCHITECTURE.APPLICATION}/${ARCHITECTURE.CRUD})`) .option('-l, --lang <language>', `Programming language (${LANGUAGE.TS}/${LANGUAGE.NODE})`) .option('-f, --framework <framework>', `Project framework (${FRAMEWORK.NEXT}/${FRAMEWORK.NESTJS})`) .action(async (name, options) => { let projectMeta; const useFlags = options.type || options.arch || options.lang || options.framework || (name && name !== '.'); if (useFlags) { const projectName = name && name !== '.' ? name : '.'; const typeInput = options.type?.toLowerCase(); const finalType = typeInput === 'backend' || typeInput === 'b' ? 'Backend' : 'Frontend'; let finalArch; let finalLang; let finalFramework; if (finalType === 'Frontend') { finalArch = options.arch || ARCHITECTURE.APPLICATION; finalLang = options.lang || LANGUAGE.TS; finalFramework = options.framework || FRAMEWORK.NEXT; if (finalArch !== ARCHITECTURE.APPLICATION || finalLang !== LANGUAGE.TS || finalFramework !== FRAMEWORK.NEXT) { logger.error(`Invalid combination for Frontend. Currently supported: --arch ${ARCHITECTURE.APPLICATION} --lang ${LANGUAGE.TS} --framework ${FRAMEWORK.NEXT}`); process.exit(1); } } else { finalArch = options.arch || ARCHITECTURE.CRUD; finalLang = options.lang || LANGUAGE.NODE; finalFramework = options.framework || FRAMEWORK.NESTJS; if (finalArch !== ARCHITECTURE.CRUD || finalLang !== LANGUAGE.NODE || finalFramework !== FRAMEWORK.NESTJS) { logger.error(`Invalid combination for Backend. Currently supported: --arch ${ARCHITECTURE.CRUD} --lang ${LANGUAGE.NODE} --framework ${FRAMEWORK.NESTJS}`); process.exit(1); } } projectMeta = { name: projectName, type: finalType, architecture: finalArch, language: finalLang, framework: finalFramework, }; logger.info(`Initializing project '${projectName}' with flags:`); logger.info(` Type: ${projectMeta.type}`); logger.info(` Architecture: ${projectMeta.architecture}`); logger.info(` Language: ${projectMeta.language}`); logger.info(` Framework: ${projectMeta.framework}`); } else { logger.info('Starting interactive initialization...'); const result = await generatePromptSeries(); projectMeta = result.projectMeta; if (name && name !== '.') { projectMeta.name = name; } } await projectBuilder(projectMeta); }); program .command('upgrade') .description('Upgrade Eve CLI to the latest version') .action(async () => { await upgradeCli(); }); program .command('check-update') .description('Check for updates to the Eve CLI') .action(async () => { await checkAndUpdateCli(); }); program.parse();