diff --git a/components/CodeBlock.tsx b/components/CodeBlock.tsx index 40264679..3662bba8 100644 --- a/components/CodeBlock.tsx +++ b/components/CodeBlock.tsx @@ -48,7 +48,7 @@ const LivePreview = React.forwardRef( forwardedRef, ) { return ( - + feature != null && ( - - - - - - {feature} - + +
  • + + + + + {feature} + +
  • ), )} @@ -157,6 +165,20 @@ export function Highlights({ features }: { features: React.ReactNode[] }) {
    )} + + + + + View as Markdown + + + diff --git a/components/PropsTable.tsx b/components/PropsTable.tsx index 05a08d27..5f46e6cf 100644 --- a/components/PropsTable.tsx +++ b/components/PropsTable.tsx @@ -73,9 +73,14 @@ export function PropsTable({ {description && ( - + - + @@ -107,7 +112,12 @@ export function PropsTable({ {Boolean(typeSimple) && Boolean(type) && ( - + @@ -155,11 +165,13 @@ export function PropsTable({ {defaultValue} ) : ( - - - + <> + + + + )} diff --git a/middleware.ts b/middleware.ts new file mode 100644 index 00000000..905d9765 --- /dev/null +++ b/middleware.ts @@ -0,0 +1,47 @@ +import { NextResponse } from "next/server"; +import type { NextRequest } from "next/server"; + +export function middleware(request: NextRequest) { + const { pathname } = request.nextUrl; + + // Check if the request accepts markdown + const acceptHeader = request.headers.get("accept") || ""; + const wantsMarkdown = + acceptHeader.includes("text/markdown") || + acceptHeader.includes("text/x-markdown"); + + // If the client accepts markdown and this is a docs page, rewrite to markdown API + if (wantsMarkdown && isDocsPage(pathname)) { + const url = request.nextUrl.clone(); + url.pathname = `/api/markdown${pathname}`; + return NextResponse.rewrite(url); + } + + return NextResponse.next(); +} + +/** + * Check if a path is a documentation page that can be served as markdown + */ +function isDocsPage(pathname: string): boolean { + // Match documentation paths + const docPatterns = [ + /^\/primitives\/docs\//, + /^\/themes\/docs\//, + /^\/colors\/docs\//, + /^\/blog\//, + ]; + + return docPatterns.some((pattern) => pattern.test(pathname)); +} + +// Configure which paths the middleware runs on +export const config = { + matcher: [ + // Match all docs paths + "/primitives/docs/:path*", + "/themes/docs/:path*", + "/colors/docs/:path*", + "/blog/:path*", + ], +}; diff --git a/next-env.d.ts b/next-env.d.ts index 725dd6f2..a4a7b3f5 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,5 @@ /// /// -/// // NOTE: This file should not be edited -// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. +// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information. diff --git a/next.config.js b/next.config.js index 43c2db29..5e821a94 100644 --- a/next.config.js +++ b/next.config.js @@ -13,6 +13,15 @@ module.exports = { }, // Next.js config + async rewrites() { + return [ + { + source: "/:path*.md", + destination: "/api/markdown/:path*", + }, + ]; + }, + async redirects() { return [ { diff --git a/package.json b/package.json index 230af4f4..61b3e672 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "eslint-config-next": "^14.2.6", "glob": "^10", "gray-matter": "^4.0.2", + "hast-util-select": "^6.0.4", "hast-util-to-html": "^9.0.1", "hast-util-to-string": "^3.0.0", "lodash.debounce": "^4.0.8", @@ -52,7 +53,10 @@ "refractor": "^3.3.1", "rehype": "^11.0.0", "rehype-parse": "^9.0.0", + "rehype-remark": "^10.0.1", + "remark-gfm": "^4.0.1", "remark-slug": "^6.0.0", + "remark-stringify": "^11.0.0", "scroll-into-view-if-needed": "^3.1.0", "smoothscroll-polyfill": "^0.4.4", "tinycolor2": "^1.6.0", @@ -62,6 +66,7 @@ "usehooks-ts": "^3.0.1" }, "devDependencies": { + "@types/hast": "3.0.4", "@types/lodash.debounce": "^4.0.6", "@types/node": "20.12.10", "@types/react": "^18.3.4", @@ -72,6 +77,7 @@ "@types/unist": "^3.0.3", "autoprefixer": "^10.4.19", "husky": "^9.1.6", + "oxfmt": "0.28.0", "prettier": "^3.3.3", "pretty-quick": "^4.0.0", "sucrase": "3.29.0", diff --git a/pages/api/markdown/[...path].ts b/pages/api/markdown/[...path].ts new file mode 100644 index 00000000..be6cd8db --- /dev/null +++ b/pages/api/markdown/[...path].ts @@ -0,0 +1,223 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { format } from "oxfmt"; +import { unified } from "unified"; +import rehypeParse from "rehype-parse"; +import rehypeRemark from "rehype-remark"; +import remarkStringify from "remark-stringify"; +import remarkGfm from "remark-gfm"; +import { select, selectAll } from "hast-util-select"; +import type { Root, Element } from "hast"; + +export default async function handler( + req: NextApiRequest, + res: NextApiResponse, +) { + if (req.method !== "GET") { + return res.status(405).json({ error: "Method not allowed" }); + } + + const pathSegments = req.query.path as string[]; + if (!pathSegments || pathSegments.length === 0) { + return res.status(400).json({ error: "Invalid path" }); + } + + const pagePath = "/" + pathSegments.join("/"); + + try { + // Determine the base URL for fetching + // In development, use the request host; in production, use the configured URL + const protocol = req.headers["x-forwarded-proto"] || "http"; + const host = req.headers.host; + const baseUrl = `${protocol}://${host}`; + + // Fetch the rendered HTML page + const htmlResponse = await fetch(`${baseUrl}${pagePath}`, { + headers: { + // Pass along cookies for any auth + cookie: req.headers.cookie || "", + }, + }); + + if (!htmlResponse.ok) { + return res.status(404).json({ error: "Page not found" }); + } + + const html = await htmlResponse.text(); + const markdown = await convertHtmlToMarkdown(html); + const { code: formattedMarkdown } = await format("file.md", markdown); + + res.setHeader("Content-Type", "text/markdown; charset=utf-8"); + res.setHeader("X-Content-Type-Options", "nosniff"); + // Aggressive caching: 7 days browser, 30 days CDN, serve stale for 90 days while revalidating + res.setHeader( + "Cache-Control", + "public, max-age=604800, s-maxage=2592000, stale-while-revalidate=7776000", + ); + + return res.status(200).send(formattedMarkdown); + } catch (error) { + console.error("Error converting to markdown:", error); + return res + .status(500) + .json({ error: "Failed to convert page to markdown" }); + } +} + +async function convertHtmlToMarkdown(html: string): Promise { + const result = await unified() + .use(rehypeParse) + .use(extractMainContent) + .use(cleanupHtml) + .use(rehypeRemark) + .use(remarkGfm) + .use(remarkStringify, { + bullet: "-", + emphasis: "_", + strong: "*", + fence: "`", + fences: true, + listItemIndent: "one", + }) + .process(html); + + return String(result); +} + +/** + * Extract the main content area from the page + */ +function extractMainContent() { + return (tree: Root) => { + // Try to find the main content area marked with data-algolia-page-scope + const mainContent = select("[data-algolia-page-scope]", tree) as + | Element + | undefined; + + if (mainContent) { + // Return a new root with just the main content + return { + type: "root" as const, + children: [mainContent], + }; + } + + // Fallback: return the original tree + return tree; + }; +} + +/** + * Clean up the HTML before conversion + * - Remove elements we don't want in the markdown + * - Fix code block language annotations + */ +function cleanupHtml() { + return (tree: Root) => { + // Remove elements marked as excluded from indexing + const excluded = selectAll("[data-algolia-exclude]", tree); + for (const node of excluded) { + removeNode(tree, node); + } + + // Remove hidden category labels (e.g., "Components", "Guides") + const hiddenLabels = selectAll("[data-algolia-lvl0]", tree); + for (const node of hiddenLabels) { + removeNode(tree, node); + } + + // Remove elements marked for markdown exclusion + const mdExcluded = selectAll("[data-md-exclude]", tree); + for (const node of mdExcluded) { + removeNode(tree, node); + } + + // Remove navigation and footer elements + const navFooterSelectors = ["nav", "footer"]; + for (const selector of navFooterSelectors) { + const elements = selectAll(selector, tree); + for (const node of elements) { + removeNode(tree, node); + } + } + + // Remove buttons that are NOT inside tables (preserve table buttons for accessibility info) + const buttons = selectAll("button", tree) as Element[]; + for (const button of buttons) { + // Check if this button is inside a table + if (!isInsideTable(tree, button)) { + removeNode(tree, button); + } + } + + // Process code blocks - extract language from class + const codeBlocks = selectAll("pre code", tree) as Element[]; + for (const code of codeBlocks) { + if (code.properties?.className) { + const classes = Array.isArray(code.properties.className) + ? code.properties.className + : [code.properties.className]; + + for (const cls of classes) { + if (typeof cls === "string" && cls.startsWith("language-")) { + const lang = cls.replace("language-", ""); + code.properties.dataLanguage = lang; + } + } + } + } + + return tree; + }; +} + +/** + * Check if an element is inside a table + */ +function isInsideTable(tree: Root | Element, target: Element): boolean { + const tables = selectAll("table", tree) as Element[]; + for (const table of tables) { + if (containsNode(table, target)) { + return true; + } + } + return false; +} + +/** + * Check if a node contains another node + */ +function containsNode(parent: Element, target: Element): boolean { + if (parent === target) return true; + if (parent.children) { + for (const child of parent.children) { + if (child.type === "element" && containsNode(child as Element, target)) { + return true; + } + } + } + return false; +} + +/** + * Remove a node from the tree + */ +function removeNode(tree: Root | Element, nodeToRemove: Element): void { + const visit = (node: Root | Element): boolean => { + if ("children" in node && Array.isArray(node.children)) { + const index = node.children.indexOf(nodeToRemove as any); + if (index !== -1) { + node.children.splice(index, 1); + return true; + } + for (const child of node.children) { + if (child.type === "element") { + if (visit(child as Element)) { + return true; + } + } + } + } + return false; + }; + visit(tree); +} diff --git a/pages/primitives/docs/components/index.tsx b/pages/primitives/docs/components/index.tsx new file mode 100644 index 00000000..7d45cde2 --- /dev/null +++ b/pages/primitives/docs/components/index.tsx @@ -0,0 +1,77 @@ +import * as React from "react"; +import NextLink from "next/link"; +import { Heading, Text, Box, Flex, Link } from "@radix-ui/themes"; +import { TitleAndMetaTags } from "@components/TitleAndMetaTags"; +import { getAllFrontmatter } from "@utils/mdx"; +import type { Frontmatter } from "types/frontmatter"; + +type ComponentItem = { + slug: string; + title: string; + description: string; +}; + +type Props = { + components: ComponentItem[]; +}; + +export default function ComponentsIndex({ components }: Props) { + return ( + <> +
    + Components +
    + + + + + Components + + + + + Unstyled, accessible UI primitives for building high-quality design + systems and web apps. + + + + +
      + {components.map((component) => ( + +
    • + + + {component.title} + + + + {component.description} + +
    • +
      + ))} +
    +
    + + ); +} + +export async function getStaticProps() { + const frontmatters = getAllFrontmatter("primitives/docs/components"); + + const components = frontmatters + .filter((fm) => !fm.slug.endsWith("/index")) + .map((fm) => ({ + slug: fm.slug, + title: fm.metaTitle, + description: fm.metaDescription, + })) + .sort((a, b) => a.title.localeCompare(b.title)); + + return { props: { components } }; +} diff --git a/pages/themes/docs/components/[slug].tsx b/pages/themes/docs/components/[slug].tsx index 88e55b8a..0fdb9d37 100644 --- a/pages/themes/docs/components/[slug].tsx +++ b/pages/themes/docs/components/[slug].tsx @@ -1,13 +1,14 @@ import * as React from "react"; import { getMDXComponent } from "mdx-bundler/client"; import NextLink from "next/link"; +import { useRouter } from "next/router"; import { Box, Flex, Link, Text, Heading } from "@radix-ui/themes"; import { TitleAndMetaTags } from "@components/TitleAndMetaTags"; import { MDXProvider } from "@components/MDXComponents"; import { ThemesMDXComponents } from "@components/ThemesMDXComponents"; import { getAllFrontmatter, getMdxBySlug } from "@utils/mdx"; import { QuickNav } from "@components/QuickNav"; -import { ArrowTopRightIcon } from "@radix-ui/react-icons"; +import { ArrowTopRightIcon, FileTextIcon } from "@radix-ui/react-icons"; import type { Frontmatter } from "types/frontmatter"; import { GetStaticPropsContext } from "next"; @@ -20,6 +21,7 @@ type Doc = { export default function GuidesDoc({ frontmatter, code }: Doc) { const Component = React.useMemo(() => getMDXComponent(code), [code]); const componentName = frontmatter.metaTitle.replace(/\s+/g, ""); + const router = useRouter(); return ( <> @@ -48,6 +50,7 @@ export default function GuidesDoc({ frontmatter, code }: Doc) { + + + View as Markdown + + + {hasPlaygroundExample(frontmatter.slug) && ( +
    + Components +
    + + + + + Components + + + + + A comprehensive library of React components for building beautiful, + accessible user interfaces. + + + + +
      + {components.map((component) => ( + +
    • + + + {component.title} + + + + {component.description} + +
    • +
      + ))} +
    +
    + + ); +} + +export async function getStaticProps() { + const frontmatters = getAllFrontmatter("themes/docs/components"); + + const components = frontmatters + .filter((fm) => !fm.slug.endsWith("/index")) + .map((fm) => ({ + slug: fm.slug, + title: fm.metaTitle, + description: fm.metaDescription, + })) + .sort((a, b) => a.title.localeCompare(b.title)); + + return { props: { components } }; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 744eca43..7c5c90b2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,6 +56,9 @@ importers: gray-matter: specifier: ^4.0.2 version: 4.0.3 + hast-util-select: + specifier: ^6.0.4 + version: 6.0.4 hast-util-to-html: specifier: ^9.0.1 version: 9.0.3 @@ -110,9 +113,18 @@ importers: rehype-parse: specifier: ^9.0.0 version: 9.0.1 + rehype-remark: + specifier: ^10.0.1 + version: 10.0.1 + remark-gfm: + specifier: ^4.0.1 + version: 4.0.1 remark-slug: specifier: ^6.0.0 version: 6.1.0 + remark-stringify: + specifier: ^11.0.0 + version: 11.0.0 scroll-into-view-if-needed: specifier: ^3.1.0 version: 3.1.0 @@ -135,6 +147,9 @@ importers: specifier: ^3.0.1 version: 3.1.0(react@18.3.1) devDependencies: + '@types/hast': + specifier: 3.0.4 + version: 3.0.4 '@types/lodash.debounce': specifier: ^4.0.6 version: 4.0.9 @@ -165,6 +180,9 @@ importers: husky: specifier: ^9.1.6 version: 9.1.6 + oxfmt: + specifier: 0.28.0 + version: 0.28.0 prettier: specifier: ^3.3.3 version: 3.3.3 @@ -523,6 +541,46 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@oxfmt/darwin-arm64@0.28.0': + resolution: {integrity: sha512-jmUfF7cNJPw57bEK7sMIqrYRgn4LH428tSgtgLTCtjuGuu1ShREyrkeB7y8HtkXRfhBs4lVY+HMLhqElJvZ6ww==} + cpu: [arm64] + os: [darwin] + + '@oxfmt/darwin-x64@0.28.0': + resolution: {integrity: sha512-S6vlV8S7jbjzJOSjfVg2CimUC0r7/aHDLdUm/3+/B/SU/s1jV7ivqWkMv1/8EB43d1BBwT9JQ60ZMTkBqeXSFA==} + cpu: [x64] + os: [darwin] + + '@oxfmt/linux-arm64-gnu@0.28.0': + resolution: {integrity: sha512-TfJkMZjePbLiskmxFXVAbGI/OZtD+y+fwS0wyW8O6DWG0ARTf0AipY9zGwGoOdpFuXOJceXvN4SHGLbYNDMY4Q==} + cpu: [arm64] + os: [linux] + + '@oxfmt/linux-arm64-musl@0.28.0': + resolution: {integrity: sha512-7fyQUdW203v4WWGr1T3jwTz4L7KX9y5DeATryQ6fLT6QQp9GEuct8/k0lYhd+ys42iTV/IkJF20e3YkfSOOILg==} + cpu: [arm64] + os: [linux] + + '@oxfmt/linux-x64-gnu@0.28.0': + resolution: {integrity: sha512-sRKqAvEonuz0qr1X1ncUZceOBJerKzkO2gZIZmosvy/JmqyffpIFL3OE2tqacFkeDhrC+dNYQpusO8zsfHo3pw==} + cpu: [x64] + os: [linux] + + '@oxfmt/linux-x64-musl@0.28.0': + resolution: {integrity: sha512-fW6czbXutX/tdQe8j4nSIgkUox9RXqjyxwyWXUDItpoDkoXllq17qbD7GVc0whrEhYQC6hFE1UEAcDypLJoSzw==} + cpu: [x64] + os: [linux] + + '@oxfmt/win32-arm64@0.28.0': + resolution: {integrity: sha512-D/HDeQBAQRjTbD9OLV6kRDcStrIfO+JsUODDCdGmhRfNX8LPCx95GpfyybpZfn3wVF8Jq/yjPXV1xLkQ+s7RcA==} + cpu: [arm64] + os: [win32] + + '@oxfmt/win32-x64@0.28.0': + resolution: {integrity: sha512-4+S2j4OxOIyo8dz5osm5dZuL0yVmxXvtmNdHB5xyGwAWVvyWNvf7tCaQD7w2fdSsAXQLOvK7KFQrHFe33nJUCA==} + cpu: [x64] + os: [win32] + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1537,6 +1595,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + bezier-easing@2.1.0: resolution: {integrity: sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig==} @@ -1550,6 +1611,9 @@ packages: bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boxen@1.3.0: resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} engines: {node: '>=4'} @@ -1766,6 +1830,9 @@ packages: resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} engines: {node: '>=4'} + css-selector-parser@3.3.0: + resolution: {integrity: sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -1856,6 +1923,10 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -2379,6 +2450,9 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-embedded@3.0.0: + resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==} + hast-util-from-html@2.0.3: resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} @@ -2388,15 +2462,33 @@ packages: hast-util-from-parse5@8.0.1: resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-is-body-ok-link@3.0.1: + resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==} + hast-util-is-element@1.1.0: resolution: {integrity: sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==} + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-minify-whitespace@1.0.1: + resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} + hast-util-parse-selector@2.2.5: resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-phrasing@3.0.1: + resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} + + hast-util-select@6.0.4: + resolution: {integrity: sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==} + hast-util-to-estree@3.1.0: resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} @@ -2409,9 +2501,15 @@ packages: hast-util-to-jsx-runtime@2.3.0: resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + hast-util-to-mdast@10.1.2: + resolution: {integrity: sha512-FiCRI7NmOvM4y+f5w32jPRzcxDIz+PUqDwEqn1A+1q2cdp3B8Gx7aVrXORdOKjMNDQsD1ogOr896+0jJHW1EFQ==} + hast-util-to-string@3.0.1: resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + hast-util-whitespace@1.0.4: resolution: {integrity: sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==} @@ -2857,12 +2955,36 @@ packages: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + mdast-util-from-markdown@2.0.1: resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} mdast-util-frontmatter@2.0.1: resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + mdast-util-mdx-expression@2.0.1: resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} @@ -2909,6 +3031,27 @@ packages: micromark-extension-frontmatter@2.0.0: resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-extension-mdx-expression@3.0.0: resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} @@ -3124,6 +3267,9 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -3195,6 +3341,11 @@ packages: resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==} deprecated: This package is no longer supported. + oxfmt@0.28.0: + resolution: {integrity: sha512-3+hhBqPE6Kp22KfJmnstrZbl+KdOVSEu1V0ABaFIg1rYLtrMgrupx9znnHgHLqKxAVHebjTdiCJDk30CXOt6cw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} @@ -3368,6 +3519,9 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + protoduck@4.0.0: resolution: {integrity: sha512-9sxuz0YTU/68O98xuDn8NBxTVH9EuMhrBTxZdiBL0/qxRmWhB/5a8MagAebDa+98vluAZTs8kMZibCdezbRCeQ==} @@ -3476,12 +3630,18 @@ packages: resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} engines: {node: '>=0.10.0'} + rehype-minify-whitespace@6.0.2: + resolution: {integrity: sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw==} + rehype-parse@7.0.1: resolution: {integrity: sha512-fOiR9a9xH+Le19i4fGzIEowAbwG7idy2Jzs4mOrFWBSJ0sNUgy0ev871dwWnbOo371SjgjG4pwzrbgSVrKxecw==} rehype-parse@9.0.1: resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + rehype-remark@10.0.1: + resolution: {integrity: sha512-EmDndlb5NVwXGfUa4c9GPK+lXeItTilLhE6ADSaQuHr4JUlKw9MidzGzx4HpqZrNCt6vnHmEifXQiiA+CEnjYQ==} + rehype-stringify@8.0.0: resolution: {integrity: sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g==} @@ -3491,6 +3651,9 @@ packages: remark-frontmatter@5.0.0: resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + remark-mdx-frontmatter@4.0.0: resolution: {integrity: sha512-PZzAiDGOEfv1Ua7exQ8S5kKxkD8CDaSb4nM+1Mprs6u8dyvQifakh+kCj6NovfGXW+bTvrhjaR3srzjS2qJHKg==} @@ -3506,6 +3669,9 @@ packages: remark-slug@6.1.0: resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remote-origin-url@0.4.0: resolution: {integrity: sha512-HYhdsT2pNd0LP4Osb0vtQ1iassxIc3Yk1oze7j8dMJFciMkW8e0rdg9E/mOunqtSVHSzvMfwLDIYzPnEDmpk6Q==} engines: {node: '>= 0.8.0'} @@ -3878,6 +4044,10 @@ packages: tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -3895,6 +4065,9 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + trim-trailing-lines@2.1.0: + resolution: {integrity: sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==} + trough@1.0.5: resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} @@ -3976,6 +4149,9 @@ packages: unist-builder@4.0.0: resolution: {integrity: sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==} + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + unist-util-is@4.1.0: resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} @@ -4512,6 +4688,30 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@oxfmt/darwin-arm64@0.28.0': + optional: true + + '@oxfmt/darwin-x64@0.28.0': + optional: true + + '@oxfmt/linux-arm64-gnu@0.28.0': + optional: true + + '@oxfmt/linux-arm64-musl@0.28.0': + optional: true + + '@oxfmt/linux-x64-gnu@0.28.0': + optional: true + + '@oxfmt/linux-x64-musl@0.28.0': + optional: true + + '@oxfmt/win32-arm64@0.28.0': + optional: true + + '@oxfmt/win32-x64@0.28.0': + optional: true + '@pkgjs/parseargs@0.11.0': optional: true @@ -5634,6 +5834,8 @@ snapshots: balanced-match@1.0.2: {} + bcp-47-match@2.0.3: {} + bezier-easing@2.1.0: {} binaryextensions@2.3.0: {} @@ -5645,6 +5847,8 @@ snapshots: bluebird@3.7.2: {} + boolbase@1.0.0: {} + boxen@1.3.0: dependencies: ansi-align: 2.0.0 @@ -5902,6 +6106,8 @@ snapshots: crypto-random-string@1.0.0: {} + css-selector-parser@3.3.0: {} + csstype@3.1.3: {} cwd@0.9.1: @@ -5998,6 +6204,8 @@ snapshots: dependencies: dequal: 2.0.3 + direction@2.0.1: {} + doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -6754,6 +6962,11 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-embedded@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element: 3.0.0 + hast-util-from-html@2.0.3: dependencies: '@types/hast': 3.0.4 @@ -6783,14 +6996,60 @@ snapshots: vfile-location: 5.0.3 web-namespaces: 2.0.1 + hast-util-has-property@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-is-body-ok-link@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-is-element@1.1.0: {} + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-minify-whitespace@1.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.0 + hast-util-parse-selector@2.2.5: {} hast-util-parse-selector@4.0.0: dependencies: '@types/hast': 3.0.4 + hast-util-phrasing@3.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.1 + hast-util-is-element: 3.0.0 + + hast-util-select@6.0.4: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.3.0 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.1 + hast-util-whitespace: 3.0.0 + nth-check: 2.1.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + hast-util-to-estree@3.1.0: dependencies: '@types/estree': 1.0.6 @@ -6859,10 +7118,34 @@ snapshots: transitivePeerDependencies: - supports-color + hast-util-to-mdast@10.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.0 + hast-util-phrasing: 3.0.1 + hast-util-to-html: 9.0.3 + hast-util-to-text: 4.0.2 + hast-util-whitespace: 3.0.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-hast: 13.2.0 + mdast-util-to-string: 4.0.0 + rehype-minify-whitespace: 6.0.2 + trim-trailing-lines: 2.1.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + hast-util-to-string@3.0.1: dependencies: '@types/hast': 3.0.4 + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + hast-util-whitespace@1.0.4: {} hast-util-whitespace@3.0.0: @@ -7289,6 +7572,15 @@ snapshots: markdown-extensions@2.0.0: {} + markdown-table@3.0.4: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + mdast-util-from-markdown@2.0.1: dependencies: '@types/mdast': 4.0.4 @@ -7317,6 +7609,63 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.0 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.1 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + mdast-util-mdx-expression@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 @@ -7445,6 +7794,64 @@ snapshots: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + micromark-extension-mdx-expression@3.0.0: dependencies: '@types/estree': 1.0.6 @@ -7791,6 +8198,10 @@ snapshots: dependencies: path-key: 3.1.1 + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + object-assign@4.1.1: {} object-inspect@1.13.2: {} @@ -7875,6 +8286,19 @@ snapshots: os-homedir: 1.0.2 os-tmpdir: 1.0.2 + oxfmt@0.28.0: + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/darwin-arm64': 0.28.0 + '@oxfmt/darwin-x64': 0.28.0 + '@oxfmt/linux-arm64-gnu': 0.28.0 + '@oxfmt/linux-arm64-musl': 0.28.0 + '@oxfmt/linux-x64-gnu': 0.28.0 + '@oxfmt/linux-x64-musl': 0.28.0 + '@oxfmt/win32-arm64': 0.28.0 + '@oxfmt/win32-x64': 0.28.0 + p-finally@1.0.0: {} p-limit@3.1.0: @@ -8068,6 +8492,8 @@ snapshots: property-information@6.5.0: {} + property-information@7.1.0: {} + protoduck@4.0.0: dependencies: genfun: 4.0.1 @@ -8251,6 +8677,11 @@ snapshots: dependencies: rc: 1.2.8 + rehype-minify-whitespace@6.0.2: + dependencies: + '@types/hast': 3.0.4 + hast-util-minify-whitespace: 1.0.1 + rehype-parse@7.0.1: dependencies: hast-util-from-parse5: 6.0.1 @@ -8262,6 +8693,14 @@ snapshots: hast-util-from-html: 2.0.3 unified: 11.0.5 + rehype-remark@10.0.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + hast-util-to-mdast: 10.1.2 + unified: 11.0.5 + vfile: 6.0.3 + rehype-stringify@8.0.0: dependencies: hast-util-to-html: 7.1.3 @@ -8281,6 +8720,17 @@ snapshots: transitivePeerDependencies: - supports-color + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + remark-mdx-frontmatter@4.0.0: dependencies: '@types/mdast': 4.0.4 @@ -8320,6 +8770,12 @@ snapshots: mdast-util-to-string: 1.1.0 unist-util-visit: 2.0.3 + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.5 + remote-origin-url@0.4.0: dependencies: parse-git-config: 0.2.0 @@ -8708,6 +9164,8 @@ snapshots: tinycolor2@1.6.0: {} + tinypool@2.1.0: {} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -8722,6 +9180,8 @@ snapshots: trim-lines@3.0.1: {} + trim-trailing-lines@2.1.0: {} + trough@1.0.5: {} trough@2.2.0: {} @@ -8830,6 +9290,11 @@ snapshots: dependencies: '@types/unist': 3.0.3 + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-is@4.1.0: {} unist-util-is@6.0.0: