From ba87b1469f4c9717dc91ee4e9edd9237ceccdd11 Mon Sep 17 00:00:00 2001 From: Marc LeBlanc <7050295+marcleblanc2@users.noreply.github.com> Date: Wed, 16 Sep 2026 18:12:35 -0600 Subject: [PATCH 01/11] fix: prefix basePath on root-relative src Production serves under /docs. next/link adds the prefix, and next/image do not, so /sourcegraph-mark.svg in the mobile nav and the LinkCards/ProductCards icons, plus a couple of root-relative markdown images, 404 on sourcegraph.com. --- src/components/MobileNavigation.tsx | 3 ++- src/components/mdx/LinkCards.tsx | 7 ++++++- src/components/mdx/ProductCards.tsx | 7 ++++++- src/components/mdx/ZoomableImage.tsx | 12 +++++++++++- src/lib/utils.ts | 9 +++++++++ 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/components/MobileNavigation.tsx b/src/components/MobileNavigation.tsx index a59ac44db..aff20d9f1 100644 --- a/src/components/MobileNavigation.tsx +++ b/src/components/MobileNavigation.tsx @@ -6,6 +6,7 @@ import Link from 'next/link'; import {usePathname, useSearchParams} from 'next/navigation'; import {Dialog} from '@headlessui/react'; import {Navigation} from '@/components/Navigation'; +import {withBasePath} from '@/lib/utils'; function MenuIcon(props: React.ComponentPropsWithoutRef<'svg'>) { return ( @@ -100,7 +101,7 @@ export function MobileNavigation() { Sourcegraph Docs
{/* eslint-disable-next-line @next/next/no-img-element -- Small MDX icons do not need image optimization. */} - {imgAlt} + {imgAlt}

{title} diff --git a/src/components/mdx/ProductCards.tsx b/src/components/mdx/ProductCards.tsx index 38f0f7d03..9e58f5646 100644 --- a/src/components/mdx/ProductCards.tsx +++ b/src/components/mdx/ProductCards.tsx @@ -1,5 +1,6 @@ import Link from 'next/link'; import {CustomLink} from './CustomLink'; +import {withBasePath} from '@/lib/utils'; export function ProductCards({children}: {children: React.ReactNode}) { return ( @@ -29,7 +30,11 @@ export function ProductCard({
{/* eslint-disable-next-line @next/next/no-img-element -- Small MDX icons do not need image optimization. */} - {imgAlt} + {imgAlt}

diff --git a/src/components/mdx/ZoomableImage.tsx b/src/components/mdx/ZoomableImage.tsx index 1ad752aea..883e4f5ee 100644 --- a/src/components/mdx/ZoomableImage.tsx +++ b/src/components/mdx/ZoomableImage.tsx @@ -1,10 +1,20 @@ 'use client'; import {useCallback, useEffect, useState} from 'react'; +import {withBasePath} from '@/lib/utils'; interface ZoomableImageProps extends React.ImgHTMLAttributes {} -export function ZoomableImage({className, alt, ...props}: ZoomableImageProps) { +export function ZoomableImage({ + className, + alt, + src, + ...rest +}: ZoomableImageProps) { + const props = { + ...rest, + src: typeof src === 'string' ? withBasePath(src) : src + }; const [isOpen, setIsOpen] = useState(false); const openModal = useCallback(() => setIsOpen(true), []); diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 065c19661..4018927aa 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -4,3 +4,12 @@ import {twMerge} from 'tailwind-merge'; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } + +// Production serves the site under /docs (basePath in next.config.js). next/link +// adds it to hrefs, but and next/image do not, so a root-relative path +// to a file in public/ 404s on sourcegraph.com unless prefixed here. +export function withBasePath(url: string) { + const basePath = process.env.NEXT_PUBLIC_DOCS_BASE_PATH || ''; + const isRootRelative = url.startsWith('/') && !url.startsWith('//'); + return isRootRelative ? `${basePath}${url}` : url; +} From 76da6a502fdd9c94d4b1dc800ae9505476017e90 Mon Sep 17 00:00:00 2001 From: Marc LeBlanc <7050295+marcleblanc2@users.noreply.github.com> Date: Thu, 17 Sep 2026 02:15:24 -0600 Subject: [PATCH 02/11] cspell: allow hrefs Amp-Thread-ID: https://ampcode.com/threads/T-01a0ae6a-1645-702a-a5ed-92f8b9bce33b Co-authored-by: Amp --- cspell-allow-list.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/cspell-allow-list.txt b/cspell-allow-list.txt index 00ef52265..f3fdb47a7 100644 --- a/cspell-allow-list.txt +++ b/cspell-allow-list.txt @@ -241,6 +241,7 @@ horsegraph horsten hostmatcher hostpath +hrefs HSTS httptest huggingface From 68901e11f3374911bbc52bdc8b07aa499b05fe86 Mon Sep 17 00:00:00 2001 From: Marc LeBlanc <7050295+marcleblanc2@users.noreply.github.com> Date: Thu, 17 Sep 2026 02:45:42 -0600 Subject: [PATCH 03/11] site: serve every deployment under /docs Previews and local dev served at / while production served at /docs, so a root-relative only 404d after deploy. Use basePath /docs everywhere; the / -> /docs redirect from #1955 now applies to every deployment. Update the tooling that assumed previews had no basePath. Amp-Thread-ID: https://ampcode.com/threads/T-01a0ae6a-1645-702a-a5ed-92f8b9bce33b Co-authored-by: Amp --- .amp/services.yaml | 4 ++-- .github/workflows/preview-links.yml | 4 ++-- AGENTS.md | 12 +++++++++++- README.md | 4 ++-- dev/verify-links-live.mjs | 7 +++---- next.config.js | 18 +++++++----------- src/lib/utils.ts | 6 +++--- 7 files changed, 30 insertions(+), 25 deletions(-) diff --git a/.amp/services.yaml b/.amp/services.yaml index 87e947eb5..73d0ae63a 100644 --- a/.amp/services.yaml +++ b/.amp/services.yaml @@ -4,7 +4,7 @@ services: port: 31420 env: NODE_OPTIONS: --max-old-space-size=3072 - health: /agentic-batch-changes + health: /docs/agentic-batch-changes portal: - url: /agentic-batch-changes + url: /docs/agentic-batch-changes title: Sourcegraph Docs diff --git a/.github/workflows/preview-links.yml b/.github/workflows/preview-links.yml index 70c688e0d..c4447b8f9 100644 --- a/.github/workflows/preview-links.yml +++ b/.github/workflows/preview-links.yml @@ -60,11 +60,11 @@ jobs: }); // Mirror contentlayer's flattenedPath: docs/.mdx -> /, - // with a trailing /index dropped. Preview deployments have no basePath. + // with a trailing /index dropped, under the /docs basePath. const pages = files .filter(f => f.filename.startsWith('docs/') && f.filename.endsWith('.mdx') && f.status !== 'removed') .map(f => f.filename.slice('docs/'.length, -'.mdx'.length).replace(/^index$/, '').replace(/\/index$/, '')) - .map(path => ({path, url: `${previewUrl}/${path}`})); + .map(path => ({path, url: `${previewUrl}/docs/${path}`})); if (pages.length === 0) { core.info(`PR #${pr.number} changes no docs pages; not commenting.`); diff --git a/AGENTS.md b/AGENTS.md index 8ae767663..b3a6ddfc2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -32,7 +32,7 @@ linking the job log, instead of failing the PR: an empty report says nothing about the PR - **Prove changed links resolve on a deploy**: - `node dev/verify-links-live.mjs --site ` prints a + `node dev/verify-links-live.mjs --site /docs` prints a Markdown table for the PR description - **Spell check**: `.github/workflows/spellcheck.yml` runs `dev/check-spelling.mjs` on the lines a PR adds plus its title and @@ -92,3 +92,13 @@ next run. (From a manifest), install it, copy its Bot User OAuth Token into the secret, and `/invite @Vercel build log` to the channel. + + + +# This is NOT the Next.js you know + +This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices. + +This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean. + + diff --git a/README.md b/README.md index 398d259ba..dd6064ea3 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ Next, run the development server: pnpm run dev ``` -Finally, open [`http://localhost:3000`](http://localhost:3000) in your browser +Finally, open [`http://localhost:3000/docs`](http://localhost:3000/docs) in your browser to view the website. ## Writing and contributing to Sourcegraph Docs @@ -225,7 +225,7 @@ instructions visit As you make changes to the documentation, the development server will automatically update. Review your changes by navigating to -`http://localhost:3000` in your browser. +`http://localhost:3000/docs` in your browser. ### Previewing Vercel Deployments diff --git a/dev/verify-links-live.mjs b/dev/verify-links-live.mjs index 7f4434a3e..b39d32f4b 100644 --- a/dev/verify-links-live.mjs +++ b/dev/verify-links-live.mjs @@ -13,11 +13,10 @@ // Prints a Markdown table to paste into a PR. Old links point at --old-site so // reviewers can see the current breakage. // -// node dev/verify-links-live.mjs --site https://.vercel.app [--old-site https://sourcegraph.com/docs] [--base origin/main] +// node dev/verify-links-live.mjs --site https://.vercel.app/docs [--old-site https://sourcegraph.com/docs] [--base origin/main] // -// Production serves under https://sourcegraph.com/docs (basePath in -// next.config.js); Vercel previews serve at the root, so pass the full prefix -// in --site. +// Every deployment serves under /docs (basePath in next.config.js), so --site +// includes that prefix. import { execSync } from 'node:child_process'; import fs from 'node:fs'; import path from 'node:path'; diff --git a/next.config.js b/next.config.js index 941a822af..84aca2adc 100644 --- a/next.config.js +++ b/next.config.js @@ -2,12 +2,10 @@ const {PHASE_DEVELOPMENT_SERVER} = require('next/constants'); const {withContentlayer} = require('next-contentlayer2'); /** @type {import('next').NextConfig} */ -// in prod, we serve the docs from sourcegraph.com/docs, and this requires special config on the GFE side -// in preview/development, this is not necessary. -// -// VERCEL_ENV is a system env var set by Vercel -// https://vercel.com/docs/projects/environment-variables/system-environment-variables -const basePath = process.env.VERCEL_ENV === 'production' ? '/docs' : ''; +// sourcegraph.com proxies /docs/* to this site. Previews and local dev use the +// same basePath so that a root-relative URL which 404s in production also 404s +// there, instead of only breaking after deploy. +const basePath = '/docs'; const nextConfig = { reactStrictMode: true, @@ -19,12 +17,10 @@ const nextConfig = { env: { NEXT_PUBLIC_DOCS_BASE_PATH: basePath }, - // With basePath set, nothing serves `/`, so the *.vercel.app deployment URL - // that Vercel links from Slack / GitHub 404s. sourcegraph.com never proxies - // `/` to us, so this only affects visitors opening that raw URL. Stay on the - // same host so they see this exact deployment, not whatever is live. + // Nothing serves `/`, so the deployment URLs Vercel links from Slack / GitHub + // and http://localhost:3000 would 404. sourcegraph.com never proxies `/` to + // us. Stay on the same host so visitors see this exact deployment. async redirects() { - if (!basePath) return []; return [ { source: '/', diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 4018927aa..fb935217b 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -5,9 +5,9 @@ export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } -// Production serves the site under /docs (basePath in next.config.js). next/link -// adds it to hrefs, but and next/image do not, so a root-relative path -// to a file in public/ 404s on sourcegraph.com unless prefixed here. +// The site is served under /docs (basePath in next.config.js). next/link adds it +// to hrefs, but and next/image do not, so a root-relative path to a +// file in public/ 404s unless prefixed here. export function withBasePath(url: string) { const basePath = process.env.NEXT_PUBLIC_DOCS_BASE_PATH || ''; const isRootRelative = url.startsWith('/') && !url.startsWith('//'); From ca00492efeafdfd1305735613860e0b66e03e581 Mon Sep 17 00:00:00 2001 From: Marc LeBlanc <7050295+marcleblanc2@users.noreply.github.com> Date: Thu, 17 Sep 2026 03:07:29 -0600 Subject: [PATCH 04/11] site: one DOCS_BASE_PATH constant; drop NEXT_PUBLIC_DOCS_BASE_PATH basePath is declared once, in docs.config.js. next.config.js reads it for routing; everything that builds a URL Next does not prefix (img src, a href, fetch, metadata, proxy redirects) goes through withBasePath or reads the constant, instead of nine copies of process.env.NEXT_PUBLIC_DOCS_BASE_PATH or a hardcoded '/docs'. proxy.ts: request.nextUrl.pathname already excludes the basePath, so the path.replace('/docs', '') was a no-op that would have mangled any real path containing '/docs'. Removed. Amp-Thread-ID: https://ampcode.com/threads/T-01a0ae6a-1645-702a-a5ed-92f8b9bce33b Co-authored-by: Amp --- docs.config.js | 5 ++- next.config.js | 13 ++----- src/app/[...slug]/page.tsx | 3 +- src/app/layout.tsx | 5 +-- src/app/page.tsx | 3 +- src/components/Logo.tsx | 8 ++--- src/components/NotFoundLinks.tsx | 8 ++--- src/components/ReleasesTable.tsx | 4 +-- src/components/Toc.tsx | 4 +-- src/components/search/Search.tsx | 7 ++-- .../search/docsearch/NoResultsScreen.tsx | 5 ++- .../search/docsearch/StartScreen.tsx | 5 ++- src/lib/utils.ts | 9 +++-- src/proxy.ts | 36 +++++++++---------- 14 files changed, 54 insertions(+), 61 deletions(-) diff --git a/docs.config.js b/docs.config.js index f5ca0dd01..f5b04f4b9 100644 --- a/docs.config.js +++ b/docs.config.js @@ -1,5 +1,8 @@ const config = { - DOCS_LATEST_VERSION: '8.0' + DOCS_LATEST_VERSION: '8.0', + // sourcegraph.com proxies /docs/* to this site. Previews and local dev use the + // same basePath so a root-relative URL that 404s in production 404s there too. + DOCS_BASE_PATH: '/docs' }; module.exports = config; diff --git a/next.config.js b/next.config.js index 84aca2adc..eea492352 100644 --- a/next.config.js +++ b/next.config.js @@ -1,22 +1,15 @@ const {PHASE_DEVELOPMENT_SERVER} = require('next/constants'); const {withContentlayer} = require('next-contentlayer2'); +const {DOCS_BASE_PATH} = require('./docs.config.js'); /** @type {import('next').NextConfig} */ -// sourcegraph.com proxies /docs/* to this site. Previews and local dev use the -// same basePath so that a root-relative URL which 404s in production also 404s -// there, instead of only breaking after deploy. -const basePath = '/docs'; - const nextConfig = { reactStrictMode: true, - basePath, + basePath: DOCS_BASE_PATH, // Orb portals proxy the dev server through a different hostname. allowedDevOrigins: process.env.PUBLIC_URL ? [new URL(process.env.PUBLIC_URL).hostname] : [], - env: { - NEXT_PUBLIC_DOCS_BASE_PATH: basePath - }, // Nothing serves `/`, so the deployment URLs Vercel links from Slack / GitHub // and http://localhost:3000 would 404. sourcegraph.com never proxies `/` to // us. Stay on the same host so visitors see this exact deployment. @@ -24,7 +17,7 @@ const nextConfig = { return [ { source: '/', - destination: basePath, + destination: DOCS_BASE_PATH, basePath: false, permanent: false } diff --git a/src/app/[...slug]/page.tsx b/src/app/[...slug]/page.tsx index 3bc78c815..095d5871c 100644 --- a/src/app/[...slug]/page.tsx +++ b/src/app/[...slug]/page.tsx @@ -4,6 +4,7 @@ import {PreviewGuard} from '@/components/PreviewGuard'; import {PrevNextLinks} from '@/components/PrevNextLinks'; import {Prose} from '@/components/Prose'; import {TableOfContents} from '@/components/Toc'; +import {withBasePath} from '@/lib/utils'; import {allPosts} from 'contentlayer/generated'; import {getMDXComponent} from 'next-contentlayer2/hooks'; import {notFound} from 'next/navigation'; @@ -28,7 +29,7 @@ export const generateMetadata = async ({params}: Props) => { const post = allPosts.find(post => post._raw.flattenedPath === path); if (post && post.headings && post.headings.length > 0) { const title = post.headings[0].title; - const ogImageUrl = `${process.env.NEXT_PUBLIC_DOCS_BASE_PATH || ''}/api/og/${path}`; + const ogImageUrl = withBasePath(`/api/og/${path}`); return { title, // The root layout's canonical is the landing page; without this diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 3408ec9c0..97a20de64 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,6 +1,7 @@ import {Providers} from '@/app/providers'; import {Layout} from '@/components/Layout'; import {TECHNICAL_CHANGELOG_RSS_URL} from '@/data/constants'; +import {withBasePath} from '@/lib/utils'; import clsx from 'clsx'; import config from 'docs.config'; import {type Metadata} from 'next'; @@ -26,11 +27,11 @@ export const metadata: Metadata = { canonical: '/docs' }, openGraph: { - images: [{url: `${process.env.NEXT_PUBLIC_DOCS_BASE_PATH || ''}/api/og/index`, width: 1200, height: 630}] + images: [{url: withBasePath('/api/og/index'), width: 1200, height: 630}] }, twitter: { card: 'summary_large_image', - images: [{url: `${process.env.NEXT_PUBLIC_DOCS_BASE_PATH || ''}/api/og/index`, width: 1200, height: 630}] + images: [{url: withBasePath('/api/og/index'), width: 1200, height: 630}] } }; diff --git a/src/app/page.tsx b/src/app/page.tsx index 01a78b0fe..11cd0c712 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,11 +1,12 @@ import MdxComponents from '@/components/MdxComponents'; import {Prose} from '@/components/Prose'; +import {withBasePath} from '@/lib/utils'; import {allPosts} from 'contentlayer/generated'; import {getMDXComponent} from 'next-contentlayer2/hooks'; import {notFound} from 'next/navigation'; export const generateMetadata = () => { - const ogImageUrl = `${process.env.NEXT_PUBLIC_DOCS_BASE_PATH || ''}/api/og/index`; + const ogImageUrl = withBasePath('/api/og/index'); return { openGraph: { images: [{url: ogImageUrl, width: 1200, height: 630}] diff --git a/src/components/Logo.tsx b/src/components/Logo.tsx index 2acb056e7..dc6119f74 100644 --- a/src/components/Logo.tsx +++ b/src/components/Logo.tsx @@ -1,18 +1,18 @@ -export function Logo(props: React.ComponentPropsWithoutRef<'svg'>) { - const basePath = process.env.NEXT_PUBLIC_DOCS_BASE_PATH || ''; +import {withBasePath} from '@/lib/utils'; +export function Logo(props: React.ComponentPropsWithoutRef<'svg'>) { return ( <> {/* eslint-disable-next-line @next/next/no-img-element -- SVG logos do not need image optimization. */} Sourcegraph Docs {/* eslint-disable-next-line @next/next/no-img-element -- SVG logos do not need image optimization. */} Sourcegraph Docs diff --git a/src/components/NotFoundLinks.tsx b/src/components/NotFoundLinks.tsx index 9d532cb7b..0d0230562 100644 --- a/src/components/NotFoundLinks.tsx +++ b/src/components/NotFoundLinks.tsx @@ -4,6 +4,7 @@ import {usePreviousPathname} from '@/components/PreviousPathname'; import Link from 'next/link'; import {usePathname} from 'next/navigation'; import {useEffect, useMemo, useState} from 'react'; +import config from 'docs.config'; const linkClassName = 'text-sm font-medium text-slate-900 hover:underline dark:text-white'; @@ -22,9 +23,6 @@ function nearestExistingAncestor( return null; } -// Production serves the docs under /docs (basePath in next.config.js). -const basePath = process.env.NEXT_PUBLIC_DOCS_BASE_PATH || ''; - interface PageLink { href: string; pathname: string; @@ -39,8 +37,8 @@ function docsReferrer(): PageLink | null { if (!document.referrer) return null; const referrer = new URL(document.referrer); if (referrer.origin !== window.location.origin) return null; - if (!referrer.pathname.startsWith(`${basePath}/`)) return null; - const pathname = referrer.pathname.slice(basePath.length); + if (!referrer.pathname.startsWith(`${config.DOCS_BASE_PATH}/`)) return null; + const pathname = referrer.pathname.slice(config.DOCS_BASE_PATH.length); // The home link already covers the root. if (pathname === '/') return null; return {href: pathname + referrer.search + referrer.hash, pathname}; diff --git a/src/components/ReleasesTable.tsx b/src/components/ReleasesTable.tsx index 383830a37..bb81bc5f3 100644 --- a/src/components/ReleasesTable.tsx +++ b/src/components/ReleasesTable.tsx @@ -2,6 +2,7 @@ import {useEffect, useState} from 'react'; import Link from 'next/link'; +import {withBasePath} from '@/lib/utils'; type Release = { id: number; @@ -31,8 +32,7 @@ export function SupportedReleasesTable() { const [error, setError] = useState(null); useEffect(() => { - const basePath = process.env.NEXT_PUBLIC_DOCS_BASE_PATH || ''; - fetch(`${basePath}/api/releases`) + fetch(withBasePath('/api/releases')) .then(res => { if (!res.ok) throw new Error('Failed to fetch releases'); return res.json(); diff --git a/src/components/Toc.tsx b/src/components/Toc.tsx index 9d037c197..c62cae983 100644 --- a/src/components/Toc.tsx +++ b/src/components/Toc.tsx @@ -4,6 +4,7 @@ import clsx from 'clsx'; import Link from 'next/link'; import {useParams} from 'next/navigation'; import {useCallback, useEffect, useState} from 'react'; +import {withBasePath} from '@/lib/utils'; import {ClipboardIcon} from './icons/ClipboardIcon'; import {PencilIcon} from './icons/PencilIcon'; import {DocumentIcon} from './icons/DocumentIcon'; @@ -29,7 +30,6 @@ export function TableOfContents({headings, rawMarkdown, editPath}: Props) { let [currentSection, setCurrentSection] = useState(headings[0]?.id); const [copied, setCopied] = useState(false); const params: ParamsType = useParams(); - const basePath = process.env.NEXT_PUBLIC_DOCS_BASE_PATH || ''; const handleCopyPage = useCallback(async () => { if (!rawMarkdown) return; @@ -168,7 +168,7 @@ export function TableOfContents({headings, rawMarkdown, editPath}: Props) {

url.startsWith(PROD_DOCS_URL_PREFIX) - ? basePath + url.slice(PROD_DOCS_URL_PREFIX.length) + ? withBasePath(url.slice(PROD_DOCS_URL_PREFIX.length)) : url; const hitPriority = (hit: DocSearchHit): number => { diff --git a/src/components/search/docsearch/NoResultsScreen.tsx b/src/components/search/docsearch/NoResultsScreen.tsx index a378d7040..feeff3bda 100644 --- a/src/components/search/docsearch/NoResultsScreen.tsx +++ b/src/components/search/docsearch/NoResultsScreen.tsx @@ -1,5 +1,6 @@ import React from 'react'; import {productFilterLinks} from '../../../data/search'; +import {withBasePath} from '@/lib/utils'; import type {ScreenStateProps} from './ScreenState'; import type {InternalDocSearchHit} from './types'; @@ -18,8 +19,6 @@ type NoResultsScreenProps = Omit< translations?: NoResultsScreenTranslations; }; -const basePath = process.env.NEXT_PUBLIC_DOCS_BASE_PATH || ''; - export function NoResultsScreen({ translations = {}, ...props @@ -56,7 +55,7 @@ export function NoResultsScreen({
  • {suggestion.title} diff --git a/src/components/search/docsearch/StartScreen.tsx b/src/components/search/docsearch/StartScreen.tsx index 6bd1003c0..b4c6925b3 100644 --- a/src/components/search/docsearch/StartScreen.tsx +++ b/src/components/search/docsearch/StartScreen.tsx @@ -2,6 +2,7 @@ import {RecentIcon} from './icons/RecentIcon'; import {ResetIcon} from './icons/ResetIcon'; import {StarIcon} from './icons/StarIcon'; import {curatedSearchSuggestions} from '../../../data/search'; +import {withBasePath} from '@/lib/utils'; import {Results} from './Results'; import type {ScreenStateProps} from './ScreenState'; @@ -24,8 +25,6 @@ type StartScreenProps = Omit< translations?: StartScreenTranslations; }; -const basePath = process.env.NEXT_PUBLIC_DOCS_BASE_PATH || ''; - function Suggestions() { return (
    {curatedSearchSuggestions.map(suggestion => (
  • - + {suggestion.title} diff --git a/src/lib/utils.ts b/src/lib/utils.ts index fb935217b..67b891dc9 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,15 +1,14 @@ import {type ClassValue, clsx} from 'clsx'; +import config from 'docs.config'; import {twMerge} from 'tailwind-merge'; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } -// The site is served under /docs (basePath in next.config.js). next/link adds it -// to hrefs, but and next/image do not, so a root-relative path to a -// file in public/ 404s unless prefixed here. +// next/link and routing add the basePath; , , fetch() and +// metadata URLs do not, so root-relative URLs for those go through here. export function withBasePath(url: string) { - const basePath = process.env.NEXT_PUBLIC_DOCS_BASE_PATH || ''; const isRootRelative = url.startsWith('/') && !url.startsWith('//'); - return isRootRelative ? `${basePath}${url}` : url; + return isRootRelative ? `${config.DOCS_BASE_PATH}${url}` : url; } diff --git a/src/proxy.ts b/src/proxy.ts index f3d1e3cda..f944986d2 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -48,19 +48,19 @@ function createRedirectUrl( } // Handle relative paths - const basePath = '/docs'; + const base = `${request.nextUrl.origin}${docsConfig.DOCS_BASE_PATH}`; return destination.startsWith('/') - ? `${request.nextUrl.origin}${basePath}${destination}` - : `${request.nextUrl.origin}${basePath}/${destination}`; + ? `${base}${destination}` + : `${base}/${destination}`; } export function proxy(request: NextRequest) { + // nextUrl.pathname excludes basePath, so /docs/x arrives here as /x. const path = request.nextUrl.pathname; - const pathWithoutBase = path.replace('/docs', ''); // Handle .md suffix - return raw markdown - if (pathWithoutBase.endsWith('.md')) { - const docPath = pathWithoutBase.replace(/\.md$/, ''); + if (path.endsWith('.md')) { + const docPath = path.replace(/\.md$/, ''); const url = request.nextUrl.clone(); url.pathname = `/api/md${docPath}`; return NextResponse.rewrite(url); @@ -68,7 +68,7 @@ export function proxy(request: NextRequest) { // Handle base redirects from redirects.ts const redirect = updatedRedirectsData.find( - (r: any) => r.source === pathWithoutBase + (r: any) => r.source === path ); if (redirect) { return NextResponse.redirect( @@ -77,7 +77,7 @@ export function proxy(request: NextRequest) { } // Handle latest version without path - redirect to main docs - const latestVersionOnlyMatch = pathWithoutBase.match( + const latestVersionOnlyMatch = path.match( `^\/(?:v\/|@)${docsConfig.DOCS_LATEST_VERSION}\/?$` ); if (latestVersionOnlyMatch) { @@ -85,7 +85,7 @@ export function proxy(request: NextRequest) { } // Handle version without slug - both /v/X.Y and @X.Y formats (for non-latest versions) - const versionOnlyMatch = pathWithoutBase.match( + const versionOnlyMatch = path.match( /^\/(?:v\/|@)(\d+\.\d+)\/?$/ ); if ( @@ -98,47 +98,47 @@ export function proxy(request: NextRequest) { } // Handle version-specific redirects - if (pathWithoutBase.startsWith(`/v/${docsConfig.DOCS_LATEST_VERSION}/`)) { + if (path.startsWith(`/v/${docsConfig.DOCS_LATEST_VERSION}/`)) { return NextResponse.redirect( createRedirectUrl( request, `https://sourcegraph.com/docs/:slug*`, - pathWithoutBase + path ) ); } - if (pathWithoutBase.startsWith(`/@${docsConfig.DOCS_LATEST_VERSION}/`)) { + if (path.startsWith(`/@${docsConfig.DOCS_LATEST_VERSION}/`)) { return NextResponse.redirect( createRedirectUrl( request, `https://sourcegraph.com/docs/:slug*`, - pathWithoutBase + path ) ); } - const versionMatch = pathWithoutBase.match(/^\/v\/(\d+\.\d+)\/(.*)/); + const versionMatch = path.match(/^\/v\/(\d+\.\d+)\/(.*)/); if (versionMatch) { return NextResponse.redirect( createRedirectUrl( request, 'https://:version.sourcegraph.com/:slug*', - pathWithoutBase + path ) ); } - const atVersionMatch = pathWithoutBase.match(/^\/@(\d+\.\d+)\/(.*)/); + const atVersionMatch = path.match(/^\/@(\d+\.\d+)\/(.*)/); if (atVersionMatch) { return NextResponse.redirect( createRedirectUrl( request, 'https://:version.sourcegraph.com/:slug*', - pathWithoutBase + path ) ); } - if (pathWithoutBase === '/changelog.rss') + if (path === '/changelog.rss') return NextResponse.redirect(TECHNICAL_CHANGELOG_RSS_URL); return NextResponse.next(); From 411d2b2a104cee0b81a12c3d310f68db0ae122ee Mon Sep 17 00:00:00 2001 From: Marc LeBlanc <7050295+marcleblanc2@users.noreply.github.com> Date: Thu, 17 Sep 2026 03:08:45 -0600 Subject: [PATCH 05/11] proxy: keep latest-version redirects on the current deployment /v//x and /@/x redirected to https://sourcegraph.com/docs/x even from a preview or local dev, so a reviewer testing those paths on a preview silently landed on production. The current deployment serves the latest version, so redirect to its own origin + DOCS_BASE_PATH instead. Also merges the identical /v/ and /@ branches. Amp-Thread-ID: https://ampcode.com/threads/T-01a0ae6a-1645-702a-a5ed-92f8b9bce33b Co-authored-by: Amp --- src/proxy.ts | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/proxy.ts b/src/proxy.ts index f944986d2..77770f16b 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -81,7 +81,9 @@ export function proxy(request: NextRequest) { `^\/(?:v\/|@)${docsConfig.DOCS_LATEST_VERSION}\/?$` ); if (latestVersionOnlyMatch) { - return NextResponse.redirect(`https://sourcegraph.com/docs`); + return NextResponse.redirect( + `${request.nextUrl.origin}${docsConfig.DOCS_BASE_PATH}` + ); } // Handle version without slug - both /v/X.Y and @X.Y formats (for non-latest versions) @@ -97,21 +99,15 @@ export function proxy(request: NextRequest) { ); } - // Handle version-specific redirects - if (path.startsWith(`/v/${docsConfig.DOCS_LATEST_VERSION}/`)) { - return NextResponse.redirect( - createRedirectUrl( - request, - `https://sourcegraph.com/docs/:slug*`, - path - ) - ); - } - if (path.startsWith(`/@${docsConfig.DOCS_LATEST_VERSION}/`)) { + // Latest version with a slug: this deployment serves it, so stay here. + if ( + path.startsWith(`/v/${docsConfig.DOCS_LATEST_VERSION}/`) || + path.startsWith(`/@${docsConfig.DOCS_LATEST_VERSION}/`) + ) { return NextResponse.redirect( createRedirectUrl( request, - `https://sourcegraph.com/docs/:slug*`, + `${request.nextUrl.origin}${docsConfig.DOCS_BASE_PATH}/:slug*`, path ) ); From 6b9f3cb7bcd83b52ba4673d1fb88bb568368b800 Mon Sep 17 00:00:00 2001 From: Marc LeBlanc <7050295+marcleblanc2@users.noreply.github.com> Date: Thu, 17 Sep 2026 03:27:27 -0600 Subject: [PATCH 06/11] site: derive every /docs and production URL from docs.config.js The basePath has moved three times. Next time, change DOCS_BASE_PATH (and DOCS_PROD_ORIGIN if the host moves) in docs.config.js and nothing else: - versions.ts, api/versions, VersionSelector, sitemap, robots, Search and the layout canonical/metadataBase read DOCS_BASE_PATH / DOCS_PROD_URL instead of spelling out /docs or https://sourcegraph.com/docs - check-redirects, check-links (self-link regex) and verify-links-live import docs.config.js - preview-links.yml checks out the PR's docs.config.js to build page URLs - search.ts searchDocumentsPath is root-relative like every public/ path; it is only a flag for writing public/search.json .amp/services.yaml is YAML and keeps its literal path, with a note. Amp-Thread-ID: https://ampcode.com/threads/T-01a0ae6a-1645-702a-a5ed-92f8b9bce33b Co-authored-by: Amp --- .amp/services.yaml | 1 + .github/workflows/preview-links.yml | 11 +++++++++-- dev/algolia-index.mjs | 4 ++-- dev/check-links.mjs | 19 +++++++++++++------ dev/check-redirects.mjs | 29 ++++++++++++++++------------- dev/verify-links-live.mjs | 9 +++++---- docs.config.js | 13 ++++++++++--- src/app/[...slug]/page.tsx | 2 +- src/app/api/versions/route.ts | 3 ++- src/app/layout.tsx | 4 ++-- src/app/robots.ts | 3 ++- src/app/sitemap.ts | 7 +++---- src/components/VersionSelector.tsx | 3 ++- src/components/search/Search.tsx | 13 ++++++------- src/data/search.ts | 4 +++- src/data/versions.ts | 2 +- 16 files changed, 78 insertions(+), 49 deletions(-) diff --git a/.amp/services.yaml b/.amp/services.yaml index 73d0ae63a..e6614b0a4 100644 --- a/.amp/services.yaml +++ b/.amp/services.yaml @@ -4,6 +4,7 @@ services: port: 31420 env: NODE_OPTIONS: --max-old-space-size=3072 + # YAML cannot read DOCS_BASE_PATH from docs.config.js; keep these in step. health: /docs/agentic-batch-changes portal: url: /docs/agentic-batch-changes diff --git a/.github/workflows/preview-links.yml b/.github/workflows/preview-links.yml index c4447b8f9..20854b43f 100644 --- a/.github/workflows/preview-links.yml +++ b/.github/workflows/preview-links.yml @@ -29,6 +29,12 @@ jobs: if: github.event.client_payload.environment != 'production' runs-on: ubuntu-latest steps: + # The PR's own docs.config.js, for the basePath the preview serves under. + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.client_payload.git.sha || inputs.sha }} + sparse-checkout: docs.config.js + sparse-checkout-cone-mode: false - uses: actions/github-script@v7 env: PREVIEW_URL: ${{ github.event.client_payload.url || inputs.url }} @@ -36,6 +42,7 @@ jobs: with: script: | const {PREVIEW_URL, COMMIT_SHA} = process.env; + const {DOCS_BASE_PATH} = require(`${process.env.GITHUB_WORKSPACE}/docs.config.js`); if (!PREVIEW_URL || !/^[0-9a-f]{40}$/i.test(COMMIT_SHA ?? '')) { core.setFailed(`Need a preview URL and a full commit SHA; got url=${JSON.stringify(PREVIEW_URL)} sha=${JSON.stringify(COMMIT_SHA)}. ` + `Vercel sends these as client_payload.url and client_payload.git.sha; workflow_dispatch takes them as the url and sha inputs.`); @@ -60,11 +67,11 @@ jobs: }); // Mirror contentlayer's flattenedPath: docs/.mdx -> /, - // with a trailing /index dropped, under the /docs basePath. + // with a trailing /index dropped, under the basePath. const pages = files .filter(f => f.filename.startsWith('docs/') && f.filename.endsWith('.mdx') && f.status !== 'removed') .map(f => f.filename.slice('docs/'.length, -'.mdx'.length).replace(/^index$/, '').replace(/\/index$/, '')) - .map(path => ({path, url: `${previewUrl}/docs/${path}`})); + .map(path => ({path, url: `${previewUrl}${DOCS_BASE_PATH}/${path}`})); if (pages.length === 0) { core.info(`PR #${pr.number} changes no docs pages; not commenting.`); diff --git a/dev/algolia-index.mjs b/dev/algolia-index.mjs index a7ebed8c7..b8f47e83d 100644 --- a/dev/algolia-index.mjs +++ b/dev/algolia-index.mjs @@ -25,12 +25,12 @@ import fs from 'node:fs'; import path from 'node:path'; import {fileURLToPath} from 'node:url'; import GithubSlugger from 'github-slugger'; +import config from '../docs.config.js'; const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); const generatedDir = path.join(root, '.contentlayer/generated/Post'); const outDir = path.join(root, '.algolia'); -const SITE_URL = 'https://sourcegraph.com/docs'; const DEFAULT_INDEX = 'sourcegraph_docs'; const DEFAULT_APP_ID = 'JSZOJ0ZYVG'; // Consecutive paragraphs under the same heading are merged into chunks of up to @@ -282,7 +282,7 @@ function contentHash(content) { function buildPageRecords(post, owner, deduplication) { const url = post.url; - const pageUrl = SITE_URL + url; + const pageUrl = config.DOCS_PROD_URL + url; const slugger = new GithubSlugger(); const pageRank = Math.round((post.seoPriority ?? 0.5) * 100); const records = []; diff --git a/dev/check-links.mjs b/dev/check-links.mjs index f9fd80857..74620146a 100644 --- a/dev/check-links.mjs +++ b/dev/check-links.mjs @@ -46,6 +46,7 @@ import fs from 'fs'; import path from 'path'; import GithubSlugger from 'github-slugger'; import { fileURLToPath, pathToFileURL } from 'url'; +import config from '../docs.config.js'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -279,11 +280,17 @@ function extractLinks(content, filePath) { } // Absolute links to this site, in every form the docs have used: http or https, -// scheme-relative, www., the legacy docs.sourcegraph.com host, or sourcegraph.com/docs. -// Links pinned to an old version (/@5.1/..., /v/5.1/...) are external: the -// middleware sends them to that version's own site (5.1.sourcegraph.com), whose -// pages are not in this repo, so only --check-external can validate them. -const SELF_LINK_REGEX = /^(?:https?:)?\/\/(?:www\.)?(?:docs\.sourcegraph\.com|sourcegraph\.com\/docs)(?=[/#?]|$)(?!\/@|\/v\/)/i; +// scheme-relative, www., the legacy docs.sourcegraph.com host, or the production +// URL from docs.config.js. Links pinned to an old version (/@5.1/..., /v/5.1/...) +// are external: the middleware sends them to that version's own site +// (5.1.sourcegraph.com), whose pages are not in this repo, so only +// --check-external can validate them. +const escapeRegExp = text => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +const PROD_HOST_AND_PATH = config.DOCS_PROD_URL.replace(/^https?:\/\//, ''); +const SELF_LINK_REGEX = new RegExp( + `^(?:https?:)?//(?:www\\.)?(?:docs\\.sourcegraph\\.com|${escapeRegExp(PROD_HOST_AND_PATH)})(?=[/#?]|$)(?!/@|/v/)`, + 'i' +); export function isSelfLink(url) { return SELF_LINK_REGEX.test(url); @@ -580,7 +587,7 @@ function markdownFindingList(findings) { const ABSOLUTE_LINKS_ADVICE = 'Write links on this site as relative paths (`/admin/config/site-config`), ' + - 'not `https://sourcegraph.com/docs/…`: absolute links leave the preview ' + + `not \`${config.DOCS_PROD_URL}/…\`: absolute links leave the preview ` + 'deployment and local dev server, and hide moved pages behind redirects.'; // Body for a pull request comment. With --diff, findings are split into diff --git a/dev/check-redirects.mjs b/dev/check-redirects.mjs index f84d0e191..32d038c21 100644 --- a/dev/check-redirects.mjs +++ b/dev/check-redirects.mjs @@ -10,8 +10,8 @@ * - the source has no #fragment: browsers never send fragments, so such an * entry can never match * - the source has no earlier entry: the middleware uses the first match only - * - neither path starts with /docs: the middleware strips that prefix from - * requests and adds it to destinations + * - neither path starts with the basePath (docs.config.js): Next strips it + * from requests and the middleware adds it to destinations * - the destination is a page, not another redirect * - the destination page exists under docs/ (or is a file under public/) * - when the destination has a #fragment, the heading exists on that page @@ -39,11 +39,13 @@ import path from 'path'; import vm from 'vm'; import {fileURLToPath} from 'url'; import {extractHeadings, listFiles, routeFor} from './check-links.mjs'; +import config from '../docs.config.js'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const args = process.argv.slice(2); const ROOT_DIR = path.resolve(flagValue('--root') ?? path.dirname(__dirname)); +const BASE_PATH = config.DOCS_BASE_PATH; const FORMAT = flagValue('--format') ?? 'text'; const BASELINE_FILE = flagValue('--baseline'); const LINK_BASE = flagValue('--link-base')?.replace(/\/$/, ''); @@ -72,12 +74,12 @@ const PROBLEM = { 'If the redirect destination has a #fragment, it takes precedence, otherwise if the customer ' + "clicked a link which has a #fragment, it'll be kept and tried on the destination page." }, - docsPrefix: { - heading: 'Source or destination starts with /docs', + basePathPrefix: { + heading: `Source or destination starts with ${BASE_PATH}`, fix: - 'Write paths without the /docs prefix. The site removes /docs from the requested URL before ' + - 'matching sources, and adds it back in front of the destination, so a /docs/... source never ' + - 'matches and a /docs/... destination lands on /docs/docs/....' + `Write paths without the ${BASE_PATH} prefix. The site removes ${BASE_PATH} from the requested URL before ` + + `matching sources, and adds it back in front of the destination, so a ${BASE_PATH}/... source never ` + + `matches and a ${BASE_PATH}/... destination lands on ${BASE_PATH}${BASE_PATH}/....` }, duplicateSource: { heading: @@ -198,7 +200,8 @@ function findBrokenRedirects(redirects, headingsByRoute) { const report = (redirect, problem, {detail, fix} = {}) => findings.push({...redirect, problem: problem.heading, detail, fix}); const withoutFragment = url => url.split('#')[0]; - const withoutDocsPrefix = url => url.replace(/^\/docs(?=\/)/, ''); + const withoutBasePath = url => + url.startsWith(`${BASE_PATH}/`) ? url.slice(BASE_PATH.length) : url; const isRedirect = pathname => firstBySource.has(pathname) && !headingsByRoute.has(pathname); @@ -220,13 +223,13 @@ function findBrokenRedirects(redirects, headingsByRoute) { report(redirect, PROBLEM.shadowsPage); } if ( - source.pathname.startsWith('/docs/') || - redirect.destination.startsWith('/docs/') + source.pathname.startsWith(`${BASE_PATH}/`) || + redirect.destination.startsWith(`${BASE_PATH}/`) ) { - report(redirect, PROBLEM.docsPrefix, { + report(redirect, PROBLEM.basePathPrefix, { fix: { - source: withoutDocsPrefix(redirect.source), - destination: withoutDocsPrefix(redirect.destination) + source: withoutBasePath(redirect.source), + destination: withoutBasePath(redirect.destination) } }); continue; diff --git a/dev/verify-links-live.mjs b/dev/verify-links-live.mjs index b39d32f4b..f2120d68e 100644 --- a/dev/verify-links-live.mjs +++ b/dev/verify-links-live.mjs @@ -15,20 +15,21 @@ // // node dev/verify-links-live.mjs --site https://.vercel.app/docs [--old-site https://sourcegraph.com/docs] [--base origin/main] // -// Every deployment serves under /docs (basePath in next.config.js), so --site -// includes that prefix. +// Every deployment serves under the basePath (docs.config.js), so --site +// includes that prefix. Both default to production. import { execSync } from 'node:child_process'; import fs from 'node:fs'; import path from 'node:path'; import { extractHeadings } from './check-links.mjs'; +import config from '../docs.config.js'; const args = process.argv.slice(2); const argValue = (flag, fallback) => { const index = args.indexOf(flag); return index === -1 ? fallback : args[index + 1]; }; -const SITE = argValue('--site', 'https://sourcegraph.com/docs').replace(/\/$/, ''); -const OLD_SITE = argValue('--old-site', 'https://sourcegraph.com/docs').replace(/\/$/, ''); +const SITE = argValue('--site', config.DOCS_PROD_URL).replace(/\/$/, ''); +const OLD_SITE = argValue('--old-site', config.DOCS_PROD_URL).replace(/\/$/, ''); const BASE_REF = argValue('--base', 'origin/main'); const LINK = /\]\(([^)\s]+)\)|href=["']([^"']+)["']/g; diff --git a/docs.config.js b/docs.config.js index f5b04f4b9..51c5d04be 100644 --- a/docs.config.js +++ b/docs.config.js @@ -1,8 +1,15 @@ +// sourcegraph.com proxies DOCS_BASE_PATH/* to this site. Previews and local dev +// use the same basePath so a root-relative URL that 404s in production 404s +// there too. To move the site, change DOCS_BASE_PATH here and the load balancer +// rule in sourcegraph/infrastructure; nothing else spells the path out. +const DOCS_BASE_PATH = '/docs'; +const DOCS_PROD_ORIGIN = 'https://sourcegraph.com'; + const config = { DOCS_LATEST_VERSION: '8.0', - // sourcegraph.com proxies /docs/* to this site. Previews and local dev use the - // same basePath so a root-relative URL that 404s in production 404s there too. - DOCS_BASE_PATH: '/docs' + DOCS_BASE_PATH, + DOCS_PROD_ORIGIN, + DOCS_PROD_URL: `${DOCS_PROD_ORIGIN}${DOCS_BASE_PATH}` }; module.exports = config; diff --git a/src/app/[...slug]/page.tsx b/src/app/[...slug]/page.tsx index 095d5871c..831eab97d 100644 --- a/src/app/[...slug]/page.tsx +++ b/src/app/[...slug]/page.tsx @@ -35,7 +35,7 @@ export const generateMetadata = async ({params}: Props) => { // The root layout's canonical is the landing page; without this // override every docs page tells search engines it is a duplicate // of https://sourcegraph.com/docs. - alternates: {canonical: `/docs${post.url}`}, + alternates: {canonical: withBasePath(post.url)}, openGraph: { images: [{url: ogImageUrl, width: 1200, height: 630}] }, diff --git a/src/app/api/versions/route.ts b/src/app/api/versions/route.ts index 686d5c24e..b87d9c031 100644 --- a/src/app/api/versions/route.ts +++ b/src/app/api/versions/route.ts @@ -1,4 +1,5 @@ import {versions} from '@/data/versions'; +import config from 'docs.config'; import {NextResponse} from 'next/server'; // Next 15+ no longer caches GET handlers by default; the version list is @@ -9,7 +10,7 @@ export function GET() { return NextResponse.json( versions.map((version, index) => index === 0 - ? {...version, url: 'https://sourcegraph.com/docs'} + ? {...version, url: config.DOCS_PROD_URL} : version ), { diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 97a20de64..3a696a774 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -12,7 +12,7 @@ import {Suspense} from 'react'; import '@/styles/tailwind.css'; export const metadata: Metadata = { - metadataBase: new URL('https://sourcegraph.com'), + metadataBase: new URL(config.DOCS_PROD_ORIGIN), title: { template: '%s - Sourcegraph docs', default: 'Sourcegraph docs' @@ -24,7 +24,7 @@ export const metadata: Metadata = { 'docsearch:version': `v${config.DOCS_LATEST_VERSION}` }, alternates: { - canonical: '/docs' + canonical: config.DOCS_BASE_PATH }, openGraph: { images: [{url: withBasePath('/api/og/index'), width: 1200, height: 630}] diff --git a/src/app/robots.ts b/src/app/robots.ts index 35d3bdba1..ed87f84e1 100644 --- a/src/app/robots.ts +++ b/src/app/robots.ts @@ -1,4 +1,5 @@ import {MetadataRoute} from 'next'; +import config from 'docs.config'; export default async function robots(): Promise { return { @@ -6,6 +7,6 @@ export default async function robots(): Promise { userAgent: '*', allow: '/' }, - sitemap: 'https://sourcegraph.com/docs/sitemap.xml' + sitemap: `${config.DOCS_PROD_URL}/sitemap.xml` }; } diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts index 618ceb52f..968493c84 100644 --- a/src/app/sitemap.ts +++ b/src/app/sitemap.ts @@ -1,12 +1,11 @@ import {MetadataRoute} from 'next'; import {allPosts} from 'contentlayer/generated'; +import config from 'docs.config'; export default async function sitemap(): Promise { - const baseUrl = 'https://sourcegraph.com/docs'; - const links: MetadataRoute.Sitemap = [ { - url: baseUrl, + url: config.DOCS_PROD_URL, lastModified: new Date(), changeFrequency: 'weekly', priority: 1.0 @@ -18,7 +17,7 @@ export default async function sitemap(): Promise { .forEach(post => { const priority = post.seoPriority; links.push({ - url: `${baseUrl}${post.url}`, + url: `${config.DOCS_PROD_URL}${post.url}`, lastModified: post.date ? new Date(post.date) : new Date(), changeFrequency: 'weekly', ...(priority !== undefined && priority !== 0.5 && {priority}) diff --git a/src/components/VersionSelector.tsx b/src/components/VersionSelector.tsx index 90b34b93c..4fcfa8cbe 100644 --- a/src/components/VersionSelector.tsx +++ b/src/components/VersionSelector.tsx @@ -8,13 +8,14 @@ import { ChevronDownIcon } from '@heroicons/react/20/solid'; import clsx from 'clsx'; +import config from 'docs.config'; import Link from 'next/link'; import {usePathname} from 'next/navigation'; import {Fragment, useEffect, useState} from 'react'; const versionsUrl = process.env.NEXT_PUBLIC_DOCS_VERSIONS_URL ?? - 'https://sourcegraph.com/docs/api/versions'; + `${config.DOCS_PROD_URL}/api/versions`; function isVersion(value: unknown): value is VersionI { if (typeof value !== 'object' || value === null) return false; diff --git a/src/components/search/Search.tsx b/src/components/search/Search.tsx index 4d7a3de22..b1418d17d 100644 --- a/src/components/search/Search.tsx +++ b/src/components/search/Search.tsx @@ -1,4 +1,5 @@ import {withBasePath} from '@/lib/utils'; +import config from 'docs.config'; import {productFilters, searchMetadata} from '../../data/search'; import {DocSearch} from './docsearch/DocSearch'; import type {DocSearchHit} from './docsearch/types'; @@ -6,14 +7,12 @@ import './docsearch/docsearch.css'; // import '@docsearch/css'; -// The Algolia crawler indexes production, so every hit URL is absolute -// (https://sourcegraph.com/docs/...). Rewrite them to root-relative paths so -// results stay on whichever deployment is being viewed. -const PROD_DOCS_URL_PREFIX = 'https://sourcegraph.com/docs'; - +// The Algolia crawler indexes production, so every hit URL is absolute. +// Rewrite them to root-relative paths so results stay on whichever deployment +// is being viewed. const toLocalUrl = (url: string): string => - url.startsWith(PROD_DOCS_URL_PREFIX) - ? withBasePath(url.slice(PROD_DOCS_URL_PREFIX.length)) + url.startsWith(config.DOCS_PROD_URL) + ? withBasePath(url.slice(config.DOCS_PROD_URL.length)) : url; const hitPriority = (hit: DocSearchHit): number => { diff --git a/src/data/search.ts b/src/data/search.ts index 2cda44b00..e50883263 100644 --- a/src/data/search.ts +++ b/src/data/search.ts @@ -67,7 +67,9 @@ export const curatedSearchSuggestions = [ export const searchMetadata = { provider: 'kbar', kbarConfig: { - searchDocumentsPath: '/docs/search.json' // path to load documents to search + // Root-relative like every public/ path; contentlayer.config.ts only checks + // it is set before writing public/search.json. + searchDocumentsPath: '/search.json' }, // For Algolia // provider: 'algolia', diff --git a/src/data/versions.ts b/src/data/versions.ts index f36a7442c..db5dcc035 100644 --- a/src/data/versions.ts +++ b/src/data/versions.ts @@ -11,7 +11,7 @@ export const versions: VersionI[] = [ { name: `v${config.DOCS_LATEST_VERSION}`, label: 'latest', - url: '/docs' + url: config.DOCS_BASE_PATH }, { name: 'v7.7', From 04645b7b2c0dd82b90569135a6fe8a622c811bc6 Mon Sep 17 00:00:00 2001 From: Marc LeBlanc <7050295+marcleblanc2@users.noreply.github.com> Date: Thu, 17 Sep 2026 03:56:45 -0600 Subject: [PATCH 07/11] chore: drop the kbar search index and the dead MDX video mapping kbar was removed in #110; the contentlayer onSuccess hook kept writing a 725 KB public/search.json that nothing fetched. src/utils/contentlayer.ts only existed to build that index. MDX compiles an explicit
    diff --git a/src/data/search.ts b/src/data/search.ts index e50883263..006adb462 100644 --- a/src/data/search.ts +++ b/src/data/search.ts @@ -65,14 +65,6 @@ export const curatedSearchSuggestions = [ ] as const; export const searchMetadata = { - provider: 'kbar', - kbarConfig: { - // Root-relative like every public/ path; contentlayer.config.ts only checks - // it is set before writing public/search.json. - searchDocumentsPath: '/search.json' - }, - // For Algolia - // provider: 'algolia', algoliaConfig: { // The application ID provided by Algolia appId: 'JSZOJ0ZYVG', diff --git a/src/utils/contentlayer.ts b/src/utils/contentlayer.ts deleted file mode 100644 index 47ccf2bbd..000000000 --- a/src/utils/contentlayer.ts +++ /dev/null @@ -1,65 +0,0 @@ -import type {Document, MDX} from 'contentlayer2/core'; - -const isProduction = process.env.NODE_ENV === 'production'; - -export type MDXDocument = Document & {body: MDX}; - -type ConvertUndefined = OrNull<{ - [K in keyof T as undefined extends T[K] ? K : never]-?: T[K]; -}>; -type OrNull = {[K in keyof T]: Exclude | null}; -type PickRequired = { - [K in keyof T as undefined extends T[K] ? never : K]: T[K]; -}; -type ConvertPick = ConvertUndefined & PickRequired; - -/** - * A typesafe omit helper function - * @example omit(content, ['body', '_raw', '_id']) - * - * @param {Obj} obj - * @param {Keys[]} keys - * @return {*} {Omit} - */ -export const omit = ( - obj: Obj, - keys: Keys[] -): Omit => { - const result = Object.assign({}, obj); - keys.forEach(key => { - delete result[key]; - }); - return result; -}; - -export type CoreContent = Omit; - -/** - * Omit body, _raw, _id from MDX document and return only the core content - * - * @param {T} content - * @return {*} {CoreContent} - */ -export function coreContent(content: T): CoreContent { - return omit(content, ['body', '_raw', '_id']); -} - -/** - * Omit body, _raw, _id from a list of MDX documents and returns only the core content - * If `NODE_ENV` === "production", it will also filter out any documents with draft: true. - * - * @param {T[]} contents - * @return {*} {CoreContent[]} - */ -export function allCoreContent( - contents: T[] -): CoreContent[] { - if (isProduction) - return contents - .map(c => coreContent(c)) - .filter(c => !('draft' in c && c.draft === true)) - .filter(c => !('preview' in c && c.preview === true)); - return contents - .map(c => coreContent(c)) - .filter(c => !('preview' in c && c.preview === true)); -} From 39deda6010d7bf3505e05ee6e43fd4899c4a5335 Mon Sep 17 00:00:00 2001 From: Marc LeBlanc <7050295+marcleblanc2@users.noreply.github.com> Date: Thu, 17 Sep 2026 22:47:35 -0600 Subject: [PATCH 08/11] chore: drop dead DocSearch icons, a stale hook duplicate, and unused exports knip flagged these and rg confirms nothing imports them: - docsearch/icons/index.ts barrel, and the AlgoliaLogo, NoResultsIcon, ControlKeyIcon, GoToExternalIcon icons only it re-exported. The two commented-out usages in Footer.tsx and NoResultsScreen.tsx go with them, along with the searchByText translation that only fed AlgoliaLogo - docsearch/types/useDocSearchKeyboardEvents.ts, a drifted copy of the sibling hook DocSearch.tsx actually imports - src/images/logos/aws/index.ts, generator output from before dev/generate-mermaid-icons.mjs switched to icons.generated.ts - latestVersion in src/data/versions.ts, exported since #48 with no reader Amp-Thread-ID: https://ampcode.com/threads/T-01a0ae6a-1645-702a-a5ed-92f8b9bce33b Co-authored-by: Amp --- src/components/search/docsearch/Footer.tsx | 5 +- .../search/docsearch/NoResultsScreen.tsx | 3 - .../search/docsearch/icons/AlgoliaLogo.tsx | 75 ------------------ .../search/docsearch/icons/ControlKeyIcon.tsx | 13 --- .../docsearch/icons/GoToExternalIcon.tsx | 13 --- .../search/docsearch/icons/NoResultsIcon.tsx | 18 ----- .../search/docsearch/icons/index.ts | 10 --- .../types/useDocSearchKeyboardEvents.ts | 79 ------------------- src/data/versions.ts | 2 - src/images/logos/aws/index.ts | 51 ------------ 10 files changed, 1 insertion(+), 268 deletions(-) delete mode 100644 src/components/search/docsearch/icons/AlgoliaLogo.tsx delete mode 100644 src/components/search/docsearch/icons/ControlKeyIcon.tsx delete mode 100644 src/components/search/docsearch/icons/GoToExternalIcon.tsx delete mode 100644 src/components/search/docsearch/icons/NoResultsIcon.tsx delete mode 100644 src/components/search/docsearch/icons/index.ts delete mode 100644 src/components/search/docsearch/types/useDocSearchKeyboardEvents.ts delete mode 100644 src/images/logos/aws/index.ts diff --git a/src/components/search/docsearch/Footer.tsx b/src/components/search/docsearch/Footer.tsx index 6b91312a3..6de077750 100644 --- a/src/components/search/docsearch/Footer.tsx +++ b/src/components/search/docsearch/Footer.tsx @@ -8,7 +8,6 @@ export type FooterTranslations = Partial<{ navigateDownKeyAriaLabel: string; closeText: string; closeKeyAriaLabel: string; - searchByText: string; }>; type FooterProps = Partial<{ @@ -50,15 +49,13 @@ export function Footer({translations = {}}: FooterProps) { navigateUpKeyAriaLabel = 'Arrow up', navigateDownKeyAriaLabel = 'Arrow down', closeText = 'to close', - closeKeyAriaLabel = 'Escape key', - searchByText = 'Search by' + closeKeyAriaLabel = 'Escape key' } = translations; return ( <>
    Search by Algolia - {/* */}
    • diff --git a/src/components/search/docsearch/NoResultsScreen.tsx b/src/components/search/docsearch/NoResultsScreen.tsx index feeff3bda..88d8582a9 100644 --- a/src/components/search/docsearch/NoResultsScreen.tsx +++ b/src/components/search/docsearch/NoResultsScreen.tsx @@ -38,9 +38,6 @@ export function NoResultsScreen({ return (
      - {/*
      - -
      */}

      {noResultsText} "{props.state.query}"

      diff --git a/src/components/search/docsearch/icons/AlgoliaLogo.tsx b/src/components/search/docsearch/icons/AlgoliaLogo.tsx deleted file mode 100644 index 741b798f9..000000000 --- a/src/components/search/docsearch/icons/AlgoliaLogo.tsx +++ /dev/null @@ -1,75 +0,0 @@ -type AlgoliaLogoTranslations = Partial<{ - searchByText: string; -}>; - -type AlgoliaLogoProps = { - translations?: AlgoliaLogoTranslations; -}; - -export function AlgoliaLogo({translations = {}}: AlgoliaLogoProps) { - const {searchByText = 'Search by'} = translations; - - return ( -
      - {searchByText} - - - - - - - - - - - - - - - - ); -} diff --git a/src/components/search/docsearch/icons/ControlKeyIcon.tsx b/src/components/search/docsearch/icons/ControlKeyIcon.tsx deleted file mode 100644 index 55ba79946..000000000 --- a/src/components/search/docsearch/icons/ControlKeyIcon.tsx +++ /dev/null @@ -1,13 +0,0 @@ -export function ControlKeyIcon() { - return ( - - - - ); -} diff --git a/src/components/search/docsearch/icons/GoToExternalIcon.tsx b/src/components/search/docsearch/icons/GoToExternalIcon.tsx deleted file mode 100644 index de03ad834..000000000 --- a/src/components/search/docsearch/icons/GoToExternalIcon.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from 'react'; - -export function GoToExternal() { - return ( - - - - ); -} diff --git a/src/components/search/docsearch/icons/NoResultsIcon.tsx b/src/components/search/docsearch/icons/NoResultsIcon.tsx deleted file mode 100644 index f87f7a484..000000000 --- a/src/components/search/docsearch/icons/NoResultsIcon.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react'; - -export function NoResultsIcon() { - return ( - - - - ); -} diff --git a/src/components/search/docsearch/icons/index.ts b/src/components/search/docsearch/icons/index.ts deleted file mode 100644 index b3c85dc99..000000000 --- a/src/components/search/docsearch/icons/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * from './GoToExternalIcon'; -export * from './LoadingIcon'; -export * from './RecentIcon'; -export * from './ResetIcon'; -export * from './SearchIcon'; -export * from './SelectIcon'; -export * from './SourceIcon'; -export * from './StarIcon'; -export * from './ErrorIcon'; -export * from './NoResultsIcon'; diff --git a/src/components/search/docsearch/types/useDocSearchKeyboardEvents.ts b/src/components/search/docsearch/types/useDocSearchKeyboardEvents.ts deleted file mode 100644 index 32b676452..000000000 --- a/src/components/search/docsearch/types/useDocSearchKeyboardEvents.ts +++ /dev/null @@ -1,79 +0,0 @@ -import React from 'react'; - -export interface UseDocSearchKeyboardEventsProps { - isOpen: boolean; - onOpen: () => void; - onClose: () => void; - onInput?: (event: KeyboardEvent) => void; - searchButtonRef?: React.RefObject; -} - -function isEditingContent(event: KeyboardEvent): boolean { - const element = event.target as HTMLElement; - const tagName = element.tagName; - - return ( - element.isContentEditable || - tagName === 'INPUT' || - tagName === 'SELECT' || - tagName === 'TEXTAREA' - ); -} - -export function useDocSearchKeyboardEvents({ - isOpen, - onOpen, - onClose, - onInput, - searchButtonRef -}: UseDocSearchKeyboardEventsProps) { - React.useEffect(() => { - function onKeyDown(event: KeyboardEvent) { - function open() { - // We check that no other DocSearch modal is showing before opening - // another one. - if (!document.body.classList.contains('DocSearch--active')) { - onOpen(); - } - } - if ( - (event.keyCode === 27 && isOpen) || - // The `Cmd+K` shortcut both opens and closes the modal. - // We need to check for `event.key` because it can be `undefined` with - // Chrome's autofill feature. - // See https://github.com/paperjs/paper.js/issues/1398 - (event.key?.toLowerCase() === 'k' && - (event.metaKey || event.ctrlKey)) || - // The `/` shortcut opens but doesn't close the modal because it's - // a character. - (!isEditingContent(event) && event.key === '/' && !isOpen) - ) { - event.preventDefault(); - - if (isOpen) { - onClose(); - } else if ( - !document.body.classList.contains('DocSearch--active') - ) { - open(); - } - } - - if ( - searchButtonRef && - searchButtonRef.current === document.activeElement && - onInput - ) { - if (/[a-zA-Z0-9]/.test(String.fromCharCode(event.keyCode))) { - onInput(event); - } - } - } - - window.addEventListener('keydown', onKeyDown); - - return () => { - window.removeEventListener('keydown', onKeyDown); - }; - }, [isOpen, onOpen, onClose, onInput, searchButtonRef]); -} diff --git a/src/data/versions.ts b/src/data/versions.ts index db5dcc035..c7c225159 100644 --- a/src/data/versions.ts +++ b/src/data/versions.ts @@ -70,5 +70,3 @@ export const versions: VersionI[] = [ url: 'https://6.7.sourcegraph.com/' } ]; - -export const latestVersion = versions[0]; diff --git a/src/images/logos/aws/index.ts b/src/images/logos/aws/index.ts deleted file mode 100644 index 734de16ce..000000000 --- a/src/images/logos/aws/index.ts +++ /dev/null @@ -1,51 +0,0 @@ -// AUTO-GENERATED by dev/generate-mermaid-icons.mjs — do not edit manually -export const icons = { - "prefix": "aws", - "icons": { - "alb": { - "body": "Icon-Resource/Networking-and-Content-Delivery/Res_Elastic-Load-Balancing_Application-Load-Balancer_48\n \n \n ", - "width": 40, - "height": 40 - }, - "ebs": { - "body": "Icon-Architecture/32/Arch_Amazon-Elastic-Block-Store_32\n \n \n \n \n \n ", - "width": 40, - "height": 40 - }, - "ec2": { - "body": "Icon-Architecture-Group/32/EC2-instance-contents_32\n \n \n \n ", - "width": 40, - "height": 40 - }, - "eks": { - "body": "Icon-Architecture/32/Arch_Amazon-Elastic-Kubernetes-Service_32\n \n \n \n \n \n ", - "width": 40, - "height": 40 - }, - "private-subnet": { - "body": "Icon-Architecture-Group/32/Private-subnet_32\n \n \n \n ", - "width": 40, - "height": 40 - }, - "public-subnet": { - "body": "Icon-Architecture-Group/32/Public-subnet_32\n \n \n \n ", - "width": 40, - "height": 40 - }, - "rds": { - "body": "Icon-Architecture/32/Arch_Amazon-RDS_32\n \n \n \n \n \n ", - "width": 40, - "height": 40 - }, - "s3": { - "body": "Icon-Architecture/32/Arch_Amazon-Simple-Storage-Service_32\n \n \n \n \n \n \n \n ", - "width": 40, - "height": 40 - }, - "vpc": { - "body": "Icon-Architecture-Group/32/Virtual-private-cloud-VPC_32\n \n \n \n ", - "width": 40, - "height": 40 - } - } -} as const; From e7aa1800b3142f8f12b044570e15d55557fa2bf8 Mon Sep 17 00:00:00 2001 From: Marc LeBlanc <7050295+marcleblanc2@users.noreply.github.com> Date: Thu, 17 Sep 2026 22:47:54 -0600 Subject: [PATCH 09/11] chore: drop three unused dependencies - @iconify-json/logos and @iconify/types: nothing in src/, dev/, or any config references them; Mermaid icon packs come from src/images/logos/*/icons.generated.ts - mdx: not MDX at all, a 2013 "generic documentation extractor", most likely a typo-install of @mdx-js/mdx. Nothing imports it Amp-Thread-ID: https://ampcode.com/threads/T-01a0ae6a-1645-702a-a5ed-92f8b9bce33b Co-authored-by: Amp --- package.json | 3 - pnpm-lock.yaml | 326 ------------------------------------------------- 2 files changed, 329 deletions(-) diff --git a/package.json b/package.json index c40eaf290..c2c122278 100644 --- a/package.json +++ b/package.json @@ -30,8 +30,6 @@ "@docsearch/react": "^3.5.2", "@headlessui/react": "^2.2.10", "@heroicons/react": "^2.1.1", - "@iconify-json/logos": "^1.2.10", - "@iconify/types": "^2.0.0", "@mdx-js/mdx": "^3.1.0", "@radix-ui/react-hover-card": "^1.1.5", "@radix-ui/react-select": "^2.0.0", @@ -51,7 +49,6 @@ "feed": "^4.2.2", "github-slugger": "^2.0.0", "lucide-react": "^0.372.0", - "mdx": "^0.3.1", "mermaid": "^11.16.1", "next": "^16.3.5", "next-contentlayer2": "^0.5.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ef3cd5c0..7ae20e18d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,12 +23,6 @@ importers: '@heroicons/react': specifier: ^2.1.1 version: 2.2.0(react@19.3.0) - '@iconify-json/logos': - specifier: ^1.2.10 - version: 1.2.10 - '@iconify/types': - specifier: ^2.0.0 - version: 2.0.0 '@mdx-js/mdx': specifier: ^3.1.0 version: 3.1.1 @@ -86,9 +80,6 @@ importers: lucide-react: specifier: ^0.372.0 version: 0.372.0(react@19.3.0) - mdx: - specifier: ^0.3.1 - version: 0.3.1 mermaid: specifier: ^11.16.1 version: 11.17.2 @@ -722,9 +713,6 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@iconify-json/logos@1.2.10': - resolution: {integrity: sha512-qxaXKJ6fu8jzTMPQdHtNxlfx6tBQ0jXRbHZIYy5Ilh8Lx9US9FsAdzZWUR8MXV8PnWTKGDFO4ZZee9VwerCyMA==} - '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -1950,10 +1938,6 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-find-index@1.0.2: - resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} - engines: {node: '>=0.10.0'} - array-includes@3.1.9: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} @@ -2079,14 +2063,6 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - camelcase-keys@2.1.0: - resolution: {integrity: sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==} - engines: {node: '>=0.10.0'} - - camelcase@2.1.1: - resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} - engines: {node: '>=0.10.0'} - caniuse-lite@1.0.30001769: resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} @@ -2215,10 +2191,6 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - currently-unhandled@0.4.1: - resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} - engines: {node: '>=0.10.0'} - cytoscape-cose-bilkent@4.1.0: resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} peerDependencies: @@ -2479,9 +2451,6 @@ packages: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} - error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - es-abstract@1.24.1: resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} engines: {node: '>= 0.4'} @@ -2747,10 +2716,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} - find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -2816,10 +2781,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stdin@4.0.1: - resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} - engines: {node: '>=0.10.0'} - get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -2866,9 +2827,6 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - gray-matter@4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} @@ -2964,9 +2922,6 @@ packages: highlightjs-vue@1.0.0: resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -2998,10 +2953,6 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - indent-string@2.1.0: - resolution: {integrity: sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==} - engines: {node: '>=0.10.0'} - inflection@3.0.2: resolution: {integrity: sha512-+Bg3+kg+J6JUWn8J6bzFmOWkTQ6L/NHfDRSYU+EVvuKHDxUDHAXgqixHfVlzuBQaPOTac8hn43aPhMNk6rMe3g==} engines: {node: '>=18.0.0'} @@ -3036,9 +2987,6 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -3096,10 +3044,6 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} - is-finite@1.1.0: - resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} - engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -3166,9 +3110,6 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} - is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -3281,10 +3222,6 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - load-json-file@1.1.0: - resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} - engines: {node: '>=0.10.0'} - loader-utils@2.0.4: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} engines: {node: '>=8.9.0'} @@ -3312,10 +3249,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loud-rejection@1.6.0: - resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==} - engines: {node: '>=0.10.0'} - lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -3334,10 +3267,6 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} @@ -3411,20 +3340,12 @@ packages: peerDependencies: esbuild: 0.* - mdx@0.3.1: - resolution: {integrity: sha512-i+oUkB4ntcYVYnjiuktpYP77m/ISDg7z1B2pL+alDNFPgRkXlkYaW6zY03103/88A06E3Pn6x/DL9qB8pT9xWA==} - hasBin: true - memfs@4.75.0: resolution: {integrity: sha512-ds3qQCghw0FsG9S+CSAR9F1n5nCwlA7Z5Mf8xgRec6iBAVPPwldmD5UxJhMstWhMhOVBwZ/FoBz09B46m3Le/g==} memoize-one@4.0.3: resolution: {integrity: sha512-QmpUu4KqDmX0plH4u+tf0riMc1KHE1+lw95cMrLlXQAFOx/xnBtwhZ52XJxd9X2O6kwKBqX32kmhbhlobD0cuw==} - meow@3.6.0: - resolution: {integrity: sha512-1zRGO8C/2QD8uBxZbwwKbIQHrHKANzVnlK/3Gj7xro+ks4HLmayvETy+BnCV+wm68PE6dYcfgyTDMVG2mjlQwg==} - engines: {node: '>=0.10.0'} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -3564,11 +3485,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mustache@2.2.1: - resolution: {integrity: sha512-azYRexmi9y6h2lk2JqfBLh1htlDMjKYyEYOkxoGKa0FRdr5aY4f5q8bH4JIecM181DtUEYLSz8PcRO46mgzMNQ==} - engines: {npm: '>=1.4.0'} - hasBin: true - mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -3627,17 +3543,10 @@ packages: resolution: {integrity: sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==} engines: {node: '>=18'} - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - object-assign@4.0.1: - resolution: {integrity: sha512-c6legOHWepAbWnp3j5SRUMpxCXBKI4rD7A5Osn9IzZ8w4O/KccXdW0lqdkQKbpk0eHGjNgKihgzY6WuEq99Tfw==} - engines: {node: '>=0.10.0'} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -3710,10 +3619,6 @@ packages: parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} - parse-json@2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} - engines: {node: '>=0.10.0'} - parse-numeric-range@1.3.0: resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} @@ -3726,10 +3631,6 @@ packages: path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} - path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3745,10 +3646,6 @@ packages: resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} engines: {node: 20 || >=22} - path-type@1.1.0: - resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} - engines: {node: '>=0.10.0'} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -3767,14 +3664,6 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - - pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -4010,17 +3899,6 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - read-input@0.3.1: - resolution: {integrity: sha512-J1ZkWCnB4altU7RTe+62PSfa21FrEtfKyO9fuqR3yP8kZku3nIwaw2Krj383JC7egAIl5Zyz2w+EOu9uXH5HZw==} - - read-pkg-up@1.0.1: - resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} - engines: {node: '>=0.10.0'} - - read-pkg@1.1.0: - resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} - engines: {node: '>=0.10.0'} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -4039,10 +3917,6 @@ packages: recma-stringify@1.0.0: resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} - redent@1.0.0: - resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==} - engines: {node: '>=0.10.0'} - reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -4100,10 +3974,6 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - repeating@2.0.1: - resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} - engines: {node: '>=0.10.0'} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -4169,10 +4039,6 @@ packages: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -4230,9 +4096,6 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -4265,18 +4128,6 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.22: - resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} - sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -4328,19 +4179,10 @@ packages: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} - strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-indent@1.0.1: - resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==} - engines: {node: '>=0.10.0'} - hasBin: true - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -4436,10 +4278,6 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - trim-newlines@1.0.0: - resolution: {integrity: sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==} - engines: {node: '>=0.10.0'} - trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} @@ -4603,9 +4441,6 @@ packages: deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - vfile-location@4.1.0: resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} @@ -5365,10 +5200,6 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@iconify-json/logos@1.2.10': - dependencies: - '@iconify/types': 2.0.0 - '@iconify/types@2.0.0': {} '@iconify/utils@3.1.0': @@ -6590,8 +6421,6 @@ snapshots: call-bound: 1.0.4 is-array-buffer: 3.0.5 - array-find-index@1.0.2: {} - array-includes@3.1.9: dependencies: call-bind: 1.0.8 @@ -6740,13 +6569,6 @@ snapshots: camelcase-css@2.0.1: {} - camelcase-keys@2.1.0: - dependencies: - camelcase: 2.1.1 - map-obj: 1.0.1 - - camelcase@2.1.1: {} - caniuse-lite@1.0.30001769: {} caniuse-lite@1.0.30001810: {} @@ -6868,10 +6690,6 @@ snapshots: csstype@3.2.3: {} - currently-unhandled@0.4.1: - dependencies: - array-find-index: 1.0.2 - cytoscape-cose-bilkent@4.1.0(cytoscape@3.34.3): dependencies: cose-base: 1.0.3 @@ -7150,10 +6968,6 @@ snapshots: emojis-list@3.0.0: {} - error-ex@1.3.4: - dependencies: - is-arrayish: 0.2.1 - es-abstract@1.24.1: dependencies: array-buffer-byte-length: 1.0.2 @@ -7606,11 +7420,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - find-up@1.1.2: - dependencies: - path-exists: 2.1.0 - pinkie-promise: 2.0.1 - find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -7678,8 +7487,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stdin@4.0.1: {} - get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -7724,8 +7531,6 @@ snapshots: gopd@1.2.0: {} - graceful-fs@4.2.11: {} - gray-matter@4.0.3: dependencies: js-yaml: 3.15.2 @@ -7884,8 +7689,6 @@ snapshots: highlightjs-vue@1.0.0: {} - hosted-git-info@2.8.9: {} - html-void-elements@3.0.0: {} hyperdyperid@1.2.0: {} @@ -7907,10 +7710,6 @@ snapshots: imurmurhash@0.1.4: {} - indent-string@2.1.0: - dependencies: - repeating: 2.0.1 - inflection@3.0.2: {} inline-style-parser@0.2.7: {} @@ -7945,8 +7744,6 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 - is-arrayish@0.2.1: {} - is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -8003,8 +7800,6 @@ snapshots: dependencies: call-bound: 1.0.4 - is-finite@1.1.0: {} - is-fullwidth-code-point@3.0.0: {} is-generator-function@1.1.2: @@ -8066,8 +7861,6 @@ snapshots: dependencies: which-typed-array: 1.1.20 - is-utf8@0.2.1: {} - is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -8165,14 +7958,6 @@ snapshots: lines-and-columns@1.2.4: {} - load-json-file@1.1.0: - dependencies: - graceful-fs: 4.2.11 - parse-json: 2.2.0 - pify: 2.3.0 - pinkie-promise: 2.0.1 - strip-bom: 2.0.0 - loader-utils@2.0.4: dependencies: big.js: 5.2.2 @@ -8197,11 +7982,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - loud-rejection@1.6.0: - dependencies: - currently-unhandled: 0.4.1 - signal-exit: 3.0.7 - lower-case@2.0.2: dependencies: tslib: 2.8.1 @@ -8221,8 +8001,6 @@ snapshots: dependencies: react: 19.3.0 - map-obj@1.0.1: {} - markdown-extensions@2.0.0: {} markdown-table@3.0.4: {} @@ -8420,13 +8198,6 @@ snapshots: transitivePeerDependencies: - supports-color - mdx@0.3.1: - dependencies: - meow: 3.6.0 - mustache: 2.2.1 - object-assign: 4.0.1 - read-input: 0.3.1 - memfs@4.75.0: dependencies: '@jsonjoy.com/fs-core': 4.75.0(tslib@2.8.1) @@ -8446,17 +8217,6 @@ snapshots: memoize-one@4.0.3: {} - meow@3.6.0: - dependencies: - camelcase-keys: 2.1.0 - loud-rejection: 1.6.0 - minimist: 1.2.8 - normalize-package-data: 2.5.0 - object-assign: 4.0.1 - read-pkg-up: 1.0.1 - redent: 1.0.0 - trim-newlines: 1.0.0 - merge2@1.4.1: {} mermaid@11.17.2: @@ -8781,8 +8541,6 @@ snapshots: ms@2.1.3: {} - mustache@2.2.1: {} - mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -8847,17 +8605,8 @@ snapshots: node-releases@2.0.55: {} - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.11 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} - object-assign@4.0.1: {} - object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -8954,10 +8703,6 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - parse-json@2.2.0: - dependencies: - error-ex: 1.3.4 - parse-numeric-range@1.3.0: {} parse5@6.0.1: {} @@ -8969,10 +8714,6 @@ snapshots: path-data-parser@0.1.0: {} - path-exists@2.1.0: - dependencies: - pinkie-promise: 2.0.1 - path-exists@4.0.0: {} path-key@3.1.1: {} @@ -8984,12 +8725,6 @@ snapshots: lru-cache: 11.2.6 minipass: 7.1.2 - path-type@1.1.0: - dependencies: - graceful-fs: 4.2.11 - pify: 2.3.0 - pinkie-promise: 2.0.1 - pathe@2.0.3: {} picocolors@1.1.1: {} @@ -9000,12 +8735,6 @@ snapshots: pify@2.3.0: {} - pinkie-promise@2.0.1: - dependencies: - pinkie: 2.0.4 - - pinkie@2.0.4: {} - pirates@4.0.7: {} pkg-types@1.3.1: @@ -9203,19 +8932,6 @@ snapshots: dependencies: pify: 2.3.0 - read-input@0.3.1: {} - - read-pkg-up@1.0.1: - dependencies: - find-up: 1.1.2 - read-pkg: 1.1.0 - - read-pkg@1.1.0: - dependencies: - load-json-file: 1.1.0 - normalize-package-data: 2.5.0 - path-type: 1.1.0 - readdirp@3.6.0: dependencies: picomatch: 2.3.2 @@ -9249,11 +8965,6 @@ snapshots: unified: 11.0.5 vfile: 6.0.3 - redent@1.0.0: - dependencies: - indent-string: 2.1.0 - strip-indent: 1.0.1 - reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 @@ -9391,10 +9102,6 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 - repeating@2.0.1: - dependencies: - is-finite: 1.1.0 - require-directory@2.1.1: {} resolve-from@4.0.0: {} @@ -9462,8 +9169,6 @@ snapshots: extend-shallow: 2.0.1 kind-of: 6.0.3 - semver@5.7.2: {} - semver@6.3.1: {} semver@7.8.5: {} @@ -9564,8 +9269,6 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} simple-functional-loader@1.2.1: @@ -9591,20 +9294,6 @@ snapshots: space-separated-tokens@2.0.2: {} - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.22 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.22 - - spdx-license-ids@3.0.22: {} - sprintf-js@1.0.3: {} stable-hash@0.0.5: {} @@ -9683,16 +9372,8 @@ snapshots: strip-bom-string@1.0.0: {} - strip-bom@2.0.0: - dependencies: - is-utf8: 0.2.1 - strip-bom@3.0.0: {} - strip-indent@1.0.1: - dependencies: - get-stdin: 4.0.1 - strip-json-comments@3.1.1: {} style-to-js@1.1.21: @@ -9797,8 +9478,6 @@ snapshots: trim-lines@3.0.1: {} - trim-newlines@1.0.0: {} - trough@2.2.0: {} ts-api-utils@2.5.0(typescript@5.3.3): @@ -10012,11 +9691,6 @@ snapshots: uuid@9.0.1: {} - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - vfile-location@4.1.0: dependencies: '@types/unist': 2.0.11 From 46e77c5c029a1c31609e7850bdcdac0d0e7d9746 Mon Sep 17 00:00:00 2001 From: Marc LeBlanc <7050295+marcleblanc2@users.noreply.github.com> Date: Wed, 16 Sep 2026 21:24:33 -0600 Subject: [PATCH 10/11] Remove dependencies nothing imports and stale RSS .gitignore entries None of these packages are imported by src/, dev/, or any config file: @docsearch/react (only its CSS is vendored), @mdx-js/mdx, date-fns, fast-glob, feed, prism-react-renderer, react-highlight-words and its @types, react-syntax-highlighter, rehype-toc, simple-functional-loader, dotenv. public/changelog.rss and public/technical-changelog.rss are no longer generated here: the feed is served from sourcegraph.com (see src/data/constants.ts) and src/proxy.ts redirects to it. Amp-Thread-ID: https://ampcode.com/threads/T-01a0ad56-bd79-73ce-bc8e-a5405d0c11f2 Co-authored-by: Amp --- .gitignore | 5 - package.json | 12 -- pnpm-lock.yaml | 554 ------------------------------------------------- 3 files changed, 571 deletions(-) diff --git a/.gitignore b/.gitignore index 040e2782b..797a66fa9 100644 --- a/.gitignore +++ b/.gitignore @@ -43,16 +43,11 @@ next-env.d.ts # IDEs .idea -# We ignore the generated file as it should always be generated -public/changelog.rss - # env file .env # amp orb portal state .amp/portals/ -public/technical-changelog.rss - # script output logs/ diff --git a/package.json b/package.json index c2c122278..e9a166ec7 100644 --- a/package.json +++ b/package.json @@ -27,10 +27,8 @@ "dependencies": { "@algolia/autocomplete-core": "^1.13.0", "@algolia/client-search": "^4.22.1", - "@docsearch/react": "^3.5.2", "@headlessui/react": "^2.2.10", "@heroicons/react": "^2.1.1", - "@mdx-js/mdx": "^3.1.0", "@radix-ui/react-hover-card": "^1.1.5", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-slot": "^1.0.2", @@ -38,33 +36,24 @@ "@types/node": "24.13.4", "@types/react": "19.3.0", "@types/react-dom": "19.3.0", - "@types/react-highlight-words": "^0.16.7", "algoliasearch": "^4.22.1", "autoprefixer": "^10.4.16", "class-variance-authority": "^0.7.0", "clsx": "^1.2.1", "contentlayer2": "^0.5.8", - "date-fns": "^2.30.0", - "fast-glob": "^3.3.2", - "feed": "^4.2.2", "github-slugger": "^2.0.0", "lucide-react": "^0.372.0", "mermaid": "^11.16.1", "next": "^16.3.5", "next-contentlayer2": "^0.5.8", "next-themes": "^0.4.6", - "prism-react-renderer": "^2.3.1", "react": "19.3.0", "react-dom": "19.3.0", - "react-highlight-words": "^0.20.0", - "react-syntax-highlighter": "^15.6.1", "rehype-autolink-headings": "^7.1.0", "rehype-pretty-code": "^0.10.2", "rehype-slug": "^6.0.0", - "rehype-toc": "^3.0.2", "remark-gfm": "^4.0.1", "shiki": "^0.14.7", - "simple-functional-loader": "^1.2.1", "svg-pan-zoom": "^3.6.2", "tailwind-merge": "^2.3.0", "tailwindcss": "^3.4.0", @@ -73,7 +62,6 @@ "unist-util-visit": "^5.0.0" }, "devDependencies": { - "dotenv": "^16.4.7", "eslint": "^9.39.5", "eslint-config-next": "16.3.5", "glob": "^11.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ae20e18d..500fc0ebd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,18 +14,12 @@ importers: '@algolia/client-search': specifier: ^4.22.1 version: 4.25.3 - '@docsearch/react': - specifier: ^3.5.2 - version: 3.9.0(@algolia/client-search@4.25.3)(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(search-insights@2.17.3) '@headlessui/react': specifier: ^2.2.10 version: 2.2.10(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@heroicons/react': specifier: ^2.1.1 version: 2.2.0(react@19.3.0) - '@mdx-js/mdx': - specifier: ^3.1.0 - version: 3.1.1 '@radix-ui/react-hover-card': specifier: ^1.1.5 version: 1.1.15(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) @@ -47,9 +41,6 @@ importers: '@types/react-dom': specifier: 19.3.0 version: 19.3.0(@types/react@19.3.0) - '@types/react-highlight-words': - specifier: ^0.16.7 - version: 0.16.7 algoliasearch: specifier: ^4.22.1 version: 4.25.3 @@ -65,15 +56,6 @@ importers: contentlayer2: specifier: ^0.5.8 version: 0.5.8(esbuild@0.18.20) - date-fns: - specifier: ^2.30.0 - version: 2.30.0 - fast-glob: - specifier: ^3.3.2 - version: 3.3.3 - feed: - specifier: ^4.2.2 - version: 4.2.2 github-slugger: specifier: ^2.0.0 version: 2.0.0 @@ -92,21 +74,12 @@ importers: next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - prism-react-renderer: - specifier: ^2.3.1 - version: 2.4.1(react@19.3.0) react: specifier: 19.3.0 version: 19.3.0 react-dom: specifier: 19.3.0 version: 19.3.0(react@19.3.0) - react-highlight-words: - specifier: ^0.20.0 - version: 0.20.0(react@19.3.0) - react-syntax-highlighter: - specifier: ^15.6.1 - version: 15.6.6(react@19.3.0) rehype-autolink-headings: specifier: ^7.1.0 version: 7.1.0 @@ -116,18 +89,12 @@ importers: rehype-slug: specifier: ^6.0.0 version: 6.0.0 - rehype-toc: - specifier: ^3.0.2 - version: 3.0.2 remark-gfm: specifier: ^4.0.1 version: 4.0.1 shiki: specifier: ^0.14.7 version: 0.14.7 - simple-functional-loader: - specifier: ^1.2.1 - version: 1.2.1 svg-pan-zoom: specifier: ^3.6.2 version: 3.6.2 @@ -147,9 +114,6 @@ importers: specifier: ^5.0.0 version: 5.1.0 devDependencies: - dotenv: - specifier: ^16.4.7 - version: 16.6.1 eslint: specifier: ^9.39.5 version: 9.39.5(jiti@1.21.7) @@ -171,38 +135,14 @@ importers: packages: - '@algolia/abtesting@1.14.0': - resolution: {integrity: sha512-cZfj+1Z1dgrk3YPtNQNt0H9Rr67P8b4M79JjUKGS0d7/EbFbGxGgSu6zby5f22KXo3LT0LZa4O2c6VVbupJuDg==} - engines: {node: '>= 14.0.0'} - - '@algolia/autocomplete-core@1.17.9': - resolution: {integrity: sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==} - '@algolia/autocomplete-core@1.19.5': resolution: {integrity: sha512-/kAE3mMBage/9m0OGnKQteSa7/eIfvhiKx28OWj857+dJ6qYepEBuw5L8its2oTX8ZNM/6TA3fo49kMwgcwjlg==} - '@algolia/autocomplete-plugin-algolia-insights@1.17.9': - resolution: {integrity: sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==} - peerDependencies: - search-insights: '>= 1 < 3' - '@algolia/autocomplete-plugin-algolia-insights@1.19.5': resolution: {integrity: sha512-5zbetV9h2VxH+Mxx27I7BH2EIACVRUBE1FNykBK+2c2M+mhXYMY4npHbbGYj6QDEw3VVvH2UxAnghFpCtC6B/w==} peerDependencies: search-insights: '>= 1 < 3' - '@algolia/autocomplete-preset-algolia@1.17.9': - resolution: {integrity: sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/autocomplete-shared@1.17.9': - resolution: {integrity: sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - '@algolia/autocomplete-shared@1.19.5': resolution: {integrity: sha512-yblBczNXtm2cCVzX4UAY3KkjdefmZPn1gWbIi8Q7qfBw7FjcKq2EjEl/65x4kU9nUc/ZkB5SeUf/bkqLEnA5gA==} peerDependencies: @@ -218,91 +158,39 @@ packages: '@algolia/cache-in-memory@4.25.3': resolution: {integrity: sha512-6u/fVDr3ZIJIgtqdgUDB5kL9KcOdowmxf052bjfI1XhFTpxmIa49HcAEh1y2R0YqmmNDQHaPCT0QzwkINhWbug==} - '@algolia/client-abtesting@5.48.0': - resolution: {integrity: sha512-n17WSJ7vazmM6yDkWBAjY12J8ERkW9toOqNgQ1GEZu/Kc4dJDJod1iy+QP5T/UlR3WICgZDi/7a/VX5TY5LAPQ==} - engines: {node: '>= 14.0.0'} - '@algolia/client-account@4.25.3': resolution: {integrity: sha512-TkSVT5+davX4Dzt3gyEJ+SAfaVT5bHrZctAiup/AGPV7sNBigv4kuZv40OEbMMgu1uPJ4zw3tA39Oj/mOjd6gg==} '@algolia/client-analytics@4.25.3': resolution: {integrity: sha512-vHSU4zBaENbRjzwFYB3OQuDlKXwe+YDRgyGh1kKZhcMRDSsEBH/PGNWn+2ZmtbgrNS52TC+TJ8oUOg5wXIeISw==} - '@algolia/client-analytics@5.48.0': - resolution: {integrity: sha512-v5bMZMEqW9U2l40/tTAaRyn4AKrYLio7KcRuHmLaJtxuJAhvZiE7Y62XIsF070juz4MN3eyvfQmI+y5+OVbZuA==} - engines: {node: '>= 14.0.0'} - '@algolia/client-common@4.25.3': resolution: {integrity: sha512-ExRdFnJDe7t1/DgJUsqjzZKeI9gkLft4oVttlyTMru8TRNWA6eZ0wHRj4uQ9N3sxmzPiw3C53wigor705n1yQw==} - '@algolia/client-common@5.48.0': - resolution: {integrity: sha512-7H3DgRyi7UByScc0wz7EMrhgNl7fKPDjKX9OcWixLwCj7yrRXDSIzwunykuYUUO7V7HD4s319e15FlJ9CQIIFQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-insights@5.48.0': - resolution: {integrity: sha512-tXmkB6qrIGAXrtRYHQNpfW0ekru/qymV02bjT0w5QGaGw0W91yT+53WB6dTtRRsIrgS30Al6efBvyaEosjZ5uw==} - engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@4.25.3': resolution: {integrity: sha512-ycCkQ0nWoH+sf0Gh20kk4NfJ+iUBc59ailqNCFcVl/0th1dtHF0P61IGetTsSmxVPZedDvnHop2z1ujWpYzNmw==} - '@algolia/client-personalization@5.48.0': - resolution: {integrity: sha512-4tXEsrdtcBZbDF73u14Kb3otN+xUdTVGop1tBjict+Rc/FhsJQVIwJIcTrOJqmvhtBfc56Bu65FiVOnpAZCxcw==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-query-suggestions@5.48.0': - resolution: {integrity: sha512-unzSUwWFpsDrO8935RhMAlyK0Ttua/5XveVIwzfjs5w+GVBsHgIkbOe8VbBJccMU/z1LCwvu1AY3kffuSLAR5Q==} - engines: {node: '>= 14.0.0'} - '@algolia/client-search@4.25.3': resolution: {integrity: sha512-GFA99zL6cfNSDEDHfEJ0TmVYmXCJofQpForFhCShQLfRQgBYud9UBHOh4LB6ZSzmtVDIfP33joCA9hxQWPIbFw==} - '@algolia/client-search@5.48.0': - resolution: {integrity: sha512-RB9bKgYTVUiOcEb5bOcZ169jiiVW811dCsJoLT19DcbbFmU4QaK0ghSTssij35QBQ3SCOitXOUrHcGgNVwS7sQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/ingestion@1.48.0': - resolution: {integrity: sha512-rhoSoPu+TDzDpvpk3cY/pYgbeWXr23DxnAIH/AkN0dUC+GCnVIeNSQkLaJ+CL4NZ51cjLIjksrzb4KC5Xu+ktw==} - engines: {node: '>= 14.0.0'} - '@algolia/logger-common@4.25.3': resolution: {integrity: sha512-RrlmuHNTc9CIgykWh37QduDAkpX4745KQ75I+vhgT5ER3BBykaYByDTyWkyFSSlZjpDHXtOymu9epNbI5V6OWQ==} '@algolia/logger-console@4.25.3': resolution: {integrity: sha512-s8AtfF9W+6Pbxfwkmzywd8ThVJ04D4JZlNyBdCuWpC5b3jzx1JAXT9ZL8K2faUsO4rEdHpy9LXMURvF7cQAE0w==} - '@algolia/monitoring@1.48.0': - resolution: {integrity: sha512-aSe6jKvWt+8VdjOaq2ERtsXp9+qMXNJ3mTyTc1VMhNfgPl7ArOhRMRSQ8QBnY8ZL4yV5Xpezb7lAg8pdGrrulg==} - engines: {node: '>= 14.0.0'} - '@algolia/recommend@4.25.3': resolution: {integrity: sha512-/vpXzDFLmrkcM1UOvZae8i/z8wRs2uaKKlPaHqN24ySADWKyf2zxVsDmtcaGMYzBYqYsKR1XKFvwGA5HQxaZxQ==} - '@algolia/recommend@5.48.0': - resolution: {integrity: sha512-p9tfI1bimAaZrdiVExL/dDyGUZ8gyiSHsktP1ZWGzt5hXpM3nhv4tSjyHtXjEKtA0UvsaHKwSfFE8aAAm1eIQA==} - engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@4.25.3': resolution: {integrity: sha512-5ZXO55IDqXUehQKilVYU6OdUBT2XGI+JIki2UsxUkMykH4ksA9EU8YZJth1ZwEYTDC50bVSH32VCYsOFB0MUTA==} - '@algolia/requester-browser-xhr@5.48.0': - resolution: {integrity: sha512-XshyfpsQB7BLnHseMinp3fVHOGlTv6uEHOzNK/3XrEF9mjxoZAcdVfY1OCXObfwRWX5qXZOq8FnrndFd44iVsQ==} - engines: {node: '>= 14.0.0'} - '@algolia/requester-common@4.25.3': resolution: {integrity: sha512-n5dJA5jlIle5IQavlDWBXC46lw/VuwFbbknWJcPiJ6nJ6lRllpLOhV2ZJeUdCvRyg/6zG18h+9+Q/m2d/vLEIw==} - '@algolia/requester-fetch@5.48.0': - resolution: {integrity: sha512-Q4XNSVQU89bKNAPuvzSYqTH9AcbOOiIo6AeYMQTxgSJ2+uvT78CLPMG89RIIloYuAtSfE07s40OLV50++l1Bbw==} - engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@4.25.3': resolution: {integrity: sha512-7BXWAyVMK1Z3gT+2RPv0I48HfaIlho3nCQaB/tjziw+DdPigHRDq+xjtdzL8y+5O1g7LEdlPI9QHAgDbW/BLXw==} - '@algolia/requester-node-http@5.48.0': - resolution: {integrity: sha512-ZgxV2+5qt3NLeUYBTsi6PLyHcENQWC0iFppFZekHSEDA2wcLdTUjnaJzimTEULHIvJuLRCkUs4JABdhuJktEag==} - engines: {node: '>= 14.0.0'} - '@algolia/transporter@4.25.3': resolution: {integrity: sha512-2yji+TKjC1uOxhJ9pCdw7lQm6GSiQ+fMvNH4es6oz82DrBpkVHkeU49HmpyTqz8Ai9e+nW/UBz8T9+UyBul3dA==} @@ -421,26 +309,6 @@ packages: '@effect-ts/otel-node': optional: true - '@docsearch/css@3.9.0': - resolution: {integrity: sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==} - - '@docsearch/react@3.9.0': - resolution: {integrity: sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==} - peerDependencies: - '@types/react': '>= 16.8.0 < 20.0.0' - react: '>= 16.8.0 < 20.0.0' - react-dom: '>= 16.8.0 < 20.0.0' - search-insights: '>= 1 < 3' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true - '@effect-ts/core@0.60.5': resolution: {integrity: sha512-qi1WrtJA90XLMnj2hnUszW9Sx4dXP03ZJtCc5DiUBIOhF4Vw7plfb65/bdBySPoC9s7zy995TdUX1XBSxUkl5w==} @@ -901,10 +769,6 @@ packages: resolution: {integrity: sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==} engines: {node: '>=12'} - '@jsdevtools/rehype-toc@3.0.2': - resolution: {integrity: sha512-n5JEf16Wr4mdkRMZ8wMP/wN9/sHmTjRPbouXjJH371mZ2LEGDl72t8tEsMRNFerQN/QJtivOxqK1frdGa4QK5Q==} - engines: {node: '>=10'} - '@jsonjoy.com/base64@1.1.2': resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} engines: {node: '>=10.0'} @@ -1692,17 +1556,11 @@ packages: '@types/node@24.13.4': resolution: {integrity: sha512-YJ7EqCstVTzIr0fMr7qul/977en+pQHrfmuKIo6Zr9i75Be21dr3MovcfvGtyvi2HAUrRerWps5sMO9I7WaxDw==} - '@types/prismjs@1.26.6': - resolution: {integrity: sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==} - '@types/react-dom@19.3.0': resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==} peerDependencies: '@types/react': ^19.3.0 - '@types/react-highlight-words@0.16.7': - resolution: {integrity: sha512-+upXTIaRd3rGvh1aDQSs9z5X+sV3UM6Jrmjk03GN2GXl4v/+iOJKQj2LZHo6Vp2IoTvMdtxgME26feqo12xXLg==} - '@types/react@19.3.0': resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==} @@ -1895,10 +1753,6 @@ packages: algoliasearch@4.25.3: resolution: {integrity: sha512-kgeIixgDiB+FbH1cHDFUtTNkxdJadHryF8lSPIHHQkEeUrzZA1Hi3PLL+EgNubO0dch4ALNb5G4rw+FDCv3Vbw==} - algoliasearch@5.48.0: - resolution: {integrity: sha512-aD8EQC6KEman6/S79FtPdQmB7D4af/etcRL/KwiKFKgAE62iU8c5PeEQvpvIcBPurC3O/4Lj78nOl7ZcoazqSw==} - engines: {node: '>= 14.0.0'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2014,9 +1868,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -2079,21 +1930,12 @@ packages: character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} @@ -2134,9 +1976,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - comma-separated-tokens@1.0.8: - resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} - comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -2362,10 +2201,6 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - dayjs@1.11.23: resolution: {integrity: sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==} @@ -2430,10 +2265,6 @@ packages: dompurify@3.4.15: resolution: {integrity: sha512-EUBjM+B+lkDE41iE82DDSCfkoPGfXx8IxFxPMjNzm/Uk4xDet77rTN9wqlxlVg71kK7XGuUMv6wUxJUwwv+Xyw==} - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} - engines: {node: '>=12'} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2447,10 +2278,6 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - es-abstract@1.24.1: resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} engines: {node: '>= 0.4'} @@ -2689,9 +2516,6 @@ packages: fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - fault@1.0.4: - resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} - fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} @@ -2704,10 +2528,6 @@ packages: picomatch: optional: true - feed@4.2.2: - resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} - engines: {node: '>=0.4.0'} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -2877,9 +2697,6 @@ packages: hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - hast-util-parse-selector@2.2.5: - resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} - hast-util-parse-selector@3.1.1: resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} @@ -2901,9 +2718,6 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - hastscript@6.0.0: - resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} - hastscript@7.2.0: resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} @@ -2913,15 +2727,6 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - highlight-words-core@1.2.3: - resolution: {integrity: sha512-m1O9HW3/GNHxzSIXWw1wCNXXsgLlxrP0OI6+ycGUhiUHkikqW3OrwVHz+lxeNBe5yqLESdIcj8PowHQ2zLvUvQ==} - - highlight.js@10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - - highlightjs-vue@1.0.0: - resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} - html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -2971,15 +2776,9 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} - is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} @@ -3026,9 +2825,6 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} - is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -3056,9 +2852,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} @@ -3222,10 +3015,6 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} - locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -3252,9 +3041,6 @@ packages: lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - lowlight@1.20.0: - resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} - lru-cache@11.2.6: resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} engines: {node: 20 || >=22} @@ -3343,9 +3129,6 @@ packages: memfs@4.75.0: resolution: {integrity: sha512-ds3qQCghw0FsG9S+CSAR9F1n5nCwlA7Z5Mf8xgRec6iBAVPPwldmD5UxJhMstWhMhOVBwZ/FoBz09B46m3Le/g==} - memoize-one@4.0.3: - resolution: {integrity: sha512-QmpUu4KqDmX0plH4u+tf0riMc1KHE1+lw95cMrLlXQAFOx/xnBtwhZ52XJxd9X2O6kwKBqX32kmhbhlobD0cuw==} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -3613,9 +3396,6 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} - parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} @@ -3797,25 +3577,9 @@ packages: engines: {node: '>=14'} hasBin: true - prism-react-renderer@2.4.1: - resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} - peerDependencies: - react: '>=16.0.0' - - prismjs@1.27.0: - resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} - engines: {node: '>=6'} - - prismjs@1.30.0: - resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} - engines: {node: '>=6'} - prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - property-information@5.6.0: - resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} - property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} @@ -3844,11 +3608,6 @@ packages: peerDependencies: react: ^19.3.0 - react-highlight-words@0.20.0: - resolution: {integrity: sha512-asCxy+jCehDVhusNmCBoxDf2mm1AJ//D+EzDx1m5K7EqsMBIHdZ5G4LdwbSEXqZq1Ros0G0UySWmAtntSph7XA==} - peerDependencies: - react: ^0.14.0 || ^15.0.0 || ^16.0.0-0 || ^17.0.0-0 || ^18.0.0-0 - react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -3887,11 +3646,6 @@ packages: '@types/react': optional: true - react-syntax-highlighter@15.6.6: - resolution: {integrity: sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==} - peerDependencies: - react: '>= 0.14.0' - react@19.3.0: resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==} engines: {node: '>=0.10.0'} @@ -3921,9 +3675,6 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - refractor@3.6.0: - resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -3949,10 +3700,6 @@ packages: rehype-stringify@10.0.1: resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} - rehype-toc@3.0.2: - resolution: {integrity: sha512-DMt376+4i1KJGgHJL7Ezd65qKkJ7Eqp6JSB47BJ90ReBrohI9ufrornArM6f4oJjP2E2DVZZHufWucv/9t7GUQ==} - engines: {node: '>=10'} - remark-frontmatter@5.0.0: resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} @@ -4025,10 +3772,6 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sax@1.4.4: - resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} - engines: {node: '>=11.0.0'} - scheduler@0.28.0: resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} @@ -4100,9 +3843,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-functional-loader@1.2.1: - resolution: {integrity: sha512-GPDrxrQkE7ijm35QlfPFVp5hBHR6ZcaUq42TEDgf1U5iTL3IDLFvKAbHE/ODqpdfJJ7Xn4cr/slBn12jjNPkaQ==} - sort-keys@5.1.0: resolution: {integrity: sha512-aSbHV0DaBcr7u0PVHXzM6NbZNAtrr9sF6+Qfs9UUVG7Ll3jQ6hHi8F/xqIIcn2rvIVbr0v/2zyjSdwSV47AgLQ==} engines: {node: '>=12'} @@ -4122,9 +3862,6 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - space-separated-tokens@1.1.5: - resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} - space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -4494,14 +4231,6 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - xml-js@1.6.11: - resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} - hasBin: true - - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -4540,22 +4269,6 @@ packages: snapshots: - '@algolia/abtesting@1.14.0': - dependencies: - '@algolia/client-common': 5.48.0 - '@algolia/requester-browser-xhr': 5.48.0 - '@algolia/requester-fetch': 5.48.0 - '@algolia/requester-node-http': 5.48.0 - - '@algolia/autocomplete-core@1.17.9(@algolia/client-search@4.25.3)(algoliasearch@5.48.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@4.25.3)(algoliasearch@5.48.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@4.25.3)(algoliasearch@5.48.0) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - '@algolia/autocomplete-core@1.19.5(@algolia/client-search@4.25.3)(algoliasearch@4.25.3)(search-insights@2.17.3)': dependencies: '@algolia/autocomplete-plugin-algolia-insights': 1.19.5(@algolia/client-search@4.25.3)(algoliasearch@4.25.3)(search-insights@2.17.3) @@ -4565,14 +4278,6 @@ snapshots: - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@4.25.3)(algoliasearch@5.48.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@4.25.3)(algoliasearch@5.48.0) - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - '@algolia/autocomplete-plugin-algolia-insights@1.19.5(@algolia/client-search@4.25.3)(algoliasearch@4.25.3)(search-insights@2.17.3)': dependencies: '@algolia/autocomplete-shared': 1.19.5(@algolia/client-search@4.25.3)(algoliasearch@4.25.3) @@ -4581,17 +4286,6 @@ snapshots: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@4.25.3)(algoliasearch@5.48.0)': - dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@4.25.3)(algoliasearch@5.48.0) - '@algolia/client-search': 4.25.3 - algoliasearch: 5.48.0 - - '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@4.25.3)(algoliasearch@5.48.0)': - dependencies: - '@algolia/client-search': 4.25.3 - algoliasearch: 5.48.0 - '@algolia/autocomplete-shared@1.19.5(@algolia/client-search@4.25.3)(algoliasearch@4.25.3)': dependencies: '@algolia/client-search': 4.25.3 @@ -4607,13 +4301,6 @@ snapshots: dependencies: '@algolia/cache-common': 4.25.3 - '@algolia/client-abtesting@5.48.0': - dependencies: - '@algolia/client-common': 5.48.0 - '@algolia/requester-browser-xhr': 5.48.0 - '@algolia/requester-fetch': 5.48.0 - '@algolia/requester-node-http': 5.48.0 - '@algolia/client-account@4.25.3': dependencies: '@algolia/client-common': 4.25.3 @@ -4627,80 +4314,29 @@ snapshots: '@algolia/requester-common': 4.25.3 '@algolia/transporter': 4.25.3 - '@algolia/client-analytics@5.48.0': - dependencies: - '@algolia/client-common': 5.48.0 - '@algolia/requester-browser-xhr': 5.48.0 - '@algolia/requester-fetch': 5.48.0 - '@algolia/requester-node-http': 5.48.0 - '@algolia/client-common@4.25.3': dependencies: '@algolia/requester-common': 4.25.3 '@algolia/transporter': 4.25.3 - '@algolia/client-common@5.48.0': {} - - '@algolia/client-insights@5.48.0': - dependencies: - '@algolia/client-common': 5.48.0 - '@algolia/requester-browser-xhr': 5.48.0 - '@algolia/requester-fetch': 5.48.0 - '@algolia/requester-node-http': 5.48.0 - '@algolia/client-personalization@4.25.3': dependencies: '@algolia/client-common': 4.25.3 '@algolia/requester-common': 4.25.3 '@algolia/transporter': 4.25.3 - '@algolia/client-personalization@5.48.0': - dependencies: - '@algolia/client-common': 5.48.0 - '@algolia/requester-browser-xhr': 5.48.0 - '@algolia/requester-fetch': 5.48.0 - '@algolia/requester-node-http': 5.48.0 - - '@algolia/client-query-suggestions@5.48.0': - dependencies: - '@algolia/client-common': 5.48.0 - '@algolia/requester-browser-xhr': 5.48.0 - '@algolia/requester-fetch': 5.48.0 - '@algolia/requester-node-http': 5.48.0 - '@algolia/client-search@4.25.3': dependencies: '@algolia/client-common': 4.25.3 '@algolia/requester-common': 4.25.3 '@algolia/transporter': 4.25.3 - '@algolia/client-search@5.48.0': - dependencies: - '@algolia/client-common': 5.48.0 - '@algolia/requester-browser-xhr': 5.48.0 - '@algolia/requester-fetch': 5.48.0 - '@algolia/requester-node-http': 5.48.0 - - '@algolia/ingestion@1.48.0': - dependencies: - '@algolia/client-common': 5.48.0 - '@algolia/requester-browser-xhr': 5.48.0 - '@algolia/requester-fetch': 5.48.0 - '@algolia/requester-node-http': 5.48.0 - '@algolia/logger-common@4.25.3': {} '@algolia/logger-console@4.25.3': dependencies: '@algolia/logger-common': 4.25.3 - '@algolia/monitoring@1.48.0': - dependencies: - '@algolia/client-common': 5.48.0 - '@algolia/requester-browser-xhr': 5.48.0 - '@algolia/requester-fetch': 5.48.0 - '@algolia/requester-node-http': 5.48.0 - '@algolia/recommend@4.25.3': dependencies: '@algolia/cache-browser-local-storage': 4.25.3 @@ -4715,35 +4351,16 @@ snapshots: '@algolia/requester-node-http': 4.25.3 '@algolia/transporter': 4.25.3 - '@algolia/recommend@5.48.0': - dependencies: - '@algolia/client-common': 5.48.0 - '@algolia/requester-browser-xhr': 5.48.0 - '@algolia/requester-fetch': 5.48.0 - '@algolia/requester-node-http': 5.48.0 - '@algolia/requester-browser-xhr@4.25.3': dependencies: '@algolia/requester-common': 4.25.3 - '@algolia/requester-browser-xhr@5.48.0': - dependencies: - '@algolia/client-common': 5.48.0 - '@algolia/requester-common@4.25.3': {} - '@algolia/requester-fetch@5.48.0': - dependencies: - '@algolia/client-common': 5.48.0 - '@algolia/requester-node-http@4.25.3': dependencies: '@algolia/requester-common': 4.25.3 - '@algolia/requester-node-http@5.48.0': - dependencies: - '@algolia/client-common': 5.48.0 - '@algolia/transporter@4.25.3': dependencies: '@algolia/cache-common': 4.25.3 @@ -4955,22 +4572,6 @@ snapshots: ts-pattern: 5.9.0 type-fest: 4.41.0 - '@docsearch/css@3.9.0': {} - - '@docsearch/react@3.9.0(@algolia/client-search@4.25.3)(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@4.25.3)(algoliasearch@5.48.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@4.25.3)(algoliasearch@5.48.0) - '@docsearch/css': 3.9.0 - algoliasearch: 5.48.0 - optionalDependencies: - '@types/react': 19.3.0 - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' - '@effect-ts/core@0.60.5': dependencies: '@effect-ts/system': 0.57.5 @@ -5354,8 +4955,6 @@ snapshots: jsbi: 4.3.2 tslib: 2.8.1 - '@jsdevtools/rehype-toc@3.0.2': {} - '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -6159,16 +5758,10 @@ snapshots: dependencies: undici-types: 7.18.2 - '@types/prismjs@1.26.6': {} - '@types/react-dom@19.3.0(@types/react@19.3.0)': dependencies: '@types/react': 19.3.0 - '@types/react-highlight-words@0.16.7': - dependencies: - '@types/react': 19.3.0 - '@types/react@19.3.0': dependencies: csstype: 3.2.3 @@ -6370,23 +5963,6 @@ snapshots: '@algolia/requester-node-http': 4.25.3 '@algolia/transporter': 4.25.3 - algoliasearch@5.48.0: - dependencies: - '@algolia/abtesting': 1.14.0 - '@algolia/client-abtesting': 5.48.0 - '@algolia/client-analytics': 5.48.0 - '@algolia/client-common': 5.48.0 - '@algolia/client-insights': 5.48.0 - '@algolia/client-personalization': 5.48.0 - '@algolia/client-query-suggestions': 5.48.0 - '@algolia/client-search': 5.48.0 - '@algolia/ingestion': 1.48.0 - '@algolia/monitoring': 1.48.0 - '@algolia/recommend': 5.48.0 - '@algolia/requester-browser-xhr': 5.48.0 - '@algolia/requester-fetch': 5.48.0 - '@algolia/requester-node-http': 5.48.0 - ansi-regex@5.0.1: {} ansi-sequence-parser@1.1.3: {} @@ -6516,8 +6092,6 @@ snapshots: baseline-browser-mapping@2.11.21: {} - big.js@5.2.2: {} - binary-extensions@2.3.0: {} brace-expansion@1.1.18: @@ -6582,16 +6156,10 @@ snapshots: character-entities-html4@2.1.0: {} - character-entities-legacy@1.1.4: {} - character-entities-legacy@3.0.0: {} - character-entities@1.2.4: {} - character-entities@2.0.2: {} - character-reference-invalid@1.1.4: {} - character-reference-invalid@2.0.1: {} chokidar@3.6.0: @@ -6634,8 +6202,6 @@ snapshots: color-name@1.1.4: {} - comma-separated-tokens@1.0.8: {} - comma-separated-tokens@2.0.3: {} commander@4.1.1: {} @@ -6894,10 +6460,6 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - date-fns@2.30.0: - dependencies: - '@babel/runtime': 7.28.6 - dayjs@1.11.23: {} debug@3.2.7: @@ -6952,8 +6514,6 @@ snapshots: optionalDependencies: '@types/trusted-types': 2.0.7 - dotenv@16.6.1: {} - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -6966,8 +6526,6 @@ snapshots: emoji-regex@9.2.2: {} - emojis-list@3.0.0: {} - es-abstract@1.24.1: dependencies: array-buffer-byte-length: 1.0.2 @@ -7396,10 +6954,6 @@ snapshots: dependencies: reusify: 1.1.0 - fault@1.0.4: - dependencies: - format: 0.2.2 - fault@2.0.1: dependencies: format: 0.2.2 @@ -7408,10 +6962,6 @@ snapshots: optionalDependencies: picomatch: 4.0.7 - feed@4.2.2: - dependencies: - xml-js: 1.6.11 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -7588,8 +7138,6 @@ snapshots: dependencies: '@types/hast': 3.0.4 - hast-util-parse-selector@2.2.5: {} - hast-util-parse-selector@3.1.1: dependencies: '@types/hast': 2.3.10 @@ -7661,14 +7209,6 @@ snapshots: dependencies: '@types/hast': 3.0.4 - hastscript@6.0.0: - dependencies: - '@types/hast': 2.3.10 - comma-separated-tokens: 1.0.8 - hast-util-parse-selector: 2.2.5 - property-information: 5.6.0 - space-separated-tokens: 1.1.5 - hastscript@7.2.0: dependencies: '@types/hast': 2.3.10 @@ -7683,12 +7223,6 @@ snapshots: dependencies: hermes-estree: 0.25.1 - highlight-words-core@1.2.3: {} - - highlight.js@10.7.3: {} - - highlightjs-vue@1.0.0: {} - html-void-elements@3.0.0: {} hyperdyperid@1.2.0: {} @@ -7724,15 +7258,8 @@ snapshots: internmap@2.0.3: {} - is-alphabetical@1.0.4: {} - is-alphabetical@2.0.1: {} - is-alphanumerical@1.0.4: - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - is-alphanumerical@2.0.1: dependencies: is-alphabetical: 2.0.1 @@ -7788,8 +7315,6 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-decimal@1.0.4: {} - is-decimal@2.0.1: {} is-extendable@0.1.1: {} @@ -7814,8 +7339,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-hexadecimal@1.0.4: {} - is-hexadecimal@2.0.1: {} is-map@2.0.3: {} @@ -7958,12 +7481,6 @@ snapshots: lines-and-columns@1.2.4: {} - loader-utils@2.0.4: - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 - locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -7986,11 +7503,6 @@ snapshots: dependencies: tslib: 2.8.1 - lowlight@1.20.0: - dependencies: - fault: 1.0.4 - highlight.js: 10.7.3 - lru-cache@11.2.6: {} lru-cache@5.1.1: @@ -8215,8 +7727,6 @@ snapshots: tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 - memoize-one@4.0.3: {} - merge2@1.4.1: {} mermaid@11.17.2: @@ -8684,15 +8194,6 @@ snapshots: dependencies: callsites: 3.1.0 - parse-entities@2.0.0: - dependencies: - character-entities: 1.2.4 - character-entities-legacy: 1.1.4 - character-reference-invalid: 1.1.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - is-hexadecimal: 1.0.4 - parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 @@ -8809,26 +8310,12 @@ snapshots: prettier@3.8.1: {} - prism-react-renderer@2.4.1(react@19.3.0): - dependencies: - '@types/prismjs': 1.26.6 - clsx: 2.1.1 - react: 19.3.0 - - prismjs@1.27.0: {} - - prismjs@1.30.0: {} - prop-types@15.8.1: dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 - property-information@5.6.0: - dependencies: - xtend: 4.0.2 - property-information@6.5.0: {} property-information@7.1.0: {} @@ -8870,13 +8357,6 @@ snapshots: react: 19.3.0 scheduler: 0.28.0 - react-highlight-words@0.20.0(react@19.3.0): - dependencies: - highlight-words-core: 1.2.3 - memoize-one: 4.0.3 - prop-types: 15.8.1 - react: 19.3.0 - react-is@16.13.1: {} react-remove-scroll-bar@2.3.8(@types/react@19.3.0)(react@19.3.0): @@ -8916,16 +8396,6 @@ snapshots: optionalDependencies: '@types/react': 19.3.0 - react-syntax-highlighter@15.6.6(react@19.3.0): - dependencies: - '@babel/runtime': 7.28.6 - highlight.js: 10.7.3 - highlightjs-vue: 1.0.0 - lowlight: 1.20.0 - prismjs: 1.30.0 - react: 19.3.0 - refractor: 3.6.0 - react@19.3.0: {} read-cache@1.0.0: @@ -8976,12 +8446,6 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - refractor@3.6.0: - dependencies: - hastscript: 6.0.0 - parse-entities: 2.0.0 - prismjs: 1.27.0 - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -9039,10 +8503,6 @@ snapshots: hast-util-to-html: 9.0.5 unified: 11.0.5 - rehype-toc@3.0.2: - dependencies: - '@jsdevtools/rehype-toc': 3.0.2 - remark-frontmatter@5.0.0: dependencies: '@types/mdast': 4.0.4 @@ -9158,8 +8618,6 @@ snapshots: safer-buffer@2.1.2: {} - sax@1.4.4: {} - scheduler@0.28.0: {} search-insights@2.17.3: {} @@ -9271,10 +8729,6 @@ snapshots: signal-exit@4.1.0: {} - simple-functional-loader@1.2.1: - dependencies: - loader-utils: 2.0.4 - sort-keys@5.1.0: dependencies: is-plain-obj: 4.1.0 @@ -9290,8 +8744,6 @@ snapshots: source-map@0.7.6: {} - space-separated-tokens@1.1.5: {} - space-separated-tokens@2.0.2: {} sprintf-js@1.0.3: {} @@ -9777,12 +9229,6 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - xml-js@1.6.11: - dependencies: - sax: 1.4.4 - - xtend@4.0.2: {} - y18n@5.0.8: {} yallist@3.1.1: {} From 30bd7be592fe2cedb3d7dc11559156ad3b08a146 Mon Sep 17 00:00:00 2001 From: Marc LeBlanc <7050295+marcleblanc2@users.noreply.github.com> Date: Wed, 16 Sep 2026 21:22:50 -0600 Subject: [PATCH 11/11] Remove components nothing imports and the unused draft filter PreCode.tsx was empty; ResourceEstimator.tsx was an older copy of resource-estimator/ResourceEstimator.tsx, which MdxComponents imports; DemoLayout, TopBanner, Globe and BugIcon have no importers. allCoreContent filtered on a `draft` frontmatter field that contentlayer.config.ts does not declare and no page sets, so the production and development branches did the same thing. Amp-Thread-ID: https://ampcode.com/threads/T-01a0ad56-bd79-73ce-bc8e-a5405d0c11f2 Co-authored-by: Amp --- src/components/DemoLayout.tsx | 74 ------------------- src/components/PreCode.tsx | 0 src/components/ResourceEstimator.tsx | 106 --------------------------- src/components/TopBanner.tsx | 89 ---------------------- src/components/icons/BugIcon.tsx | 28 ------- src/components/icons/Globe.tsx | 20 ----- 6 files changed, 317 deletions(-) delete mode 100644 src/components/DemoLayout.tsx delete mode 100644 src/components/PreCode.tsx delete mode 100644 src/components/ResourceEstimator.tsx delete mode 100644 src/components/TopBanner.tsx delete mode 100644 src/components/icons/BugIcon.tsx delete mode 100644 src/components/icons/Globe.tsx diff --git a/src/components/DemoLayout.tsx b/src/components/DemoLayout.tsx deleted file mode 100644 index 54ff56523..000000000 --- a/src/components/DemoLayout.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import {useState} from 'react'; - -const tabs = [ - 'Overview', - 'Assistants', - 'Text-to-Image', - 'Text-to-Speech', - 'Plugins', - 'Multi-Models' -]; - -const tabVideos = { - Overview: 'https://www.youtube.com/embed/ZK-rNEhJIDs?autoplay=1&mute=1', - Assistants: 'https://www.youtube.com/embed/ZK-rNEhJIDs?autoplay=1&mute=1', - 'Text-to-Image': - 'https://www.youtube.com/embed/ZK-rNEhJIDs?autoplay=1&mute=1', - 'Text-to-Speech': - 'https://www.youtube.com/embed/ZK-rNEhJIDs?autoplay=1&mute=1', - Plugins: 'https://www.youtube.com/embed/ZK-rNEhJIDs?autoplay=1&mute=1', - 'Multi-Models': - 'https://www.youtube.com/embed/ZK-rNEhJIDs?autoplay=1&mute=1' -}; - -type TabKeys = keyof typeof tabVideos; - -export function DemoLayout() { - const [activeTab, setActiveTab] = useState('Overview'); - - return ( -
      - {/* tabs */} -
      - {tabs.map((tab, index) => ( - - ))} -
      -
      -
      -
      -