71 lines
2.4 KiB
JavaScript
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 };
|