UNPKG

create-electron-foundation

Version:

An interactive CLI to bootstrap a modern, type-safe, and scalable Electron application.

71 lines (70 loc) 4.01 kB
import path from 'path'; import fs from 'fs'; import * as p from '@clack/prompts'; // TERMINAL import ora from 'ora'; import chalk from 'chalk'; // UTILS import { logger } from '../utils/logger.js'; import { PKG_ROOT } from '../consts.js'; import { FileSystemError } from '../utils/errors.js'; export const scaffoldProject = async (config) => { /** * Copies configuration agnostic Electron base template files into the * users new project directory * ####################################################################### */ const spinner = ora(`${chalk.blue(config.project_name)} ${chalk.bold('Scaffolding')} in: ${config.project_dir}...`).start(); const srcDir = path.join(PKG_ROOT, 'template/base'); // CHECK: if the project directory already exists if (fs.existsSync(config.project_dir)) { const shouldOverwrite = await p.confirm({ message: `${chalk.bold.red('Directory already exists: ')}${chalk.red('Backup this directory and continue? > ')}${chalk.red(config.project_dir)}`, initialValue: false, }); if (!shouldOverwrite) { throw new FileSystemError(`Directory ${config.project_dir} already exists and user chose not to overwrite`, config.project_dir); } // Backup existing directory const backupPath = `${config.project_dir}.backup.${Date.now()}`; try { fs.renameSync(config.project_dir, backupPath); logger.info(`📦 Existing directory backed up to: ${backupPath}`); } catch (error) { throw new FileSystemError(`Failed to backup existing directory: ${config.project_dir}`, config.project_dir, error); } } // COPY: base template files into the users new project directory fs.cpSync(srcDir, config.project_dir, { recursive: true }); // UPDATE: .env.production & .env.development const devEnvContent = `CUSTOM_ENV_VAR=my-custom-env-var\nAPP_NAME=${config.project_name}\nCEF_FRAMEWORK=Electron\nCEF_ROUTER=${config.packages.router}\nCEF_STYLES=${config.packages.styles || 'Vanilla CSS'}\nCEF_DATABASE=${config.packages.database || 'false'}\nCEF_ORM=${config.packages.orm || 'false'}`; const devEnvFilePath = path.join(config.project_dir, '.env.development'); fs.writeFileSync(devEnvFilePath, devEnvContent); const prodEnvContent = `CUSTOM_ENV_VAR=my-custom-env-var\nAPP_NAME=${config.project_name}\nCEF_FRAMEWORK=Electron\nCEF_ROUTER=${config.packages.router}\nCEF_STYLES=${config.packages.styles || 'Vanilla CSS'}\nCEF_DATABASE=${config.packages.database || 'false'}\nCEF_ORM=${config.packages.orm || 'false'}`; const prodEnvFilePath = path.join(config.project_dir, '.env.production'); fs.writeFileSync(prodEnvFilePath, prodEnvContent); // RENAME: copied _gitignore to .gitignore fs.renameSync(path.join(config.project_dir, '_gitignore'), path.join(config.project_dir, '.gitignore')); // UPDATE: index.html title const indexPath = path.join(config.project_dir, 'index.html'); let indexHtmlContent = fs.readFileSync(indexPath, 'utf-8'); let titleCopy = `ELECTRON`; const routerCopy = config.packages.router .split('-') .map((el) => el.toUpperCase()) .join(' '); titleCopy += ` : ${routerCopy}`; const stylesCopy = config.packages.styles === 'tailwind' ? 'TAILWIND CSS' : 'VANILLA CSS'; titleCopy += ` : ${stylesCopy}`; if (config.packages.database) { const databaseCopy = config.packages.database === 'sqlite' ? 'SQLITE' : 'NONE'; titleCopy += ` : ${databaseCopy}`; } if (config.packages.orm) { const ormCopy = config.packages.orm === 'drizzle' ? 'DRIZZLE' : 'NONE'; titleCopy += ` : ${ormCopy}`; } indexHtmlContent = indexHtmlContent.replace(/<title>.*<\/title>/, `<title>${titleCopy}</title>`); fs.writeFileSync(indexPath, indexHtmlContent); spinner.succeed(`${chalk.blue(config.project_name)} ${chalk.bold.green('scaffolded')} successfully!`); };