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 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', () => {