@eve-tools/cli
Version:
Everest cli to speed up project start-up and standardized frontend , backend architecture
106 lines (105 loc) • 4.26 kB
JavaScript
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();