diff --git a/packages/fern-docs/bundle/next.config.ts b/packages/fern-docs/bundle/next.config.ts index 396433769d..e1845e21db 100644 --- a/packages/fern-docs/bundle/next.config.ts +++ b/packages/fern-docs/bundle/next.config.ts @@ -39,7 +39,6 @@ const nextConfig: NextConfig = { "@fern-api/template-resolver", "@fern-api/ui-core-utils", "@fern-docs/auth", - "@fern-docs/cache", "@fern-docs/components", "@fern-docs/edge-config", "@fern-docs/mdx", @@ -64,8 +63,8 @@ const nextConfig: NextConfig = { "ts-essentials", "lucide-react", ], - optimizeServerReact: true, - typedEnv: true, + optimizeServerReact: Boolean(process.env.VERCEL), + // typedEnv: true, newDevOverlay: true, authInterrupts: true, swcTraceProfiling: true, @@ -74,6 +73,7 @@ const nextConfig: NextConfig = { parallelServerBuildTraces: true, webpackMemoryOptimizations: true, taint: true, + useCache: true, }, skipMiddlewareUrlNormalize: true, @@ -206,7 +206,9 @@ function withVercelEnv(config: NextConfig): NextConfig { return { ...config, deploymentId: process.env.VERCEL_DEPLOYMENT_ID, // skew protection - productionBrowserSourceMaps: process.env.VERCEL_ENV === "preview", + productionBrowserSourceMaps: + process.env.VERCEL_ENV === "preview" || + process.env.NODE_ENV === "development", reactProductionProfiling: process.env.VERCEL_ENV !== "production", }; } diff --git a/packages/fern-docs/bundle/package.json b/packages/fern-docs/bundle/package.json index 68d3b9f9ba..de15d7bd3c 100644 --- a/packages/fern-docs/bundle/package.json +++ b/packages/fern-docs/bundle/package.json @@ -43,7 +43,6 @@ "@fern-api/template-resolver": "workspace:*", "@fern-api/ui-core-utils": "workspace:*", "@fern-docs/auth": "workspace:*", - "@fern-docs/cache": "workspace:*", "@fern-docs/components": "workspace:*", "@fern-docs/edge-config": "workspace:*", "@fern-docs/mdx": "workspace:*", diff --git a/packages/fern-docs/bundle/src/app/[domain]/not-found.tsx b/packages/fern-docs/bundle/src/app/[domain]/_not-found.tsx similarity index 100% rename from packages/fern-docs/bundle/src/app/[domain]/not-found.tsx rename to packages/fern-docs/bundle/src/app/[domain]/_not-found.tsx diff --git a/packages/fern-docs/bundle/src/app/[domain]/_page.tsx b/packages/fern-docs/bundle/src/app/[domain]/_page.tsx index aa548075cd..8c52bd375c 100644 --- a/packages/fern-docs/bundle/src/app/[domain]/_page.tsx +++ b/packages/fern-docs/bundle/src/app/[domain]/_page.tsx @@ -132,11 +132,7 @@ export default async function Page({ } // TODO: parallelize this with the other edge config calls: - const [launchDarkly, flagPredicate] = await withLaunchDarkly( - loader.domain, - authState, - found - ); + const [launchDarkly, flagPredicate] = await withLaunchDarkly(loader, found); if ( ![...found.parents, found.node] diff --git a/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/org/org-for-url/route.ts b/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/org/org-for-url/route.ts index d66ff6f7b7..ebeabc6bd0 100644 --- a/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/org/org-for-url/route.ts +++ b/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/org/org-for-url/route.ts @@ -1,6 +1,6 @@ import { NextRequest, NextResponse } from "next/server"; -import { getOrgMetadataForDomain } from "@/server/auth/metadata-for-url"; +import { createCachedDocsLoader } from "@/server/docs-loader"; import { getDocsDomainEdge } from "@/server/xfernhost/edge"; export const runtime = "edge"; @@ -17,7 +17,8 @@ export async function GET(req: NextRequest): Promise { return NextResponse.json({ error: "Invalid domain" }, { status: 400 }); } - const metadata = await getOrgMetadataForDomain(domain); + const loader = await createCachedDocsLoader(domain); + const metadata = await loader.getMetadata(); if (metadata) { return NextResponse.json(metadata, { status: 200 }); diff --git a/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/search/v2/chat/route.ts b/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/search/v2/chat/route.ts index ff1d134abf..907f333e08 100644 --- a/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/search/v2/chat/route.ts +++ b/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/search/v2/chat/route.ts @@ -17,7 +17,7 @@ import { COOKIE_FERN_TOKEN, withoutStaging } from "@fern-docs/utils"; import { track } from "@/server/analytics/posthog"; import { safeVerifyFernJWTConfig } from "@/server/auth/FernJWT"; -import { getOrgMetadataForDomain } from "@/server/auth/metadata-for-url"; +import { createCachedDocsLoader } from "@/server/docs-loader"; import { openaiApiKey, turbopufferApiKey } from "@/server/env-variables"; import { getDocsDomainEdge } from "@/server/xfernhost/edge"; @@ -46,12 +46,13 @@ export async function POST(req: NextRequest) { const namespace = `${withoutStaging(domain)}_${embeddingModel.modelId}`; const { messages } = await req.json(); - const orgMetadata = await getOrgMetadataForDomain(withoutStaging(domain)); - if (orgMetadata == null) { + const loader = await createCachedDocsLoader(domain); + const metadata = await loader.getMetadata(); + if (metadata == null) { return NextResponse.json("Not found", { status: 404 }); } - if (orgMetadata.isPreviewUrl) { + if (metadata.isPreview) { return NextResponse.json({ added: 0, updated: 0, diff --git a/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/search/v2/key/route.ts b/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/search/v2/key/route.ts index 0a005e7986..640b85f973 100644 --- a/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/search/v2/key/route.ts +++ b/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/search/v2/key/route.ts @@ -10,7 +10,7 @@ import { import { COOKIE_FERN_TOKEN, withoutStaging } from "@fern-docs/utils"; import { safeVerifyFernJWTConfig } from "@/server/auth/FernJWT"; -import { getOrgMetadataForDomain } from "@/server/auth/metadata-for-url"; +import { createCachedDocsLoader } from "@/server/docs-loader"; import { algoliaAppId, algoliaSearchApikey } from "@/server/env-variables"; import { selectFirst } from "@/server/utils/selectFirst"; import { getDocsDomainEdge } from "@/server/xfernhost/edge"; @@ -21,12 +21,13 @@ export const maxDuration = 10; export async function GET(req: NextRequest): Promise { const domain = getDocsDomainEdge(req); - const orgMetadata = await getOrgMetadataForDomain(withoutStaging(domain)); - if (orgMetadata == null) { + const loader = await createCachedDocsLoader(domain); + const metadata = await loader.getMetadata(); + if (metadata == null) { return NextResponse.json("Not found", { status: 404 }); } - if (orgMetadata.isPreviewUrl) { + if (metadata.isPreview) { return NextResponse.json("Search is not supported for preview URLs", { status: 400, }); diff --git a/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/search/v2/reindex/algolia/route.ts b/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/search/v2/reindex/algolia/route.ts index b1e4153d23..9855ae4f79 100644 --- a/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/search/v2/reindex/algolia/route.ts +++ b/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/search/v2/reindex/algolia/route.ts @@ -9,7 +9,7 @@ import { import { addLeadingSlash, withoutStaging } from "@fern-docs/utils"; import { track } from "@/server/analytics/posthog"; -import { getOrgMetadataForDomain } from "@/server/auth/metadata-for-url"; +import { createCachedDocsLoader } from "@/server/docs-loader"; import { algoliaAppId, algoliaWriteApiKey, @@ -25,13 +25,14 @@ export async function GET(req: NextRequest): Promise { const domain = getDocsDomainEdge(req); try { - const orgMetadata = await getOrgMetadataForDomain(withoutStaging(domain)); - if (orgMetadata == null) { + const loader = await createCachedDocsLoader(domain); + const metadata = await loader.getMetadata(); + if (metadata == null) { return NextResponse.json("Not found", { status: 404 }); } // If the domain is a preview URL, we don't want to reindex - if (orgMetadata.isPreviewUrl) { + if (metadata.isPreview) { return NextResponse.json({ added: 0, updated: 0, diff --git a/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/search/v2/reindex/turbopuffer/route.ts b/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/search/v2/reindex/turbopuffer/route.ts index 356b6e2566..1cba1be1a2 100644 --- a/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/search/v2/reindex/turbopuffer/route.ts +++ b/packages/fern-docs/bundle/src/app/[domain]/api/fern-docs/search/v2/reindex/turbopuffer/route.ts @@ -8,7 +8,7 @@ import { turbopufferUpsertTask } from "@fern-docs/search-server/turbopuffer"; import { addLeadingSlash, withoutStaging } from "@fern-docs/utils"; import { track } from "@/server/analytics/posthog"; -import { getOrgMetadataForDomain } from "@/server/auth/metadata-for-url"; +import { createCachedDocsLoader } from "@/server/docs-loader"; import { fdrEnvironment, fernToken_admin, @@ -30,13 +30,14 @@ export async function GET(req: NextRequest): Promise { const namespace = `${withoutStaging(domain)}_${embeddingModel.modelId}`; try { - const orgMetadata = await getOrgMetadataForDomain(withoutStaging(domain)); - if (orgMetadata == null) { + const loader = await createCachedDocsLoader(domain); + const metadata = await loader.getMetadata(); + if (metadata == null) { return NextResponse.json("Not found", { status: 404 }); } // If the domain is a preview URL, we don't want to reindex - if (orgMetadata.isPreviewUrl) { + if (metadata.isPreview) { return NextResponse.json( { added: 0, diff --git a/packages/fern-docs/bundle/src/app/[domain]/dynamic/layout.tsx b/packages/fern-docs/bundle/src/app/[domain]/dynamic/layout.tsx index 8842b4885e..d59afafb7e 100644 --- a/packages/fern-docs/bundle/src/app/[domain]/dynamic/layout.tsx +++ b/packages/fern-docs/bundle/src/app/[domain]/dynamic/layout.tsx @@ -1,3 +1,4 @@ +import { getFernToken } from "@/app/fern-token"; import type { NavbarLink } from "@/components/atoms/types"; import { Header } from "@/components/header/Header"; import { Announcement } from "@/components/header/announcement"; @@ -19,7 +20,7 @@ export default async function DocsLayout({ }) { const { domain } = await params; - const loader = await createCachedDocsLoader(domain); + const loader = await createCachedDocsLoader(domain, await getFernToken()); const [{ basePath }, root, config, edgeFlags, files, colors, layout] = await Promise.all([ loader.getBaseUrl(), @@ -111,7 +112,6 @@ export default async function DocsLayout({ header={
} versionSelect={false} + showThemeButton={Boolean(colors.dark && colors.light)} showSearchBar={layout.searchbarPlacement === "HEADER"} navbarLinks={navbarLinks} /> } + headerHeight={layout.headerHeight} sidebar={ { const unstable_launchDarklySettings = await getLaunchDarklySettings( - domain, - getOrgMetadataForDomain(domain).then((metadata) => metadata?.orgId) + loader.domain, + loader.getMetadata().then((metadata) => metadata.org) ); if (!unstable_launchDarklySettings) { return undefined; diff --git a/packages/fern-docs/bundle/src/app/[domain]/static/layout.tsx b/packages/fern-docs/bundle/src/app/[domain]/static/layout.tsx index 8842b4885e..4f16140cd9 100644 --- a/packages/fern-docs/bundle/src/app/[domain]/static/layout.tsx +++ b/packages/fern-docs/bundle/src/app/[domain]/static/layout.tsx @@ -1,3 +1,7 @@ +"use cache"; + +import { unstable_cacheTag } from "next/cache"; + import type { NavbarLink } from "@/components/atoms/types"; import { Header } from "@/components/header/Header"; import { Announcement } from "@/components/header/announcement"; @@ -18,6 +22,7 @@ export default async function DocsLayout({ params: Promise<{ domain: string }>; }) { const { domain } = await params; + unstable_cacheTag(domain, "static", "layout"); const loader = await createCachedDocsLoader(domain); const [{ basePath }, root, config, edgeFlags, files, colors, layout] = @@ -111,7 +116,6 @@ export default async function DocsLayout({ header={
} + headerHeight={layout.headerHeight} sidebar={ - - + ); } diff --git a/packages/fern-docs/bundle/src/components/api-reference/endpoints/EndpointContent.tsx b/packages/fern-docs/bundle/src/components/api-reference/endpoints/EndpointContent.tsx index 0f9b41a8b7..0ceac0e90e 100644 --- a/packages/fern-docs/bundle/src/components/api-reference/endpoints/EndpointContent.tsx +++ b/packages/fern-docs/bundle/src/components/api-reference/endpoints/EndpointContent.tsx @@ -31,7 +31,7 @@ export async function EndpointContent({ return ( - + - - {navbarLinks.map((navbarLink, idx) => ( - - ))} - - {colors.dark && colors.light && } - - - ); - - const githubLink = navbarLinks.find((link) => link.type === "github"); - const githubRepo = githubLink && getGitHubRepo(githubLink.href); - return ( - + + + + ); } @@ -178,9 +135,3 @@ function NavbarLink({ navbarLink }: { navbarLink: NavbarLink }) { ); } - -export declare namespace HeaderPrimaryLink { - export interface Props { - navbarLink: DocsV1Read.NavbarLink.Primary; - } -} diff --git a/packages/fern-docs/bundle/src/components/header/announcement.tsx b/packages/fern-docs/bundle/src/components/header/announcement.tsx index 9fd6c3496a..72b6100156 100644 --- a/packages/fern-docs/bundle/src/components/header/announcement.tsx +++ b/packages/fern-docs/bundle/src/components/header/announcement.tsx @@ -1,5 +1,6 @@ "use client"; +import { useServerInsertedHTML } from "next/navigation"; import React from "react"; import { Xmark } from "iconoir-react"; @@ -35,7 +36,7 @@ const AnnouncementInternal = React.forwardRef< state.announcement === announcement ); + useServerInsertedHTML(() => { + if (!announcement) { + return null; + } + return ( +