UNPKG

create-esmx

Version:

A scaffold tool for creating Esmx projects

77 lines (76 loc) 2.56 kB
import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs"; import { dirname, join, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import { replaceTemplateVariables } from "./utils/index.mjs"; const __dirname = dirname(fileURLToPath(import.meta.url)); export function getEsmxVersion() { try { const packageJsonPath = resolve(__dirname, "../package.json"); const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8")); return packageJson.version || "latest"; } catch (error) { console.warn("Failed to read esmx version, using latest version"); return "latest"; } } export function getAvailableTemplates() { const templateDir = resolve(__dirname, "../template"); const templates = []; const templateFolders = readdirSync(templateDir, { withFileTypes: true }).filter((dirent) => dirent.isDirectory()).map((dirent) => dirent.name); for (const folder of templateFolders) { const name = folder; const packageJsonPath = resolve(templateDir, folder, "package.json"); let description = `${name} template`; if (existsSync(packageJsonPath)) { try { const packageJson = JSON.parse( readFileSync(packageJsonPath, "utf-8") ); if (packageJson.description) { description = packageJson.description; } templates.push({ folder, name, description }); } catch (error) { console.warn( `Warning: Failed to parse package.json for template '${folder}', skipping.` ); } } } return templates.sort((a, b) => a.name.localeCompare(b.name)); } export function isDirectoryEmpty(dirPath) { if (!existsSync(dirPath)) { return true; } const files = readdirSync(dirPath); const nonHiddenFiles = files.filter((file) => !file.startsWith(".")); return nonHiddenFiles.length === 0; } export function copyTemplateFiles(templatePath, targetPath, variables) { const files = readdirSync(templatePath); for (const file of files) { const filePath = join(templatePath, file); const targetFilePath = join(targetPath, file); const stat = statSync(filePath); if (stat.isDirectory()) { mkdirSync(targetFilePath, { recursive: true }); copyTemplateFiles(filePath, targetFilePath, variables); } else { let content = readFileSync(filePath, "utf-8"); content = replaceTemplateVariables(content, variables); writeFileSync(targetFilePath, content); } } }