From 55a0b32bdfd3f3feeca73fbe7cd75dd02a3de33c Mon Sep 17 00:00:00 2001 From: Andrew Jiang Date: Thu, 13 Feb 2025 11:31:21 -0500 Subject: [PATCH] remove fern-docs/cache --- packages/fern-docs/bundle/next.config.ts | 10 +- packages/fern-docs/bundle/package.json | 1 - .../{not-found.tsx => _not-found.tsx} | 0 .../bundle/src/app/[domain]/_page.tsx | 6 +- .../api/fern-docs/org/org-for-url/route.ts | 5 +- .../api/fern-docs/search/v2/chat/route.ts | 9 +- .../api/fern-docs/search/v2/key/route.ts | 9 +- .../search/v2/reindex/algolia/route.ts | 9 +- .../search/v2/reindex/turbopuffer/route.ts | 9 +- .../src/app/[domain]/dynamic/layout.tsx | 6 +- .../bundle/src/app/[domain]/layout.tsx | 11 +- .../bundle/src/app/[domain]/static/layout.tsx | 8 +- .../api-reference/ApiEndpointPage.tsx | 15 +-- .../endpoints/EndpointContent.tsx | 2 +- .../endpoints/EndpointContentCodeSnippets.tsx | 2 +- .../bundle/src/components/header/Header.tsx | 103 ++++------------ .../src/components/header/announcement.tsx | 33 ++++- .../src/components/layouts/GuideLayout.tsx | 31 +++-- .../components/layouts/LayoutEvaluator.tsx | 2 +- .../components/layouts/ReferenceLayout.tsx | 11 +- .../layouts/TableOfContentsLayout.tsx | 2 +- .../bundle/src/components/mdx/Markdown.tsx | 9 +- .../src/components/mdx/bundler/serialize.ts | 2 - .../components/sidebar/SidebarContainer.tsx | 6 +- .../src/components/themes/ThemedDocs.tsx | 3 + .../components/themes/cohere/CohereDocs.tsx | 2 + .../components/themes/default/DefaultDocs.tsx | 115 +++++++++++++----- .../components/themes/default/fern-header.tsx | 6 +- .../themes/default/header-container.tsx | 9 ++ packages/fern-docs/bundle/src/middleware.ts | 19 +-- .../bundle/src/server/auth/getAuthState.ts | 8 +- .../src/server/auth/getAuthStateEdge.ts | 8 +- .../src/server/auth/metadata-for-url.ts | 26 ---- .../bundle/src/server/docs-loader.ts | 69 +++++------ .../bundle/src/server/env-variables.ts | 8 ++ .../bundle/src/server/getDocsUrlMetadata.ts | 67 ++++++++++ .../fern-docs/bundle/src/server/ld-adapter.ts | 11 +- .../bundle/src/server/loadWithUrl.ts | 18 ++- .../fern-docs/bundle/src/state/navigation.tsx | 5 + packages/fern-docs/cache/.depcheckrc.json | 4 - packages/fern-docs/cache/.stylelintrc.json | 1 - packages/fern-docs/cache/package.json | 53 -------- packages/fern-docs/cache/src/DocsKVCache.ts | 52 -------- .../fern-docs/cache/src/DocsMetadataLoader.ts | 65 ---------- packages/fern-docs/cache/src/index.ts | 1 - packages/fern-docs/cache/tsconfig.eslint.json | 7 -- packages/fern-docs/cache/tsconfig.json | 19 --- packages/fern-docs/cache/vitest.config.ts | 7 -- .../fern-docs/components/src/FernButton.tsx | 18 +-- .../src/getPreviewUrlAuthConfig.ts | 8 +- packages/fern-docs/mdx/src/parse.ts | 4 +- packages/fern-docs/mdx/src/plugins/index.ts | 1 - ...-unravel.ts => remark-mark-and-unravel.ts} | 60 ++++----- .../src/components/search-client.tsx | 3 + pnpm-lock.yaml | 80 ------------ 55 files changed, 455 insertions(+), 603 deletions(-) rename packages/fern-docs/bundle/src/app/[domain]/{not-found.tsx => _not-found.tsx} (100%) create mode 100644 packages/fern-docs/bundle/src/components/themes/default/header-container.tsx delete mode 100644 packages/fern-docs/bundle/src/server/auth/metadata-for-url.ts create mode 100644 packages/fern-docs/bundle/src/server/getDocsUrlMetadata.ts delete mode 100644 packages/fern-docs/cache/.depcheckrc.json delete mode 100644 packages/fern-docs/cache/.stylelintrc.json delete mode 100644 packages/fern-docs/cache/package.json delete mode 100644 packages/fern-docs/cache/src/DocsKVCache.ts delete mode 100644 packages/fern-docs/cache/src/DocsMetadataLoader.ts delete mode 100644 packages/fern-docs/cache/src/index.ts delete mode 100644 packages/fern-docs/cache/tsconfig.eslint.json delete mode 100644 packages/fern-docs/cache/tsconfig.json delete mode 100644 packages/fern-docs/cache/vitest.config.ts rename packages/fern-docs/mdx/src/plugins/{remark-unravel.ts => remark-mark-and-unravel.ts} (70%) 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 ( +