zenith-gen
Version:
A CLI tool designed to streamline the creation of projects within the Zenith Inova ecosystem, providing optimized configurations and modern development tools.
84 lines (83 loc) • 3.82 kB
JavaScript
import chalk from 'chalk';
import path from 'path';
import fs from 'fs-extra';
import { projectNamePrompt } from './prompts/projectName.js';
import { packageManagerPrompt } from './prompts/packageManager.js';
import { createNextApp, defineAlias, nextJsPrompt } from './prompts/nextjs.js';
import { configureStorybook, installStorybook, storybookConfigsPrompt, storybookPrompt, } from './prompts/storybook.js';
import { configureNpmRc } from './prompts/npmrc.js';
import { configureNvmRc } from './prompts/nvmrc.js';
import { configureEnv } from './prompts/env.js';
import { configureESLint } from './prompts/eslint.js';
import { configurePrettier } from './prompts/prettier.js';
import { installShadCN, shadcnPrompt } from './prompts/shadcn.js';
import { installDevDependencies, installDependencies, } from './prompts/dependencies.js';
import { gitCommit } from './prompts/git.js';
async function main() {
console.clear();
console.log(chalk.hex('#633cff')('========================================'));
console.log(' Zenith Project Generator CLI');
console.log(chalk.hex('#633cff')('========================================'));
const useDefault = process.argv.includes('--default') || process.argv.includes('-d');
let packageManager = 'pnpm', useTs = true, useEslint = true, useSrc = true, useApp = true, useTurbo = true, customAlias = false, useShadcn = true, useStorybook = true, usePrettier = true, useStorybookDefaultConfig = false, useChromatic = true, alias = '@/*';
const projectName = await projectNamePrompt();
if (useDefault)
console.log(chalk.yellow('Using default settings...'));
else {
packageManager = await packageManagerPrompt();
console.log(chalk.blue('Creating Next.js project...'));
({
useTs,
useEslint,
usePrettier,
useSrc,
useApp,
useTurbo,
customAlias,
} = await nextJsPrompt());
const alias = await defineAlias(useDefault, customAlias);
useStorybook = await storybookPrompt();
if (useStorybook) {
({ useStorybookDefaultConfig, useChromatic } =
await storybookConfigsPrompt());
}
useShadcn = await shadcnPrompt();
}
const projectPath = path.join(process.cwd(), projectName);
try {
console.log(chalk.blue('Running Create Next App...'));
createNextApp(projectName, packageManager, useTs, useSrc, useTurbo, useApp, useEslint, alias);
console.log(chalk.green(`Next.js project created using ${packageManager}`));
}
catch (error) {
console.log(chalk.red('Failed to create Next.js project\nError: '), error);
return;
}
try {
fs.ensureDirSync(projectPath);
process.chdir(projectPath);
console.log(chalk.blue('Setting up configuration files...'));
configureNpmRc(projectPath);
configureNvmRc(projectPath);
configureEnv(projectPath, useChromatic);
installDevDependencies(packageManager, useEslint, useChromatic, useStorybook, usePrettier);
installDependencies(packageManager);
if (useShadcn)
installShadCN(packageManager);
if (useStorybook)
installStorybook(packageManager);
if (useEslint)
configureESLint(projectPath);
if (usePrettier)
configurePrettier(projectPath);
if (!useStorybookDefaultConfig)
configureStorybook(projectPath, useStorybook);
gitCommit();
console.log(chalk.green('Project setup completed successfully!'));
}
catch (error) {
console.log(chalk.red('Failed to setup the project\nError: '), error);
}
}
main().catch(err => console.error(chalk.red('Error: '), err));