import fs from "node:fs/promises"; import path from "node:path"; import { TemplateManager } from "./TemplateManager.js"; import { getAppDir } from "../utils/utils.js"; export { TemplateManager }; interface TemplateMetadata { name: string; version: string; description: string; author: string; created: string; type: string; } export class TemplateService { private readonly templatesPath: string; constructor(templatesPath?: string) { this.templatesPath = templatesPath || path.join(getAppDir(), "templates"); } async getTemplate(name: string): Promise { const metadataPath = path.join(this.templatesPath, name, "metadata.json"); try { const data = await fs.readFile(metadataPath, "utf-8"); return JSON.parse(data) as TemplateMetadata; } catch { return null; } } async updateTemplate(name: string, metadata: Partial): Promise { const currentMetadata = await this.getTemplate(name); if (!currentMetadata) { return false; } const updatedMetadata = { ...currentMetadata, ...metadata }; const metadataPath = path.join(this.templatesPath, name, "metadata.json"); await fs.writeFile(metadataPath, JSON.stringify(updatedMetadata, null, 2)); return true; } async deleteTemplate(name: string): Promise { const templatePath = path.join(this.templatesPath, name); try { await fs.rm(templatePath, { recursive: true, force: true }); return true; } catch { return false; } } async listTemplates(): Promise { const templates: TemplateMetadata[] = []; try { // 确保templates文件夹存在 await fs.mkdir(this.templatesPath, { recursive: true }); const entries = await fs.readdir(this.templatesPath, { withFileTypes: true }); for (const entry of entries) { if (entry.isDirectory()) { const metadata = await this.getTemplate(entry.name); if (metadata) { templates.push(metadata); } } } } catch { return []; } return templates; } async templateExists(name: string): Promise { const metadataPath = path.join(this.templatesPath, name, "metadata.json"); try { await fs.access(metadataPath); return true; } catch { return false; } } }