import { readdirSync, readFileSync, statSync } from 'fs' import { join, relative } from 'path' import { DEFAULT_EMOJI } from './types' export type TemplateType = 'ssr' | 'bare' | 'spa' export type AppTemplates = Record interface TemplateVars { APP_NAME: string APP_EMOJI: string } const TEMPLATES_DIR = join(import.meta.dirname, '../../templates') function readDir(dir: string): string[] { const files: string[] = [] for (const entry of readdirSync(dir)) { const path = join(dir, entry) if (statSync(path).isDirectory()) { files.push(...readDir(path)) } else { files.push(path) } } return files } function replaceVars(content: string, vars: TemplateVars): string { return content .replace(/\$\$APP_NAME\$\$/g, vars.APP_NAME) .replace(/\$\$APP_EMOJI\$\$/g, vars.APP_EMOJI) } export function generateTemplates(appName: string, template: TemplateType = 'ssr'): AppTemplates { const vars: TemplateVars = { APP_NAME: appName, APP_EMOJI: DEFAULT_EMOJI, } const result: AppTemplates = {} // Read shared files from templates/ for (const filename of ['.npmrc', 'package.json', 'tsconfig.json']) { const path = join(TEMPLATES_DIR, filename) const content = readFileSync(path, 'utf-8') result[filename] = replaceVars(content, vars) } // Read template-specific files const templateDir = join(TEMPLATES_DIR, template) for (const path of readDir(templateDir)) { const filename = relative(templateDir, path) const content = readFileSync(path, 'utf-8') result[filename] = replaceVars(content, vars) } return result }