From f702628c1a653b51981e62e1735d1a3337ee0ddb Mon Sep 17 00:00:00 2001 From: Larkin Young Date: Mon, 16 Feb 2026 22:36:51 +0000 Subject: [PATCH] Fix bare-path guard to exclude single-segment sibling references Single-segment bare paths like "page-b.md" are sibling-file references that need normalizePath() to resolve. The bare-path pre-normalization check now requires at least one "/" to distinguish repo-root-relative paths (docs/markdown/autoapi/foo/) from sibling references. Bumps version to 0.14.4. --- packages/astro-github-loader/package.json | 2 +- .../src/github.link-transform.spec.ts | 33 +++++++++++++++++++ .../src/github.link-transform.ts | 9 +++-- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/packages/astro-github-loader/package.json b/packages/astro-github-loader/package.json index 3627e43..e683c63 100644 --- a/packages/astro-github-loader/package.json +++ b/packages/astro-github-loader/package.json @@ -1,7 +1,7 @@ { "name": "@larkiny/astro-github-loader", "type": "module", - "version": "0.14.3", + "version": "0.14.4", "description": "Load content from GitHub repositories into Astro content collections with asset management and content transformations", "keywords": [ "astro", diff --git a/packages/astro-github-loader/src/github.link-transform.spec.ts b/packages/astro-github-loader/src/github.link-transform.spec.ts index 4d33b09..e374c7f 100644 --- a/packages/astro-github-loader/src/github.link-transform.spec.ts +++ b/packages/astro-github-loader/src/github.link-transform.spec.ts @@ -211,6 +211,39 @@ describe("globalLinkTransform", () => { expect(result[0].content).toBe("[Overview](/overview/)"); }); + it("should not early-return single-segment bare-path sibling references", () => { + // Single-segment bare paths like "page-b.md" are sibling-file references. + // They must go through normalizePath() (joining with current dir) to resolve + // via sourceToTargetMap, NOT be caught by the bare-path pre-normalization check. + const files: ImportedFile[] = [ + createImportedFile( + "docs/api/page-a.md", + "src/content/docs/api/page-a.md", + "[See B](page-b.md#section)", + ), + createImportedFile( + "docs/api/page-b.md", + "src/content/docs/api/page-b.md", + "# Page B", + ), + ]; + + const result = globalLinkTransform(files, { + stripPrefixes: ["src/content/docs"], + linkMappings: [ + { + pattern: /\.md(#|$)/, + replacement: "$1", + global: true, + }, + ], + logger, + }); + + // "page-b.md" normalizes to "docs/api/page-b.md", resolves via sourceToTargetMap + expect(result[0].content).toBe("[See B](/api/page-b/#section)"); + }); + it("should preserve anchors in transformed links", () => { const files: ImportedFile[] = [ createImportedFile( diff --git a/packages/astro-github-loader/src/github.link-transform.ts b/packages/astro-github-loader/src/github.link-transform.ts index a8afd31..2905391 100644 --- a/packages/astro-github-loader/src/github.link-transform.ts +++ b/packages/astro-github-loader/src/github.link-transform.ts @@ -318,10 +318,13 @@ function transformLink( // Bare-path links (e.g., "docs/markdown/autoapi/foo/") are repo-root-relative // but normalizePath() treats them as file-relative, mangling the path. // Applying global mappings first lets patterns match the link as written. - // Only for bare paths — relative (./, ../) and absolute (/) links must flow - // through normalizePath() first to avoid over-matching by generic global - // mappings like .md-stripping from generateStarlightLinkMappings(). + // Only for multi-segment bare paths — relative (./, ../) and absolute (/) links + // must flow through normalizePath() first. Single-segment bare paths (no "/") + // like "api-algopy" or "types_amount.AlgoAmount" are sibling-file references + // that also need normalization, so we require at least one "/" to distinguish + // repo-root-relative paths from sibling references. const isBareBarePath = + linkPath.includes("/") && !linkPath.startsWith("./") && !linkPath.startsWith("../") && !linkPath.startsWith("/") &&