create-esmx
Version:
A scaffold tool for creating Esmx projects
77 lines (76 loc) • 2.56 kB
JavaScript
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);
}
}
}