import JSON5 from "json5"; import { describe, expect, it } from "vitest"; import { parseFrontmatterBlock } from "./frontmatter.js"; describe("parseFrontmatterBlock", () => { it("parses YAML block scalars", () => { const content = `--- name: yaml-hook description: | line one line two --- `; const result = parseFrontmatterBlock(content); expect(result.name).toBe("yaml-hook"); expect(result.description).toBe("line one\nline two"); }); it("handles JSON5-style multi-line metadata", () => { const content = `--- name: session-memory metadata: { "openclaw": { "emoji": "disk", "events": ["command:new"], }, } --- `; const result = parseFrontmatterBlock(content); expect(result.metadata).toBeDefined(); const parsed = JSON5.parse(result.metadata ?? ""); expect(parsed.openclaw?.emoji).toBe("disk"); }); it("preserves inline JSON values", () => { const content = `--- name: inline-json metadata: {"openclaw": {"events": ["test"]}} --- `; const result = parseFrontmatterBlock(content); expect(result.metadata).toBe('{"openclaw": {"events": ["test"]}}'); }); it("stringifies YAML objects and arrays", () => { const content = `--- name: yaml-objects enabled: true retries: 3 tags: - alpha - beta metadata: openclaw: events: - command:new --- `; const result = parseFrontmatterBlock(content); expect(result.enabled).toBe("true"); expect(result.retries).toBe("3"); expect(JSON.parse(result.tags ?? "[]")).toEqual(["alpha", "beta"]); const parsed = JSON5.parse(result.metadata ?? ""); expect(parsed.openclaw?.events).toEqual(["command:new"]); }); it("returns empty when frontmatter is missing", () => { const content = "# No frontmatter"; expect(parseFrontmatterBlock(content)).toEqual({}); }); });