diff --git a/.github/scripts/http-e2e.sh b/.github/scripts/http-e2e.sh index bccb9491102..dc00349029c 100755 --- a/.github/scripts/http-e2e.sh +++ b/.github/scripts/http-e2e.sh @@ -236,6 +236,10 @@ case "$group" in MOBILE_E2E_AUTH_SECRET="$BETTER_AUTH_SECRET" \ MOBILE_E2E_REPORT_PATH="$report_dir/mobile-e2e-report.json" \ bun run test:mobile:e2e + # The same production build answers as a crawler sees it: statuses, robots, sitemap, JSON-LD. + LANDING_SEO_E2E_BASE_URL="$NEXT_PUBLIC_APP_URL" \ + LANDING_SEO_E2E_REPORT_PATH="$report_dir/landing-seo-e2e-report.json" \ + bun run test:landing-seo:e2e ;; *) diff --git a/apps/docs/app/[[...slug]]/page.tsx b/apps/docs/app/[[...slug]]/page.tsx index faf8e255569..689c7b0a69e 100644 --- a/apps/docs/app/[[...slug]]/page.tsx +++ b/apps/docs/app/[[...slug]]/page.tsx @@ -17,6 +17,7 @@ import { APIExampleSelector } from '@/components/ui/api-example-selector' import { CodeBlock } from '@/components/ui/code-block' import { Heading } from '@/components/ui/heading' import { ResponseSection } from '@/components/ui/response-section' +import { getIntegrationLandingPage, INTEGRATION_LANDING_LABEL } from '@/lib/integration-landing' import { getApiSpecContent, getAuthenticatedCodeSamples, openapi } from '@/lib/openapi' import { simShikiOptions } from '@/lib/shiki-theme' import { type PageData, source } from '@/lib/source' @@ -122,6 +123,7 @@ export default async function Page(props: { params: Promise<{ slug?: string[] }> } const isOpenAPI = '_openapi' in data && data._openapi != null const isApiReference = slug?.some((s) => s === 'api-reference') ?? false + const integrationLandingPage = getIntegrationLandingPage(slug) const isCli = slug?.[0] === 'cli' const isMcp = slug?.[0] === 'mcp' @@ -266,6 +268,12 @@ export default async function Page(props: { params: Promise<{ slug?: string[] }> + {integrationLandingPage && ( +

+ {INTEGRATION_LANDING_LABEL}{' '} + {integrationLandingPage.title} +

+ )}