From e0a708a8f871c9a44e6e670e4219696dbcb52823 Mon Sep 17 00:00:00 2001 From: kutluhaneth46 Date: Sat, 5 Sep 2026 02:19:04 +0000 Subject: [PATCH] fix(scripts): parse slashless .mintignore directory globs loadMintIgnore assumed directory patterns always started with `/`, so `draft-notes/*` was stored as `raft-notes` and never matched. Strip an optional leading slash before removing the `/*` suffix, and cover both forms with unit tests. Fixes #1819 Co-authored-by: Cursor --- .../__tests__/docs-utils-mintignore.test.mjs | 40 +++++++++++++++++++ scripts/lib/docs-utils.js | 5 ++- 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 scripts/__tests__/docs-utils-mintignore.test.mjs diff --git a/scripts/__tests__/docs-utils-mintignore.test.mjs b/scripts/__tests__/docs-utils-mintignore.test.mjs new file mode 100644 index 000000000..27f398ae9 --- /dev/null +++ b/scripts/__tests__/docs-utils-mintignore.test.mjs @@ -0,0 +1,40 @@ +import { test } from "node:test"; +import assert from "node:assert/strict"; +import fs from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import { createRequire } from "node:module"; + +const require = createRequire(import.meta.url); +const { loadMintIgnore } = require("../lib/docs-utils.js"); + +function writeMintignore(contents) { + const dir = fs.mkdtempSync(path.join(os.tmpdir(), "mintignore-")); + const file = path.join(dir, ".mintignore"); + fs.writeFileSync(file, contents); + return file; +} + +test("loadMintIgnore keeps directory names for leading-slash globs", () => { + const file = writeMintignore("/draft-notes/*\n"); + const ignored = loadMintIgnore(file); + assert.deepEqual([...ignored.dirs], ["draft-notes"]); +}); + +test("loadMintIgnore keeps directory names for slashless globs", () => { + const file = writeMintignore("draft-notes/*\n"); + const ignored = loadMintIgnore(file); + assert.deepEqual([...ignored.dirs], ["draft-notes"]); +}); + +test("loadMintIgnore still supports nested directory globs with or without slash", () => { + const file = writeMintignore("/apps/legacy/*\napps/draft/*\n"); + const ignored = loadMintIgnore(file); + assert.deepEqual([...ignored.dirs].sort(), ["apps/draft", "apps/legacy"]); +}); + +test("loadMintIgnore ignores empty /* patterns", () => { + const file = writeMintignore("/*\n"); + const ignored = loadMintIgnore(file); + assert.deepEqual([...ignored.dirs], []); +}); diff --git a/scripts/lib/docs-utils.js b/scripts/lib/docs-utils.js index 88f822341..60d23e077 100644 --- a/scripts/lib/docs-utils.js +++ b/scripts/lib/docs-utils.js @@ -80,7 +80,10 @@ function loadMintIgnore(mintignorePath) { const trimmed = line.trim(); if (!trimmed || trimmed.startsWith('#')) continue; if (trimmed.endsWith('/*')) { - ignored.dirs.add(trimmed.slice(1, -2)); + // Accept both `/foo/*` and `foo/*`. The previous `slice(1, -2)` assumed a + // leading slash, so `draft-notes/*` was stored as `raft-notes`. + const dir = trimmed.replace(/^\//, '').slice(0, -2); + if (dir) ignored.dirs.add(dir); } else if (trimmed.startsWith('/')) { ignored.files.add(trimmed.slice(1)); } else {