From 9a312f76ade6020138db0d1d7d99f440ba084bda Mon Sep 17 00:00:00 2001 From: hypercross Date: Tue, 7 Jul 2026 19:07:37 +0800 Subject: [PATCH] fix(completions): instantiate Slugger per file Move Slugger instantiation inside the file loops to prevent state leakage between files, as Slugger is stateful. --- src/cli/completions/sources/spark-tables.ts | 5 ++++- src/components/journal/completions.ts | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/cli/completions/sources/spark-tables.ts b/src/cli/completions/sources/spark-tables.ts index a47bf0b..ebfc26d 100644 --- a/src/cli/completions/sources/spark-tables.ts +++ b/src/cli/completions/sources/spark-tables.ts @@ -25,11 +25,14 @@ export const sparkTablesSource: CompletionSource = { scan(index) { const items: SparkTableCompletion[] = []; - const slugger = new Slugger(); for (const [filePath, content] of Object.entries(index)) { if (!filePath.endsWith(".md")) continue; + // Fresh slugger per file so duplicate headers across files don't + // pollute each other. (github-slugger is stateful.) + const slugger = new Slugger(); + const lines = content.split(/\r?\n/); for (let i = 0; i < lines.length; i++) { const headerCells = splitTableRow(lines[i]); diff --git a/src/components/journal/completions.ts b/src/components/journal/completions.ts index c719a7f..8029424 100644 --- a/src/components/journal/completions.ts +++ b/src/components/journal/completions.ts @@ -81,12 +81,15 @@ async function scanClientSide(): Promise { const links: LinkCompletion[] = []; const sparkTables: SparkTableCompletion[] = []; const tagRegex = /]*>\s*([\s\S]*?)\s*<\/md-dice>/gi; - const slugger = new Slugger(); for (const filePath of paths) { const content = await getIndexedData(filePath); if (!content) continue; + // Fresh slugger per file so duplicate headers across files don't + // pollute each other. + const slugger = new Slugger(); + // Dice scan let match: RegExpExecArray | null; tagRegex.lastIndex = 0;