From 867535b03496379d36171decb3e2099bea77c248 Mon Sep 17 00:00:00 2001 From: Kevin Heis Date: Wed, 14 Jan 2026 13:27:58 -0800 Subject: [PATCH] Article API: Fix 403 errors for homepage, product, and search pages (#59148) --- src/article-api/transformers/index.ts | 2 ++ .../transformers/search-page-transformer.ts | 28 +++++++++++++++++++ .../transformers/toc-transformer.ts | 7 +++-- 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 src/article-api/transformers/search-page-transformer.ts diff --git a/src/article-api/transformers/index.ts b/src/article-api/transformers/index.ts index 7c56d4b55e9a..b65f846dca9f 100644 --- a/src/article-api/transformers/index.ts +++ b/src/article-api/transformers/index.ts @@ -16,6 +16,7 @@ import { CategoryLandingTransformer } from './category-landing-transformer' import { DiscoveryLandingTransformer } from './discovery-landing-transformer' import { ProductGuidesTransformer } from './product-guides-transformer' import { ProductLandingTransformer } from './product-landing-transformer' +import { SearchPageTransformer } from './search-page-transformer' /** * Global transformer registry @@ -40,6 +41,7 @@ transformerRegistry.register(new CategoryLandingTransformer()) transformerRegistry.register(new DiscoveryLandingTransformer()) transformerRegistry.register(new ProductGuidesTransformer()) transformerRegistry.register(new ProductLandingTransformer()) +transformerRegistry.register(new SearchPageTransformer()) export { TransformerRegistry } from './types' export type { PageTransformer } from './types' diff --git a/src/article-api/transformers/search-page-transformer.ts b/src/article-api/transformers/search-page-transformer.ts new file mode 100644 index 000000000000..c3756298ecc5 --- /dev/null +++ b/src/article-api/transformers/search-page-transformer.ts @@ -0,0 +1,28 @@ +import type { Context, Page } from '@/types' +import type { PageTransformer } from './types' + +/** + * Transformer for the search page (/en/search). + * This is a special UI-only page with no markdown content. + * Returns minimal markdown with just the title. + */ +export class SearchPageTransformer implements PageTransformer { + templateName = '' + + canTransform(page: Page): boolean { + // Only match the search page specifically + return page.relativePath === 'search/index.md' + } + + async transform(page: Page, _pathname: string, context: Context): Promise { + const title = await page.renderTitle(context, { unwrap: true }) + return `# ${title} + +Use the Search API to search programmatically: + +\`\`\` +curl "https://docs.github.com/api/search?query=actions&language=en&version=free-pro-team@latest" +\`\`\` +` + } +} diff --git a/src/article-api/transformers/toc-transformer.ts b/src/article-api/transformers/toc-transformer.ts index f74c38a7fa31..1ff9f79f1f9c 100644 --- a/src/article-api/transformers/toc-transformer.ts +++ b/src/article-api/transformers/toc-transformer.ts @@ -11,7 +11,7 @@ interface CategoryPage extends Page { /** * Transformer for table of contents (TOC) landing pages - pages with children but no specific layout. - * These are simple navigation pages (category/subcategory) that list child pages with titles and intros. + * These are simple navigation pages (category/subcategory/product/homepage) that list child pages with titles and intros. * Corresponds to TocLanding component in the web UI. */ export class TocTransformer implements PageTransformer { @@ -19,11 +19,12 @@ export class TocTransformer implements PageTransformer { canTransform(page: Page): boolean { // Transform pages that have children but no layout specified - // These are typically category or subcategory pages + // These are typically category, subcategory, product, or homepage pages const categoryPage = page as CategoryPage + const validDocTypes = ['category', 'subcategory', 'product', 'homepage'] return ( !page.layout && - (page.documentType === 'category' || page.documentType === 'subcategory') && + validDocTypes.includes(page.documentType) && !!categoryPage.children && categoryPage.children.length > 0 )