From 94e075cfce4aa56aeb2a03b27f55f64ce230fbea Mon Sep 17 00:00:00 2001 From: Steve S Date: Thu, 16 Apr 2026 16:52:43 -0400 Subject: [PATCH 1/2] Remove query strings when normalizing links for dead link checks (#60815) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: steves <54561+steves@users.noreply.github.com> --- src/links/lib/extract-links.ts | 6 +++++- src/links/tests/extract-links.ts | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/links/lib/extract-links.ts b/src/links/lib/extract-links.ts index 328f3c4d9481..deac31b11964 100644 --- a/src/links/lib/extract-links.ts +++ b/src/links/lib/extract-links.ts @@ -288,13 +288,17 @@ export function getRelativePath(filePath: string): string { /** * Normalize a link path for comparison with pageMap * + * - Removes query strings * - Removes trailing slashes * - Removes anchor fragments * - Ensures leading slash */ export function normalizeLinkPath(href: string): string { + // Remove query string + let normalized = href.split('?')[0] + // Remove anchor - let normalized = href.split('#')[0] + normalized = normalized.split('#')[0] // Remove trailing slash if (normalized.endsWith('/') && normalized.length > 1) { diff --git a/src/links/tests/extract-links.ts b/src/links/tests/extract-links.ts index 2f7f9a0ec860..bdf7b73decf6 100644 --- a/src/links/tests/extract-links.ts +++ b/src/links/tests/extract-links.ts @@ -243,6 +243,22 @@ describe('normalizeLinkPath', () => { '/en/enterprise-server@3.10/admin/overview', ) }) + + test('removes query string', () => { + expect(normalizeLinkPath('/actions/guides?tab=cli')).toBe('/actions/guides') + }) + + test('removes query string before anchor fragment', () => { + expect(normalizeLinkPath('/actions/guides?tab=cli#section')).toBe('/actions/guides') + }) + + test('removes query string with trailing slash', () => { + expect(normalizeLinkPath('/actions/guides/?tab=cli')).toBe('/actions/guides') + }) + + test('handles path with only a query string (no anchor)', () => { + expect(normalizeLinkPath('/repositories/overview?version=3')).toBe('/repositories/overview') + }) }) describe('checkInternalLink', () => { From 948e8153fcb04d4adc0ed676883986254ce1b333 Mon Sep 17 00:00:00 2001 From: Kevin Heis Date: Thu, 16 Apr 2026 14:37:16 -0700 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=90=9E=20Fix=20docsTeamMetrics=20seri?= =?UTF-8?q?alization=20error=20(#60820)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/frame/components/context/MainContext.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frame/components/context/MainContext.tsx b/src/frame/components/context/MainContext.tsx index b837c2cf47ef..57b852b9354f 100644 --- a/src/frame/components/context/MainContext.tsx +++ b/src/frame/components/context/MainContext.tsx @@ -125,7 +125,7 @@ export type MainContextT = { hidden: boolean noEarlyAccessBanner: boolean applicableVersions: string[] - docsTeamMetrics?: string[] + docsTeamMetrics: string[] | null } | null relativePath?: string sidebarTree?: ProductTreeNode | null @@ -228,7 +228,7 @@ export const getMainContext = async (req: any, res: any): Promise applicableVersions: req.context.page?.permalinks.map((obj: any) => obj.pageVersion) || [], hidden: req.context.page.hidden || false, noEarlyAccessBanner: req.context.page.noEarlyAccessBanner || false, - docsTeamMetrics: req.context.page.docsTeamMetrics || undefined, + docsTeamMetrics: req.context.page.docsTeamMetrics || null, }) || null