Files
reactwizard/src/setup/init.js
2025-07-01 22:05:23 -04:00

71 lines
2.4 KiB
JavaScript

const path = require('path');
const { execSync } = require('child_process');
const ora = require('ora');
const fs = require('fs');
const { installDependencies } = require('./dependencies');
const { installDevDependencies } = require('./devDependencies');
const { setupHusky } = require('./husky');
const { setupRedux } = require('./redux');
const { setupZustand } = require('./zustand');
const { setupStyles } = require('./styles');
const { setupGit } = require('./gitInit');
const { setupTesting } = require('./testing');
const { createAtomicStructure } = require('../templates/atomicStructure');
const { updatePackageJson } = require('../templates/packageJson');
const { askUserWhereToOpen } = require('../utils/logging');
const inquirer = require('inquirer');
async function initProject(projectDirectory, userInput, options) {
const root = path.resolve(projectDirectory);
const verboseFlag = options.verbose ? '--verbose' : '';
// Create the project directory
fs.mkdirSync(root, { recursive: true });
process.chdir(root);
console.log(`🚀 Creating a new React app in ${root}...`);
const spinner = ora('Installing base Vite React App...').start();
try {
// Initialize Vite with or without TypeScript
const template = userInput.language === 'TypeScript' ? '--template react-ts' : '--template react';
execSync(`npm create vite@latest . ${template} ${verboseFlag}`, { stdio: 'inherit' });
spinner.succeed('✅ Base Vite app created successfully.');
} catch (error) {
spinner.fail('❌ Failed to create base Vite app.');
console.error(error);
process.exit(1);
}
// Set up Git
setupGit(options);
// Install additional dependencies
installDependencies(userInput, options);
// Install additional dev dependencies
installDevDependencies(options);
// Set up additional features based on user input
if (userInput.useHusky) setupHusky(options);
if (userInput.stateLibrary === 'Redux Toolkit') {
setupRedux(options);
} else if (userInput.stateLibrary === 'Zustand') {
setupZustand(options);
}
setupStyles(userInput.styling);
setupTesting(userInput.testingFramework);
// Create atomic design structure
createAtomicStructure();
// Update package.json
updatePackageJson(userInput);
console.log('🎉 Project setup complete!');
// Ask user where to open the project
askUserWhereToOpen(root);
}
module.exports = { initProject };