fix(core): bypass gray-matter content cache when parsing frontmatter (#51245)

This commit is contained in:
holny
2026-10-08 00:05:37 +08:00
committed by GitHub
Unverified
parent 70c6c8cbc5
commit d5154fb74e
2 changed files with 41 additions and 2 deletions
+6 -2
View File
@@ -2,10 +2,14 @@ export * as ConfigMarkdown from "./markdown.js"
import matter from "gray-matter"
export function parse(content: string) {
// Passing options bypasses gray-matter's module-global content cache, which
// it populates before parsing: a failed YAML parse poisons the entry and
// every later parse of the same content replays it without throwing, so the
// sanitize fallback below never runs. Upstream: jonschlinkert/gray-matter#166.
try {
return matter(content)
return matter(content, {})
} catch {
return matter(sanitize(content))
return matter(sanitize(content), {})
}
}
@@ -0,0 +1,35 @@
import { describe, expect, test } from "bun:test"
import { ConfigMarkdown } from "@opencode/core/config/markdown"
const invalidYaml = `---
description: Use when the user needs to crawl pages. Keywords: crawl, scrape
---
body`
describe("ConfigMarkdown.parse", () => {
test("recovers unquoted-colon frontmatter via the sanitize fallback", () => {
const parsed = ConfigMarkdown.parse(invalidYaml)
expect(parsed.data.description).toBe("Use when the user needs to crawl pages. Keywords: crawl, scrape")
expect(parsed.content.trim()).toBe("body")
})
test("recovers the same content again after a previous failed parse", () => {
// gray-matter caches by content before parsing; a poisoned entry used to
// make every later parse of the same text return silently without data.
expect(() => ConfigMarkdown.parse("---\ndescription: [unclosed\n---\nbody")).toThrow()
const parsed = ConfigMarkdown.parse(invalidYaml)
expect(parsed.data.description).toBe("Use when the user needs to crawl pages. Keywords: crawl, scrape")
})
test("keeps throwing for the same unparseable content on every call", () => {
const input = "---\ndescription: [unclosed\n---\nbody"
expect(() => ConfigMarkdown.parse(input)).toThrow()
expect(() => ConfigMarkdown.parse(input)).toThrow()
})
test("parses plain content without frontmatter", () => {
const parsed = ConfigMarkdown.parse("just body")
expect(parsed.content).toBe("just body")
expect(parsed.data).toEqual({})
})
})