UNPKG

create-esmx

Version:

A scaffold tool for creating Esmx projects

107 lines (106 loc) 3.71 kB
import { existsSync, mkdirSync, writeFileSync } from "node:fs"; import { mkdir, mkdtemp, rm } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { copyTemplateFiles, getAvailableTemplates, getEsmxVersion, isDirectoryEmpty } from "./template.mjs"; async function createTempDir(prefix = "esmx-template-test-") { return mkdtemp(join(tmpdir(), prefix)); } async function cleanupTempDir(tempDir) { try { await rm(tempDir, { recursive: true, force: true }); } catch (error) { console.warn(`Failed to cleanup temp directory: ${tempDir}`, error); } } describe("template unit tests", () => { let tmpDir; beforeEach(async () => { tmpDir = await createTempDir(); }); afterEach(async () => { await cleanupTempDir(tmpDir); }); it("should get Esmx version from package.json", () => { const version = getEsmxVersion(); expect(typeof version).toBe("string"); expect(version.length).toBeGreaterThan(0); }); it("should get available templates", () => { const templates = getAvailableTemplates(); expect(templates.length).toBeGreaterThan(0); expect(templates[0]).toHaveProperty("folder"); expect(templates[0]).toHaveProperty("name"); expect(templates[0]).toHaveProperty("description"); }); it("should detect empty directory", async () => { const emptyDir = join(tmpDir, "empty"); await mkdir(emptyDir); expect(isDirectoryEmpty(emptyDir)).toBe(true); const hiddenDir = join(tmpDir, "hidden"); await mkdir(hiddenDir); writeFileSync(join(hiddenDir, ".hiddenfile"), "hidden"); expect(isDirectoryEmpty(hiddenDir)).toBe(true); const nonEmptyDir = join(tmpDir, "non-empty"); await mkdir(nonEmptyDir); writeFileSync(join(nonEmptyDir, "visible.txt"), "visible"); expect(isDirectoryEmpty(nonEmptyDir)).toBe(false); }); it("should copy template files with variable replacement", () => { const templateDir = join(tmpDir, "template"); const targetDir = join(tmpDir, "target"); mkdirSync(templateDir, { recursive: true }); mkdirSync(join(templateDir, "src"), { recursive: true }); mkdirSync(targetDir, { recursive: true }); writeFileSync( join(templateDir, "package.json"), JSON.stringify({ name: "{{projectName}}", version: "1.0.0", dependencies: { esmx: "{{esmxVersion}}" }, scripts: { dev: "{{devCommand}}", build: "{{buildCommand}}" } }) ); writeFileSync( join(templateDir, "src", "index.ts"), 'console.log("Welcome to {{projectName}}!");' ); copyTemplateFiles(templateDir, targetDir, { projectName: "test-project", esmxVersion: "1.2.3", devCommand: "npm run dev", buildCommand: "npm run build", installCommand: "npm install", startCommand: "npm start", buildTypeCommand: "npm run build:type", lintTypeCommand: "npm run lint:type" }); expect(existsSync(join(targetDir, "package.json"))).toBe(true); expect(existsSync(join(targetDir, "src", "index.ts"))).toBe(true); const packageJson = JSON.parse( require("node:fs").readFileSync( join(targetDir, "package.json"), "utf-8" ) ); expect(packageJson.name).toBe("test-project"); expect(packageJson.dependencies.esmx).toBe("1.2.3"); expect(packageJson.scripts.dev).toBe("npm run dev"); const indexContent = require("node:fs").readFileSync( join(targetDir, "src", "index.ts"), "utf-8" ); expect(indexContent).toBe('console.log("Welcome to test-project!");'); }); });