#!/usr/bin/env node import chalk from 'chalk' import shell from 'shelljs' import * as prompts from '@clack/prompts' import { createQuestions } from './utils/prompts.js' import { handleSelectedFeatures, resolveSelectedFeatures } from './utils/features.js' import { createDirectoryContents, createProject, installPackages, renderTemplateContents, } from './utils/filemanager.js' import { extrasPath } from './utils/config.js' console.clear() prompts.intro(chalk.green('Lets start building your new project')) const answers = await createQuestions() const projectName = answers.name.trim().replace(' ', '-') const spinner = prompts.spinner() spinner.start('Creating project...') try { const extraDependencies: string[] = [] const extraDevDependencies: string[] = [] const selectedFeatures = answers.template === 'base' ? resolveSelectedFeatures(answers.features) : [] const renderContext = { projectName, features: selectedFeatures, hasPwa: selectedFeatures.includes('PWA'), hasNotifications: selectedFeatures.includes('Notifications'), } const { targetPath } = createProject(projectName) renderTemplateContents(projectName, answers.template, renderContext) createDirectoryContents(projectName, extrasPath, renderContext) if (answers.template === 'base') { const { dependencies, devDependencies } = handleSelectedFeatures( targetPath, selectedFeatures ) extraDependencies.push(...dependencies) extraDevDependencies.push(...devDependencies) } if (answers.install) { installPackages(targetPath) if (extraDependencies.length > 0) { installPackages(targetPath, `pnpm i ${extraDependencies.join(' ')}`) } if (extraDevDependencies.length > 0) { installPackages(targetPath, `pnpm i -D ${extraDevDependencies.join(' ')}`) } } const hasGit = shell.which('git') if (answers.git && hasGit.code === 0) { shell.cd(targetPath) shell.exec('git init') shell.exec('git add .') shell.exec(`git commit -m 'Project created based on template'`) } spinner.stop('Project created successfully') prompts.note(`cd ${projectName}`, 'Go into the project') prompts.outro(chalk.green('All set!')) } catch (error) { spinner.stop(chalk.red('Error creating project')) console.error(error) process.exit(1) }