diff --git a/.gitignore b/.gitignore index 4954bc1..d6af2bb 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ node_modules/ out/ public/_build/ public/dl-index/ +.contentlayer/ # Contentlayer cache ui/docs/.contentlayer/ diff --git a/contentlayer.config.ts b/contentlayer.config.ts new file mode 100644 index 0000000..9901105 --- /dev/null +++ b/contentlayer.config.ts @@ -0,0 +1,24 @@ +import { defineDocumentType, makeSource } from 'contentlayer/source-files' + +export const Workshop = defineDocumentType(() => ({ + name: 'Workshop', + filePathPattern: '**/*.mdx', + contentType: 'mdx', + fields: { + title: { type: 'string', required: true }, + summary: { type: 'string', required: true }, + level: { type: 'string', default: 'Intro' }, + duration: { type: 'string', required: false }, + tags: { type: 'list', of: { type: 'string' }, default: [] }, + updatedAt: { type: 'date', required: false }, + }, + computedFields: { + slug: { type: 'string', resolve: (doc) => doc._raw.flattenedPath }, + url: { type: 'string', resolve: (doc) => `/workshop/${doc._raw.flattenedPath}` }, + }, +})) + +export default makeSource({ + contentDirPath: 'src/content/workshop', + documentTypes: [Workshop], +}) diff --git a/next-env.d.ts b/next-env.d.ts index 9edff1c..6a87cbd 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,7 @@ /// /// import "./.next/types/routes.d.ts"; +/// // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/next.config.mjs b/next.config.mjs index 98f9a3c..1c7175a 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,5 +1,6 @@ import path from "path"; import { fileURLToPath } from "url"; +import { withContentlayer } from "next-contentlayer"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -106,4 +107,4 @@ export async function rewrites() { ]; } -export default nextConfig; +export default withContentlayer(nextConfig); diff --git a/package.json b/package.json index 64ad4a7..e8685f7 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ "@testing-library/react": "^14.3.1", "@testing-library/user-event": "^14.6.1", "@types/js-yaml": "^4.0.9", + "@types/mdx": "^2.0.13", "@types/node": "24.0.3", "@types/prismjs": "^1.26.3", "@types/react": "^18.3.26", @@ -81,9 +82,11 @@ "@types/sanitize-html": "^2.16.0", "autoprefixer": "^10.4.16", "baseline-browser-mapping": "^2.8.32", + "contentlayer": "^0.3.4", "eslint": "8.57.0", "eslint-config-next": "^15.5.3", "jsdom": "^24.0.0", + "next-contentlayer": "^0.3.4", "postcss": "^8.4.32", "prettier": "^3.3.3", "tailwindcss": "^3.4.3", diff --git a/src/app/blog/[...slug]/page.tsx b/src/app/blog/[...slug]/page.tsx index d6b6c58..ff81932 100644 --- a/src/app/blog/[...slug]/page.tsx +++ b/src/app/blog/[...slug]/page.tsx @@ -1,10 +1,13 @@ +export const dynamic = 'error' +export const revalidate = false + import Link from 'next/link' import { notFound } from 'next/navigation' import { compileMDX } from 'next-mdx-remote/rsc' -import { readMdxFile } from '@lib/mdx' -import { resolveBlogContentRoot } from '@lib/marketingContent' import type { Metadata } from 'next' +import { getBlogPostBySlug, getBlogSlugs } from '@lib/blogContent' + type PageProps = { params: { slug: string | string[] } } @@ -18,114 +21,91 @@ function formatDate(dateStr: string, language: 'zh' | 'en'): string { month: 'long', day: 'numeric', }) - } else { - return date.toLocaleDateString('en-US', { - year: 'numeric', - month: 'long', - day: 'numeric', - }) } + + return date.toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric', + }) +} + +export async function generateStaticParams() { + const slugs = await getBlogSlugs() + return slugs.map((slug) => ({ slug: slug.split('/') })) } export async function generateMetadata({ params }: PageProps): Promise { - const { slug } = await params - const slugPath = Array.isArray(slug) ? slug.join('/') : slug - try { - const blogContentRoot = resolveBlogContentRoot() - const file = await readMdxFile(slugPath, { baseDir: blogContentRoot }) + const slugParam = await params + const slugPath = Array.isArray(slugParam.slug) ? slugParam.slug.join('/') : slugParam.slug + const post = await getBlogPostBySlug(slugPath) - const title = file.metadata.title as string - const excerpt = (file.metadata.excerpt as string) || '' + if (!post) { + return { title: 'Blog Post | Cloud-Neutral' } + } - return { - title: `${title} | Cloud-Neutral Blog`, - description: excerpt, - } - } catch (error) { - return { - title: 'Blog Post | Cloud-Neutral', - } + return { + title: `${post.title} | Cloud-Neutral Blog`, + description: post.excerpt, } } export default async function BlogPostPage({ params }: PageProps) { - const { slug } = await params - const slugPath = Array.isArray(slug) ? slug.join('/') : slug - try { - const blogContentRoot = resolveBlogContentRoot() - const file = await readMdxFile(slugPath, { baseDir: blogContentRoot }) - const mdx = await compileMDX({ - source: file.content, - }) + const slugParam = await params + const slugPath = Array.isArray(slugParam.slug) ? slugParam.slug.join('/') : slugParam.slug + const post = await getBlogPostBySlug(slugPath) - const title = (file.metadata.title as string) || slugPath - const author = file.metadata.author as string | undefined - const date = file.metadata.date as string | undefined - const tags = file.metadata.tags as string[] | undefined - - return ( -
-
- {/* Back to blog link */} - - ← {date ? 'Back to Blog' : '返回博客'} - - - {/* Article header */} -
-

- {title} -

- - {author && ( -

- {date ? 'By' : '作者'} {author} -

- )} - - {date && ( - - )} - - {tags && tags.length > 0 && ( -
- {tags.map((tag) => ( - - {tag} - - ))} -
- )} -
- - {/* Article content */} -
- {mdx.content} -
- - {/* Footer */} -
- - ← Back to Blog - -
-
-
- ) - } catch (error) { + if (!post) { notFound() } + + const mdx = await compileMDX({ + source: post.content, + }) + + return ( +
+
+ + ← {post.date ? 'Back to Blog' : '返回博客'} + + +
+

{post.title}

+ + {post.author &&

{post.date ? 'By' : '作者'} {post.author}

} + + {post.date && ( + + )} + + {post.tags && post.tags.length > 0 && ( +
+ {post.tags.map((tag) => ( + + {tag} + + ))} +
+ )} +
+ +
+ {mdx.content} +
+ +
+ + ← Back to Blog + +
+
+
+ ) } diff --git a/src/app/blog/page.tsx b/src/app/blog/page.tsx index aa51743..3a22c9b 100644 --- a/src/app/blog/page.tsx +++ b/src/app/blog/page.tsx @@ -1,244 +1,17 @@ -export const dynamic = 'force-dynamic' +export const dynamic = 'error' +export const revalidate = false -import Link from 'next/link' -import SearchComponent from '@components/search' -import { getHomepagePosts } from '@lib/marketingContent' import type { Metadata } from 'next' -import { notFound } from 'next/navigation' + +import BlogList from '@components/blog/BlogList' +import { getBlogPosts } from '@lib/blogContent' export const metadata: Metadata = { title: 'Blog | Cloud-Neutral', description: 'Latest updates, releases, and insights from the Cloud-Neutral community.', } -function formatDate(dateStr: string | undefined, language: 'zh' | 'en'): string { - if (!dateStr) return '' - - const date = new Date(dateStr) - - if (language === 'zh') { - return date.toLocaleDateString('zh-CN', { - year: 'numeric', - month: 'long', - day: 'numeric', - }) - } else { - return date.toLocaleDateString('en-US', { - year: 'numeric', - month: 'long', - day: 'numeric', - }) - } -} - -type PageProps = { - searchParams?: { page?: string; category?: string } -} - -const CATEGORY_TABS: { key: string; label: string }[] = [ - { key: 'infra-cloud', label: 'Infra & Cloud' }, - { key: 'observability', label: 'Observability' }, - { key: 'identity', label: 'ID & Security' }, - { key: 'iac-devops', label: 'IaC & DevOps' }, - { key: 'data-ai', label: 'Data & AI' }, - { key: 'insight', label: '资讯' }, - { key: 'essays', label: '随笔&观察' }, -] - -function buildCategoryCounts(posts: Awaited>) { - return posts.reduce>((acc, post) => { - if (post.category?.key) { - acc[post.category.key] = (acc[post.category.key] || 0) + 1 - } - return acc - }, {}) -} - -export default async function BlogPage({ searchParams }: PageProps) { - const posts = await getHomepagePosts() - const { page, category } = searchParams ?? {} - const categoryCounts = buildCategoryCounts(posts) - const selectedCategory = CATEGORY_TABS.find((tab) => tab.key === category)?.key - const filteredPosts = selectedCategory ? posts.filter((post) => post.category?.key === selectedCategory) : posts - const postsPerPage = 10 - const currentPage = parseInt(page || '1', 10) - const totalPages = Math.max(1, Math.ceil(filteredPosts.length / postsPerPage)) - - if ((filteredPosts.length > 0 && currentPage > totalPages) || currentPage < 1) { - notFound() - } - - const startIndex = (currentPage - 1) * postsPerPage - const endIndex = startIndex + postsPerPage - const paginatedPosts = filteredPosts.slice(startIndex, endIndex) - - return ( -
- {/* Sticky Navigation Header */} -
-
- - SVC.plus - / - blog - -
- -
-
-
- -
-
-
-

Blog

-

- Latest updates, releases, and insights from the Cloud-Neutral community. -

-
- -
- {CATEGORY_TABS.map((tab) => { - const isActive = tab.key === selectedCategory - const labelWithCount = categoryCounts[tab.key] - - return ( - - {tab.label} - {labelWithCount ? ( - - {labelWithCount} - - ) : null} - - ) - })} - - 全部 - - {posts.length} - - -
- - {filteredPosts.length === 0 ? ( -
-

暂无博客文章

-
- ) : ( - <> -
- {paginatedPosts.map((post) => ( -
-
- Blog - {post.date && ( - - )} -
-

{post.title}

- {post.author && ( -

By {post.author}

- )} -

{post.excerpt}

-
- {post.tags && post.tags.length > 0 && ( -
- {post.tags.map((tag) => ( - - {tag} - - ))} -
- )} - - Read more → - -
-
- ))} -
- - {totalPages > 1 && ( - - )} - - )} -
-
-
- ) +export default async function BlogPage() { + const posts = await getBlogPosts() + return } diff --git a/src/app/docs/DocCollectionCard.tsx b/src/app/docs/DocCollectionCard.tsx index fcfdadc..090078e 100644 --- a/src/app/docs/DocCollectionCard.tsx +++ b/src/app/docs/DocCollectionCard.tsx @@ -6,52 +6,46 @@ import Link from 'next/link' import { ArrowUpRight } from 'lucide-react' import ClientTime from '../components/ClientTime' -import type { DocCollection, DocVersionOption } from './types' +import type { DocCollection } from './types' interface DocCollectionCardProps { collection: DocCollection meta?: string } -function resolveVersionLabel(version?: DocVersionOption | null) { - return version?.label ?? 'Latest' -} - export default function DocCollectionCard({ collection, meta }: DocCollectionCardProps) { const { versions } = collection - const defaultVersionId = collection.defaultVersionId ?? versions[0]?.id ?? '' - const [selectedVersionId, setSelectedVersionId] = useState(defaultVersionId) + const defaultVersionSlug = collection.defaultVersionSlug ?? versions[0]?.slug ?? '' + const [selectedVersionSlug, setSelectedVersionSlug] = useState(defaultVersionSlug) useEffect(() => { - if (!defaultVersionId) { + if (!defaultVersionSlug) { return } - setSelectedVersionId(defaultVersionId) - }, [defaultVersionId, collection.slug]) + setSelectedVersionSlug(defaultVersionSlug) + }, [defaultVersionSlug, collection.slug]) useEffect(() => { if (!versions.length) { return } - if (!versions.some((version) => version.id === selectedVersionId)) { - const fallback = versions.find((version) => version.id === defaultVersionId) ?? versions[0] + if (!versions.some((version) => version.slug === selectedVersionSlug)) { + const fallback = versions.find((version) => version.slug === defaultVersionSlug) ?? versions[0] if (fallback) { - setSelectedVersionId(fallback.id) + setSelectedVersionSlug(fallback.slug) } } - }, [versions, selectedVersionId, defaultVersionId]) + }, [versions, selectedVersionSlug, defaultVersionSlug]) const activeVersion = useMemo(() => { if (!versions.length) return undefined - return versions.find((version) => version.id === selectedVersionId) ?? versions[0] - }, [versions, selectedVersionId]) + return versions.find((version) => version.slug === selectedVersionSlug) ?? versions[0] + }, [versions, selectedVersionSlug]) - const activeResource = activeVersion?.resource - const description = activeResource?.description ?? collection.description + const description = activeVersion?.description ?? collection.description const href = activeVersion ? `/docs/${collection.slug}/${activeVersion.slug}` : `/docs/${collection.slug}` - const updatedAt = activeResource?.updatedAt ?? collection.updatedAt - const estimatedMinutes = activeResource?.estimatedMinutes ?? collection.estimatedMinutes - const tags = activeResource?.tags?.length ? activeResource.tags : collection.tags + const updatedAt = activeVersion?.updatedAt ?? collection.updatedAt + const tags = activeVersion?.tags?.length ? activeVersion.tags : collection.tags return (
@@ -70,7 +64,6 @@ export default function DocCollectionCard({ collection, meta }: DocCollectionCar Updated )} - {estimatedMinutes && {estimatedMinutes} min read} @@ -85,12 +78,12 @@ export default function DocCollectionCard({ collection, meta }: DocCollectionCar - )} - {activeResource.updatedAt && ( - - Updated - - )} - {activeResource.estimatedMinutes && Approx. {activeResource.estimatedMinutes} minute read} - {activeVersion?.pathSegment && ( - {activeVersion.pathSegment} - )} - - - - - - - ) -} diff --git a/src/app/docs/[collection]/[version]/DocReader.tsx b/src/app/docs/[collection]/[version]/DocReader.tsx deleted file mode 100644 index 2bb94a6..0000000 --- a/src/app/docs/[collection]/[version]/DocReader.tsx +++ /dev/null @@ -1,567 +0,0 @@ -'use client' - -import { - ComponentProps, - ReactElement, - forwardRef, - useCallback, - useEffect, - useImperativeHandle, - useMemo, - useRef, - useState, -} from 'react' -import DOMPurify from 'dompurify' - -import type { DocViewOption } from './DocViewSection' - -export interface DocTocItem { - id: string - title: string - level: number - type: 'html' | 'pdf' - targetId?: string - pageNumber?: number -} - -export interface DocReaderHandle { - scrollToAnchor: (item: DocTocItem) => void -} - -interface DocReaderProps { - docTitle: string - view?: DocViewOption - onTocChange: (items: DocTocItem[]) => void - onProgressChange: (value: number) => void - onActiveAnchorChange: (id: string | null) => void -} - -type LoadingState = 'idle' | 'loading' | 'error' - -interface PdfModule { - Document: typeof import('react-pdf').Document - Page: typeof import('react-pdf').Page -} - -type DocumentComponent = PdfModule['Document'] -type OnLoadSuccess = NonNullable['onLoadSuccess']> -type PdfDocument = Parameters[0] - -const HTML_ENCODINGS = ['utf-8', 'utf-16le', 'utf-16be', 'gb18030'] - -const slugify = (value: string) => - value - .toLowerCase() - .replace(/[^a-z0-9\u4e00-\u9fa5]+/g, '-') - .replace(/^-+|-+$/g, '') || 'section' - -const decodeBuffer = (buffer: ArrayBuffer, encodings: string[]): string => { - for (const encoding of encodings) { - try { - const decoder = new TextDecoder(encoding, { fatal: true }) - return decoder.decode(buffer) - } catch { - continue - } - } - const decoder = new TextDecoder() - return decoder.decode(buffer) -} - -const buildHtmlToc = (container: HTMLElement): DocTocItem[] => { - const headings = Array.from(container.querySelectorAll('h1, h2, h3, h4, h5, h6')) - return headings.map((heading, index) => { - const rawTitle = heading.textContent?.trim() || `Section ${index + 1}` - const baseId = slugify(rawTitle) - const headingId = heading.getAttribute('id') || `${baseId}-${index}` - heading.setAttribute('id', headingId) - heading.setAttribute('data-doc-heading', 'true') - const level = Number(heading.tagName.replace('H', '')) - return { - id: headingId, - title: rawTitle, - level: Number.isNaN(level) ? 2 : level, - type: 'html' as const, - targetId: headingId, - } - }) -} - -type PdfOutline = { - title: string - dest?: unknown - items?: PdfOutline[] -} - -type PdfRef = { num: number; gen: number } - -const isPdfRef = (value: unknown): value is PdfRef => - typeof value === 'object' && - value !== null && - 'num' in value && - 'gen' in value && - typeof (value as { num: unknown }).num === 'number' && - typeof (value as { gen: unknown }).gen === 'number' - -const buildPdfToc = async (pdf: PdfDocument): Promise => { - const outline = ((await pdf.getOutline()) as PdfOutline[]) ?? [] - - const flattenOutline = async (items: PdfOutline[] | undefined, level = 1): Promise => { - if (!items || !items.length) { - return [] - } - const result: DocTocItem[] = [] - for (const item of items) { - if (!item) continue - let pageNumber: number | undefined - if (item.dest) { - try { - let ref: unknown - if (typeof item.dest === 'string') { - const destination = await pdf.getDestination(item.dest) - ref = Array.isArray(destination) ? destination[0] : destination - } else if (Array.isArray(item.dest)) { - const [first] = item.dest - ref = first - } else { - ref = item.dest - } - if (isPdfRef(ref)) { - pageNumber = (await pdf.getPageIndex(ref)) + 1 - } else if (typeof ref === 'number') { - pageNumber = ref + 1 - } - } catch { - // ignore resolution errors - } - } - const id = `${slugify(item.title || 'page')}-${level}-${result.length}` - result.push({ - id, - title: item.title || 'Untitled section', - level, - type: 'pdf', - pageNumber, - }) - if (item.items?.length) { - const children = await flattenOutline(item.items, Math.min(level + 1, 6)) - result.push(...children) - } - } - return result - } - - const toc = await flattenOutline(outline, 1) - if (toc.length) { - return toc - } - - const fallback: DocTocItem[] = [] - const numPages = pdf.numPages - for (let page = 1; page <= numPages; page += 1) { - fallback.push({ - id: `pdf-page-${page}`, - title: `Page ${page}`, - level: 2, - type: 'pdf', - pageNumber: page, - }) - } - return fallback -} - -const DocReader = forwardRef( - ({ docTitle, view, onTocChange, onProgressChange, onActiveAnchorChange }, ref) => { - const scrollContainerRef = useRef(null) - const htmlContainerRef = useRef(null) - const [htmlContent, setHtmlContent] = useState('') - const [loadingState, setLoadingState] = useState('idle') - const [errorMessage, setErrorMessage] = useState(null) - const [pdfModule, setPdfModule] = useState(null) - const [numPages, setNumPages] = useState(0) - const [containerWidth, setContainerWidth] = useState(null) - const pdfDocumentRef = useRef(null) - const pageRefs = useRef>(new Map()) - const tocItemsRef = useRef([]) - - const currentViewId = view?.id - const resolvedViewUrl = view?.viewerUrl ?? view?.url ?? null - - useEffect(() => { - onTocChange([]) - onActiveAnchorChange(null) - onProgressChange(0) - setHtmlContent('') - setErrorMessage(null) - setNumPages(0) - pageRefs.current.clear() - pdfDocumentRef.current = null - tocItemsRef.current = [] - if (view) { - if (!resolvedViewUrl) { - setErrorMessage('Document source is unavailable for this format.') - setLoadingState('error') - return - } - setLoadingState('loading') - } else { - setLoadingState('idle') - } - }, [view, resolvedViewUrl, onTocChange, onActiveAnchorChange, onProgressChange]) - - useEffect(() => { - if (!view || view.id !== 'html') { - return - } - const targetUrl = view.viewerUrl ?? view.url - if (!targetUrl) { - return - } - let cancelled = false - const controller = new AbortController() - const load = async () => { - try { - const response = await fetch(targetUrl, { signal: controller.signal }) - if (!response.ok) { - throw new Error(`Request failed with status ${response.status}`) - } - const buffer = await response.arrayBuffer() - const contentType = response.headers.get('content-type') || '' - const charsetMatch = /charset=([^;]+)/i.exec(contentType) - const encodings = [...HTML_ENCODINGS] - if (charsetMatch) { - const charset = charsetMatch[1].trim().toLowerCase() - if (charset && !encodings.includes(charset)) { - encodings.unshift(charset) - } - } - const html = decodeBuffer(buffer, encodings) - const parser = new DOMParser() - const doc = parser.parseFromString(html, 'text/html') - const body = doc.body || doc.createElement('body') - const tocItems = buildHtmlToc(body) - if (cancelled) return - const sanitized = DOMPurify.sanitize(body.innerHTML, { - ADD_ATTR: ['data-doc-heading'], - USE_PROFILES: { html: true }, - }) - setHtmlContent(sanitized) - tocItemsRef.current = tocItems - onTocChange(tocItems) - setLoadingState('idle') - if (tocItems.length) { - onActiveAnchorChange(tocItems[0].id) - } - } catch (error) { - if (cancelled || (error instanceof DOMException && error.name === 'AbortError')) { - return - } - setErrorMessage('Unable to load HTML content for this document.') - setLoadingState('error') - } - } - load() - return () => { - cancelled = true - controller.abort() - } - }, [view, resolvedViewUrl, onTocChange, onActiveAnchorChange]) - - useEffect(() => { - if (!view || view.id !== 'pdf') { - setPdfModule(null) - return - } - let cancelled = false - const load = async () => { - try { - const mod = await import('react-pdf') - mod.pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${mod.pdfjs.version}/pdf.worker.min.js` - if (!cancelled) { - setPdfModule({ Document: mod.Document, Page: mod.Page }) - } - } catch (error) { - if (cancelled) return - setErrorMessage('Unable to initialise the PDF renderer.') - setLoadingState('error') - } - } - load() - return () => { - cancelled = true - } - }, [view]) - - const handlePdfLoadSuccess = useCallback( - (pdf) => { - pdfDocumentRef.current = pdf - setNumPages(pdf.numPages) - setLoadingState('idle') - void (async () => { - try { - const tocItems = await buildPdfToc(pdf) - tocItemsRef.current = tocItems - onTocChange(tocItems) - if (tocItems.length) { - onActiveAnchorChange(tocItems[0].id) - } - } catch { - const fallback: DocTocItem[] = [] - for (let page = 1; page <= pdf.numPages; page += 1) { - fallback.push({ - id: `pdf-page-${page}`, - title: `Page ${page}`, - level: 2, - type: 'pdf', - pageNumber: page, - }) - } - tocItemsRef.current = fallback - onTocChange(fallback) - if (fallback.length) { - onActiveAnchorChange(fallback[0].id) - } - } - })() - }, - [onTocChange, onActiveAnchorChange], - ) - - const registerPageRef = useCallback((pageNumber: number, element: HTMLDivElement | null) => { - if (!element) { - pageRefs.current.delete(pageNumber) - return - } - pageRefs.current.set(pageNumber, element) - }, []) - - useEffect(() => { - const container = scrollContainerRef.current - if (!container) return - - const updateProgress = () => { - if (!container) return - const { scrollTop, scrollHeight, clientHeight } = container - const denominator = scrollHeight - clientHeight - if (denominator <= 0) { - onProgressChange(1) - return - } - const nextValue = Math.min(Math.max(scrollTop / denominator, 0), 1) - onProgressChange(Number.isFinite(nextValue) ? nextValue : 0) - } - - updateProgress() - container.addEventListener('scroll', updateProgress) - return () => { - container.removeEventListener('scroll', updateProgress) - } - }, [onProgressChange, currentViewId]) - - useEffect(() => { - const container = scrollContainerRef.current - if (!container) return - const observer = new ResizeObserver(() => { - const { scrollHeight, clientHeight } = container - if (scrollHeight <= clientHeight) { - onProgressChange(1) - } - }) - observer.observe(container) - return () => { - observer.disconnect() - } - }, [onProgressChange, currentViewId]) - - useEffect(() => { - if (!view || view.id !== 'html') return - const container = scrollContainerRef.current - if (!container) return - const headings = Array.from(container.querySelectorAll('[data-doc-heading="true"]')) - if (!headings.length) return - const observer = new IntersectionObserver( - (entries) => { - const visible = entries - .filter((entry) => entry.isIntersecting) - .sort((a, b) => b.intersectionRatio - a.intersectionRatio) - if (visible[0]) { - onActiveAnchorChange(visible[0].target.id) - } - }, - { - root: container, - threshold: [0.1, 0.25, 0.4], - rootMargin: '0px 0px -40% 0px', - }, - ) - headings.forEach((heading) => observer.observe(heading)) - return () => { - headings.forEach((heading) => observer.unobserve(heading)) - observer.disconnect() - } - }, [view, htmlContent, onActiveAnchorChange]) - - useEffect(() => { - if (!view || view.id !== 'pdf') return - const container = scrollContainerRef.current - if (!container) return - const pages = Array.from(pageRefs.current.values()) - if (!pages.length) return - const observer = new IntersectionObserver( - (entries) => { - const topEntry = entries - .filter((entry) => entry.isIntersecting) - .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0] - if (topEntry) { - const pageNumber = Number((topEntry.target as HTMLElement).dataset.pageNumber) - if (Number.isFinite(pageNumber)) { - const tocMatch = tocItemsRef.current.find((item) => item.pageNumber === pageNumber) - onActiveAnchorChange(tocMatch?.id ?? `pdf-page-${pageNumber}`) - } - } - }, - { - root: container, - threshold: [0.2, 0.4], - rootMargin: '0px 0px -45% 0px', - }, - ) - pages.forEach((page) => observer.observe(page)) - return () => { - pages.forEach((page) => observer.unobserve(page)) - observer.disconnect() - } - }, [view, numPages, onActiveAnchorChange]) - - useEffect(() => { - const container = htmlContainerRef.current - if (!container) return - const observer = new ResizeObserver((entries) => { - const entry = entries[0] - if (entry) { - setContainerWidth(entry.contentRect.width) - } - }) - observer.observe(container) - return () => { - observer.disconnect() - } - }, [view, htmlContent]) - - useImperativeHandle( - ref, - () => ({ - scrollToAnchor: (item: DocTocItem) => { - const container = scrollContainerRef.current - if (!container) return - if (item.type === 'html' && item.targetId) { - const escapedId = - typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(item.targetId) : item.targetId.replace(/\s+/g, '\\ ') - const target = container.querySelector(`#${escapedId}`) - if (target) { - target.scrollIntoView({ behavior: 'smooth', block: 'start' }) - } - } - if (item.type === 'pdf' && item.pageNumber) { - const page = pageRefs.current.get(item.pageNumber) - if (page) { - page.scrollIntoView({ behavior: 'smooth', block: 'start' }) - } - } - }, - }), - [], - ) - - const renderHtmlContent = useMemo(() => { - if (!htmlContent) return null - return ( -
- ) - }, [htmlContent]) - - const renderPdfContent = () => { - if (!pdfModule || !view || view.id !== 'pdf') { - return null - } - const targetUrl = view.viewerUrl ?? view.url - if (!targetUrl) { - return ( -
- We could not locate the PDF source for this document. -
- ) - } - const { Document, Page } = pdfModule - const width = containerWidth ? Math.min(containerWidth - 32, 960) : undefined - return ( - { - setErrorMessage('Unable to load the PDF document.') - setLoadingState('error') - }} - loading={
Loading PDF…
} - error={ -
Unable to load the PDF document.
- } - > - {Array.from({ length: numPages }).map((_, index) => ( -
registerPageRef(index + 1, element)} - data-page-number={index + 1} - className="mb-8 flex justify-center" - > - -
- ))} -
- ) - } - - let content: ReactElement | null = null - if (!view) { - content = ( -
- Select a format on the left to begin reading this document. -
- ) - } else if (loadingState === 'loading') { - content = ( -
- Preparing {view.label} view for “{docTitle}”… -
- ) - } else if (loadingState === 'error') { - content = ( -
{errorMessage}
- ) - } else if (view.id === 'html') { - content = renderHtmlContent ?? ( -
- We could not extract readable HTML content from this resource. -
- ) - } else if (view.id === 'pdf') { - content = renderPdfContent() - } - - return ( -
-
-
{content}
-
-
- ) - }, -) - -DocReader.displayName = 'DocReader' - -export default DocReader - diff --git a/src/app/docs/[collection]/[version]/DocViewSection.tsx b/src/app/docs/[collection]/[version]/DocViewSection.tsx deleted file mode 100644 index f326f8d..0000000 --- a/src/app/docs/[collection]/[version]/DocViewSection.tsx +++ /dev/null @@ -1,263 +0,0 @@ -'use client' - -import { useEffect, useMemo, useRef, useState } from 'react' -import { - ChevronDown, - ChevronRight, - ExternalLink, - FileText, - Monitor, - PanelLeft, - PanelLeftClose, -} from 'lucide-react' - -import DocReader, { type DocReaderHandle, type DocTocItem } from './DocReader' - -export type ViewMode = 'pdf' | 'html' - -export interface DocViewOption { - id: ViewMode - label: string - description: string - url: string - viewerUrl?: string - icon: ViewMode -} - -const ICON_MAP: Record = { - pdf: FileText, - html: Monitor, -} - -interface DocViewSectionProps { - docTitle: string - options: DocViewOption[] -} - -export default function DocViewSection({ docTitle, options }: DocViewSectionProps) { - const [activeId, setActiveId] = useState(options[0]?.id) - const [sidebarCollapsed, setSidebarCollapsed] = useState(false) - const [formatsCollapsed, setFormatsCollapsed] = useState(false) - const [tocCollapsed, setTocCollapsed] = useState(false) - const [tocItems, setTocItems] = useState([]) - const [progress, setProgress] = useState(0) - const [activeAnchor, setActiveAnchor] = useState(null) - const readerRef = useRef(null) - - useEffect(() => { - if (!options.length) { - setActiveId(undefined) - return - } - if (!activeId || !options.some((option) => option.id === activeId)) { - setActiveId(options[0].id) - } - }, [options, activeId]) - - const activeView = useMemo(() => { - if (!options.length) return undefined - return options.find((option) => option.id === activeId) ?? options[0] - }, [options, activeId]) - - const ActiveIcon = activeView ? ICON_MAP[activeView.icon] : undefined - - const handleTocClick = (item: DocTocItem) => { - readerRef.current?.scrollToAnchor(item) - } - - const activeAnchorLabel = useMemo(() => { - if (!activeAnchor) return '' - const match = tocItems.find((item) => item.id === activeAnchor) - if (match) { - if (match.type === 'pdf' && match.pageNumber) { - return `${match.title} • 第 ${match.pageNumber} 页` - } - return match.title - } - if (activeView?.id === 'pdf' && activeAnchor.startsWith('pdf-page-')) { - const page = Number(activeAnchor.replace('pdf-page-', '')) - if (Number.isFinite(page)) { - return `第 ${page} 页` - } - } - return '' - }, [activeAnchor, tocItems, activeView]) - - return ( -
-
- {sidebarCollapsed ? ( - - ) : ( - - )} -
- -
-
-
-
- {ActiveIcon && ( - - - - )} -
-

当前阅读格式

-

- {activeView ? `${activeView.label}` : '请选择阅读格式'} -

-
-
- {activeView && ( - - 全屏沉浸式模式 - - )} -
- - - -
-
- 阅读进度 - {Math.round(progress * 100)}% -
-
-
-
- {activeAnchorLabel && ( -

当前章节:{activeAnchorLabel}

- )} -
-
-
-
- ) -} diff --git a/src/app/docs/[collection]/[version]/page.tsx b/src/app/docs/[collection]/[version]/page.tsx index a3463f7..fc04897 100644 --- a/src/app/docs/[collection]/[version]/page.tsx +++ b/src/app/docs/[collection]/[version]/page.tsx @@ -1,24 +1,27 @@ export const dynamic = 'error' +export const revalidate = false import { notFound } from 'next/navigation' import type { Metadata } from 'next' import Breadcrumbs, { type Crumb } from '../../../../components/download/Breadcrumbs' -import { getDocCollections, getDocResource, getDocCollectionsForBuildTime } from '../../resources.server' +import DocArticle from '@/components/doc/DocArticle' +import DocMetaPanel from '@/components/doc/DocMetaPanel' +import DocVersionSwitcher from '@/components/doc/DocVersionSwitcher' +import { getDocVersionParams, getDocVersion } from '../../resources.server' import { isFeatureEnabled } from '@lib/featureToggles' -import DocCollectionView from './DocCollectionView' function buildBreadcrumbs( slug: string, docTitle: string, - version?: { label: string; slug?: string; id: string }, + version?: { label: string; slug: string }, ): Crumb[] { const crumbs: Crumb[] = [ { label: 'Docs', href: '/docs' }, { label: docTitle, href: `/docs/${slug}` }, ] if (version) { - const versionSlug = version.slug ?? version.id + const versionSlug = version.slug crumbs.push({ label: version.label, href: `/docs/${slug}/${versionSlug}` }) } return crumbs @@ -29,15 +32,7 @@ export const generateStaticParams = async () => { return [] } - // 构建时优先使用本地 fallback 数据,避免外部API调用 - const collections = await getDocCollectionsForBuildTime() - const params: { collection: string; version: string }[] = [] - for (const doc of collections) { - for (const version of doc.versions) { - params.push({ collection: doc.slug, version: version.slug }) - } - } - return params + return getDocVersionParams() } export const dynamicParams = false @@ -55,23 +50,44 @@ export default async function DocVersionPage({ notFound() } - const doc = await getDocResource(params.collection) + const doc = await getDocVersion(params.collection, params.version) if (!doc) { notFound() } - const activeVersion = doc.versions.find((item) => item.slug === params.version || item.id === params.version) - if (!activeVersion) { - notFound() - } - - const breadcrumbs = buildBreadcrumbs(doc.slug, doc.title, activeVersion) + const { collection, version } = doc + const breadcrumbs = buildBreadcrumbs(collection.slug, collection.title, version) return (
- +
+
+
+

{collection.title}

+

{version.title}

+

{collection.description}

+
+
+ ({ slug: item.slug, label: item.label }))} + activeSlug={version.slug} + /> + {version.updatedAt && Updated {version.updatedAt}} +
+
+
+ +
+
+ +
+
+ +
+
) diff --git a/src/app/docs/[collection]/page.tsx b/src/app/docs/[collection]/page.tsx index dc5db4c..657782e 100644 --- a/src/app/docs/[collection]/page.tsx +++ b/src/app/docs/[collection]/page.tsx @@ -31,7 +31,7 @@ export default async function CollectionPage({ notFound() } - const defaultVersion = doc.versions.find((version) => version.id === doc.defaultVersionId) ?? doc.versions[0] + const defaultVersion = doc.versions.find((version) => version.slug === doc.defaultVersionSlug) ?? doc.versions[0] if (!defaultVersion) { notFound() } diff --git a/src/app/docs/page.tsx b/src/app/docs/page.tsx index 6a7f2a3..cf07f30 100644 --- a/src/app/docs/page.tsx +++ b/src/app/docs/page.tsx @@ -1,4 +1,5 @@ -export const dynamic = 'force-dynamic' +export const dynamic = 'error' +export const revalidate = false import { notFound } from 'next/navigation' @@ -9,13 +10,8 @@ import DocCollectionCard from './DocCollectionCard' function formatMeta(resource: DocCollection) { const parts: string[] = [] - if (resource.category) { - parts.push(resource.category) - } - if (resource.latestVersionLabel) { - parts.push(resource.latestVersionLabel) - } else if (resource.latestVariant) { - parts.push(resource.latestVariant) + if (resource.updatedAt) { + parts.push('Updated') } if (resource.versions.length > 1) { parts.push(`${resource.versions.length} versions`) diff --git a/src/app/docs/resources.server.ts b/src/app/docs/resources.server.ts index 53da831..b5d082a 100644 --- a/src/app/docs/resources.server.ts +++ b/src/app/docs/resources.server.ts @@ -1,401 +1,23 @@ import 'server-only' +import { cache } from 'react' + +import { getDocCollection, getDocCollections as loadDocCollections, getDocParams } from '@lib/docContent' import { isFeatureEnabled } from '@lib/featureToggles' -import fallbackDocsIndex from '../../../public/_build/docs_index.json' - -import { buildAbsoluteDocUrl } from './utils' -import type { DocCollection, DocResource, DocVersionOption } from './types' - -const DOCS_MANIFEST_URL = 'https://dl.svc.plus/dl-index/docs-manifest.json' -const REMOTE_DOCS_ENABLED = process.env.ALLOW_REMOTE_DOCS_FETCH === 'true' -const FALLBACK_DOCS_INDEX = Array.isArray(fallbackDocsIndex) ? (fallbackDocsIndex as RawDocResource[]) : [] - -interface RawDocResource { - slug?: unknown - title?: unknown - description?: unknown - category?: unknown - version?: unknown - updatedAt?: unknown - pdfUrl?: unknown - htmlUrl?: unknown - tags?: unknown - estimatedMinutes?: unknown - coverImage?: unknown - language?: unknown - variant?: unknown - versionSlug?: unknown - pathSegments?: unknown - collection?: unknown - collectionSlug?: unknown - collectionLabel?: unknown -} - -async function fetchDocs(options?: { useCache?: boolean }): Promise { - try { - const response = await fetch(DOCS_MANIFEST_URL, { - // 运行时使用缓存策略,减少API调用 - next: options?.useCache ? { revalidate: 3600 } : undefined, - }) - - if (!response.ok) { - throw new Error(`Failed to fetch docs manifest: ${response.statusText}`) - } - - const data = await response.json() - return Array.isArray(data) ? (data as RawDocResource[]) : [] - } catch (error) { - if (REMOTE_DOCS_ENABLED) { - console.warn('Error fetching docs manifest:', error) - } - return [] - } -} - -async function loadDocs(options?: { useCache?: boolean }): Promise { - if (!REMOTE_DOCS_ENABLED) { - return FALLBACK_DOCS_INDEX - } - - const manifestDocs = await fetchDocs(options) - - if (manifestDocs.length > 0) { - return manifestDocs - } - - return FALLBACK_DOCS_INDEX -} - -// 构建时数据获取:优先使用本地 fallback,保证构建成功 -async function loadDocsForBuildTime(): Promise { - // 构建时优先使用本地数据,避免外部API调用导致构建失败 - const fallbackDocs = FALLBACK_DOCS_INDEX - - if (fallbackDocs.length > 0) { - return fallbackDocs - } - - // fallback为空时,再尝试获取远程数据 - if (REMOTE_DOCS_ENABLED) { - console.warn('Fallback docs not found, attempting to fetch remote docs manifest...') - const manifestDocs = await fetchDocs({ useCache: true }) - return manifestDocs - } - - return [] -} - -async function getRawDocs(): Promise { - return loadDocs() -} - -async function buildDocsDataset(): Promise { - const rawDocs = await getRawDocs() - return rawDocs.map((item) => normalizeResource(item as RawDocResource)).filter( - (item): item is DocResource => item !== null, - ) -} - -// 构建时数据集生成:优先使用本地 fallback 数据 -async function buildDocsDatasetForBuildTime(): Promise { - const rawDocs = await loadDocsForBuildTime() - return rawDocs.map((item) => normalizeResource(item as RawDocResource)).filter( - (item): item is DocResource => item !== null, - ) -} - -export async function getDocsDataset(): Promise { - return buildDocsDataset() -} - -export function clearDocsCache(): void { - // Intentionally left blank. Runtime fetches always return fresh data. -} - - -function slugifySegment(value: string): string { - const base = value - .toLowerCase() - .replace(/[^a-z0-9]+/g, '-') - .replace(/^-+|-+$/g, '') - return base || value.toLowerCase().replace(/\s+/g, '-') || 'doc' -} - -function humanizeSegment(value: string): string { - if (!value) return '' - const withSpaces = value - .replace(/[_-]+/g, ' ') - .replace(/([a-z0-9])([A-Z])/g, '$1 $2') - const normalized = withSpaces.replace(/\s+/g, ' ').trim() - if (!normalized) return value - return normalized - .split(' ') - .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) - .join(' ') -} - -function parseUpdatedAt(value?: string): number { - if (!value) return 0 - const ts = Date.parse(value) - return Number.isNaN(ts) ? 0 : ts -} - -interface CollectionAccumulator { - directory: string - slug: string - label: string - docs: DocResource[] -} - -function buildCollections(docs: DocResource[]): DocCollection[] { - const map = new Map() - const usedSlugs = new Set() - - const ensureUniqueSlug = (slug: string) => { - let candidate = slug || 'doc' - if (!usedSlugs.has(candidate)) { - usedSlugs.add(candidate) - return candidate - } - let counter = 2 - while (usedSlugs.has(`${candidate}-${counter}`)) { - counter += 1 - } - const unique = `${candidate}-${counter}` - usedSlugs.add(unique) - return unique - } - - for (const doc of docs) { - const directory = doc.collection ?? doc.pathSegments?.[0] ?? doc.category ?? doc.slug - if (!directory) { - continue - } - if (directory === 'all.json' || directory === 'dir.json') { - continue - } - - const slug = doc.collectionSlug ?? slugifySegment(directory) - const label = doc.collectionLabel ?? doc.category ?? humanizeSegment(directory) - const key = directory - const existing = map.get(key) - if (existing) { - existing.docs.push(doc) - continue - } - - map.set(key, { - directory, - slug: ensureUniqueSlug(slug), - label, - docs: [doc], - }) - } - - const collections: DocCollection[] = [] - for (const accumulator of map.values()) { - const docsSorted = [...accumulator.docs].sort((a, b) => parseUpdatedAt(b.updatedAt) - parseUpdatedAt(a.updatedAt)) - const primary = docsSorted[0] - if (!primary) { - continue - } - - const tagSet = new Set() - for (const doc of docsSorted) { - if (!doc.tags) continue - for (const tag of doc.tags) { - if (tag) tagSet.add(tag) - } - } - - const versionSlugSet = new Set() - const ensureUniqueVersionSlug = (slug: string) => { - let candidate = slug || 'version' - if (!versionSlugSet.has(candidate)) { - versionSlugSet.add(candidate) - return candidate - } - let counter = 2 - while (versionSlugSet.has(`${candidate}-${counter}`)) { - counter += 1 - } - const unique = `${candidate}-${counter}` - versionSlugSet.add(unique) - return unique - } - - const versions: DocVersionOption[] = docsSorted.map((doc) => { - const labelParts: string[] = [] - if (doc.version) { - labelParts.push(doc.version) - } - if (!doc.version && doc.variant) { - labelParts.push(doc.variant) - } - if (doc.language && !labelParts.includes(doc.language)) { - labelParts.push(doc.language) - } - const label = labelParts.length > 0 ? labelParts.join(' • ') : doc.title - let versionSlug = doc.versionSlug - if (!versionSlug || !versionSlug.trim()) { - const candidate = doc.variant ?? doc.version ?? doc.slug - versionSlug = slugifySegment(candidate) - } - versionSlug = ensureUniqueVersionSlug(versionSlug) - return { - id: doc.slug, - label, - resource: doc, - slug: versionSlug, - pathSegment: doc.pathSegments?.[1], - } - }) - - const collection: DocCollection = { - slug: accumulator.slug, - title: primary.title, - description: primary.description, - category: primary.category ?? accumulator.label, - updatedAt: primary.updatedAt, - estimatedMinutes: primary.estimatedMinutes, - tags: Array.from(tagSet).sort((a, b) => a.localeCompare(b)), - latestVersionLabel: versions[0]?.label, - latestVariant: primary.variant, - versions, - defaultVersionId: versions[0]?.id, - defaultVersionSlug: versions[0]?.slug, - directory: accumulator.directory, - } - - collections.push(collection) - } - - return collections.sort((a, b) => parseUpdatedAt(b.updatedAt) - parseUpdatedAt(a.updatedAt)) -} - -async function buildDocsCollections(dataset?: DocResource[]): Promise { - const docs = dataset ?? await getDocsDataset() - return buildCollections(docs) -} - -// 构建时集合生成:优先使用本地数据 -async function buildDocsCollectionsForBuildTime(): Promise { - const docs = await buildDocsDatasetForBuildTime() - return buildCollections(docs) -} - -export async function getDocCollections(): Promise { - return buildDocsCollections() -} - -// 构建时获取集合:优先使用本地数据,保证构建成功 -export async function getDocCollectionsForBuildTime(): Promise { - return buildDocsCollectionsForBuildTime() -} - -export function clearCollectionsCache(): void { - clearDocsCache() -} - -function normalizeResource(item: RawDocResource): DocResource | null { - if (!item || typeof item !== 'object') { - return null - } - - const slug = typeof item.slug === 'string' ? item.slug : undefined - const title = typeof item.title === 'string' ? item.title : undefined - if (!slug || !title) { - return null - } - - const resource: DocResource = { - slug, - title, - description: typeof item.description === 'string' ? item.description : '', - } - - if (typeof item.category === 'string' && item.category.trim()) { - resource.category = item.category - } - if (typeof item.version === 'string' && item.version.trim()) { - resource.version = item.version - } - if (typeof item.updatedAt === 'string' && item.updatedAt.trim()) { - resource.updatedAt = item.updatedAt - } - if (typeof item.pdfUrl === 'string' && item.pdfUrl.trim()) { - resource.pdfUrl = buildAbsoluteDocUrl(item.pdfUrl) ?? item.pdfUrl - } - if (typeof item.htmlUrl === 'string' && item.htmlUrl.trim()) { - resource.htmlUrl = buildAbsoluteDocUrl(item.htmlUrl) ?? item.htmlUrl - } - if (typeof item.language === 'string' && item.language.trim()) { - resource.language = item.language - } - if (typeof item.variant === 'string' && item.variant.trim()) { - resource.variant = item.variant - } - if (typeof item.versionSlug === 'string' && item.versionSlug.trim()) { - resource.versionSlug = item.versionSlug - } - if (typeof item.collection === 'string' && item.collection.trim()) { - resource.collection = item.collection - } - if (typeof item.collectionSlug === 'string' && item.collectionSlug.trim()) { - resource.collectionSlug = item.collectionSlug - } - if (typeof item.collectionLabel === 'string' && item.collectionLabel.trim()) { - resource.collectionLabel = item.collectionLabel - } - if (typeof item.estimatedMinutes === 'number' && !Number.isNaN(item.estimatedMinutes)) { - resource.estimatedMinutes = item.estimatedMinutes - } - if (typeof item.coverImage === 'string' && item.coverImage.trim()) { - resource.coverImage = item.coverImage - } - if (Array.isArray(item.tags)) { - const tags = item.tags.filter((tag): tag is string => typeof tag === 'string' && tag.trim().length > 0) - if (tags.length > 0) { - resource.tags = [...new Set(tags)] - } - } - if (Array.isArray(item.pathSegments)) { - const segments = item.pathSegments.filter((segment): segment is string => typeof segment === 'string' && segment.trim().length > 0) - if (segments.length > 0) { - resource.pathSegments = segments - } - } - - if (!resource.description.trim()) { - const context: string[] = [] - if (resource.category) { - context.push(resource.category) - } - if (resource.version) { - context.push(`edition ${resource.version}`) - } else if (resource.variant) { - context.push(`release ${resource.variant}`) - } - const formats: string[] = [] - if (resource.pdfUrl) formats.push('PDF') - if (resource.htmlUrl) formats.push('HTML') - if (formats.length > 0) { - context.push(`available as ${formats.join(' and ')}`) - } - const suffix = context.length > 0 ? ` (${context.join(', ')})` : '' - resource.description = `${resource.title}${suffix}.` - } - - return resource -} +import type { DocCollection } from './types' const isDocsModuleEnabled = () => isFeatureEnabled('appModules', '/docs') -export async function getDocResources(): Promise { +export const getDocCollections = cache(async (): Promise => { if (!isDocsModuleEnabled()) { return [] } + return loadDocCollections() +}) +export const getDocCollectionsForBuildTime = getDocCollections + +export async function getDocResources(): Promise { return getDocCollections() } @@ -407,3 +29,21 @@ export async function getDocResource(slug: string): Promise doc.slug === slug) } + +export async function getDocVersionParams() { + if (!isDocsModuleEnabled()) { + return [] + } + return getDocParams() +} + +export async function getDocVersion(slug: string, version: string) { + if (!isDocsModuleEnabled()) { + return undefined + } + const collection = await getDocCollection(slug) + if (!collection) return undefined + const versionMatch = collection.versions.find((item) => item.slug === version) + if (!versionMatch) return undefined + return { collection, version: versionMatch } +} diff --git a/src/app/docs/types.ts b/src/app/docs/types.ts index 39a27c5..b1581a5 100644 --- a/src/app/docs/types.ts +++ b/src/app/docs/types.ts @@ -1,44 +1,20 @@ -export interface DocResource { +export interface DocVersionOption { slug: string + label: string title: string description: string - category?: string - version?: string updatedAt?: string - pdfUrl?: string - htmlUrl?: string tags?: string[] - estimatedMinutes?: number - coverImage?: string - language?: string - variant?: string - versionSlug?: string - pathSegments?: string[] - collection?: string - collectionSlug?: string - collectionLabel?: string -} - -export interface DocVersionOption { - id: string - label: string - resource: DocResource - slug: string - pathSegment?: string + content: string + isMdx: boolean } export interface DocCollection { slug: string title: string description: string - category?: string updatedAt?: string - estimatedMinutes?: number tags: string[] - latestVersionLabel?: string - latestVariant?: string versions: DocVersionOption[] - defaultVersionId?: string - defaultVersionSlug?: string - directory?: string + defaultVersionSlug: string } diff --git a/src/app/workshop/[slug]/page.tsx b/src/app/workshop/[slug]/page.tsx new file mode 100644 index 0000000..597f56e --- /dev/null +++ b/src/app/workshop/[slug]/page.tsx @@ -0,0 +1,53 @@ +export const dynamic = 'error' +export const revalidate = false + +import { notFound } from 'next/navigation' +import type { Metadata } from 'next' + +import WorkshopArticle from '@/components/workshop/WorkshopArticle' +import { allWorkshops } from 'contentlayer/generated' + +export const generateStaticParams = async () => allWorkshops.map((workshop) => ({ slug: workshop.slug })) + +export async function generateMetadata({ + params, +}: { + params: { slug: string } +}): Promise { + const workshop = allWorkshops.find((entry) => entry.slug === params.slug) + if (!workshop) { + return { title: 'Workshop | Cloud-Neutral' } + } + return { + title: `${workshop.title} | Workshop`, + description: workshop.summary, + } +} + +export default function WorkshopDetailPage({ params }: { params: { slug: string } }) { + const workshop = allWorkshops.find((entry) => entry.slug === params.slug) + if (!workshop) { + notFound() + } + + return ( +
+
+
+

Workshop

+

{workshop.title}

+

{workshop.summary}

+
+ {workshop.level} + {workshop.duration && {workshop.duration}} + {workshop.updatedAt && Updated {workshop.updatedAt}} +
+
+ +
+ +
+
+
+ ) +} diff --git a/src/app/workshop/page.tsx b/src/app/workshop/page.tsx new file mode 100644 index 0000000..83ef9a5 --- /dev/null +++ b/src/app/workshop/page.tsx @@ -0,0 +1,47 @@ +import type { Metadata } from 'next' + +import WorkshopCard from '@/components/workshop/WorkshopCard' +import { allWorkshops } from 'contentlayer/generated' + +export const dynamic = 'error' +export const revalidate = false + +export const metadata: Metadata = { + title: 'Workshops | Cloud-Neutral', + description: 'Hands-on, short-lived experiments built with MDX and Contentlayer.', +} + +export default function WorkshopIndexPage() { + const workshops = [...allWorkshops].sort((a, b) => { + const aDate = a.updatedAt ? Date.parse(a.updatedAt) : 0 + const bDate = b.updatedAt ? Date.parse(b.updatedAt) : 0 + if (aDate && bDate && aDate !== bDate) return bDate - aDate + return a.title.localeCompare(b.title) + }) + + return ( +
+
+
+

Workshop

+

Interactive Workflows

+

+ Short-lived, high-interaction guides compiled with Contentlayer. Experiment with toggles and demos without changing the core UI. +

+
+ + {workshops.length === 0 ? ( +
+ Workshops will appear here once content is published. +
+ ) : ( +
+ {workshops.map((workshop) => ( + + ))} +
+ )} +
+
+ ) +} diff --git a/src/components/blog/BlogList.tsx b/src/components/blog/BlogList.tsx new file mode 100644 index 0000000..720c769 --- /dev/null +++ b/src/components/blog/BlogList.tsx @@ -0,0 +1,240 @@ +'use client' + +import { useMemo } from 'react' +import Link from 'next/link' +import { useSearchParams } from 'next/navigation' + +import SearchComponent from '@components/search' +import type { BlogPost } from '@lib/blogContent' + +const CATEGORY_TABS: { key: string; label: string }[] = [ + { key: 'infra-cloud', label: 'Infra & Cloud' }, + { key: 'observability', label: 'Observability' }, + { key: 'identity', label: 'ID & Security' }, + { key: 'iac-devops', label: 'IaC & DevOps' }, + { key: 'data-ai', label: 'Data & AI' }, + { key: 'insight', label: '资讯' }, + { key: 'essays', label: '随笔&观察' }, +] + +function formatDate(dateStr: string | undefined, language: 'zh' | 'en'): string { + if (!dateStr) return '' + + const date = new Date(dateStr) + + if (language === 'zh') { + return date.toLocaleDateString('zh-CN', { + year: 'numeric', + month: 'long', + day: 'numeric', + }) + } + + return date.toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric', + }) +} + +interface BlogListProps { + posts: BlogPost[] +} + +function buildCategoryCounts(posts: BlogPost[]) { + return posts.reduce>((acc, post) => { + const categoryKey = post.category?.key + if (!categoryKey) return acc + acc[categoryKey] = (acc[categoryKey] || 0) + 1 + return acc + }, {}) +} + +export default function BlogList({ posts }: BlogListProps) { + const searchParams = useSearchParams() + const selectedCategory = searchParams.get('category') + const page = searchParams.get('page') + + const categoryCounts = useMemo(() => buildCategoryCounts(posts), [posts]) + const filteredPosts = useMemo(() => { + if (!selectedCategory) return posts + return posts.filter((post) => post.category?.key === selectedCategory) + }, [posts, selectedCategory]) + + const postsPerPage = 10 + const currentPage = useMemo(() => { + const parsed = Number(page || '1') + if (!Number.isFinite(parsed) || parsed < 1) return 1 + const totalPages = Math.max(1, Math.ceil(filteredPosts.length / postsPerPage)) + return Math.min(parsed, totalPages) + }, [page, filteredPosts.length]) + const totalPages = Math.max(1, Math.ceil(filteredPosts.length / postsPerPage)) + const startIndex = (currentPage - 1) * postsPerPage + const endIndex = startIndex + postsPerPage + const paginatedPosts = filteredPosts.slice(startIndex, endIndex) + + return ( +
+
+
+ + SVC.plus + / + blog + +
+ +
+
+
+ +
+
+
+

Blog

+

+ Latest updates, releases, and insights from the Cloud-Neutral community. +

+
+ +
+ {CATEGORY_TABS.map((tab) => { + const isActive = tab.key === selectedCategory + const labelWithCount = categoryCounts[tab.key] + + return ( + + {tab.label} + {labelWithCount ? ( + + {labelWithCount} + + ) : null} + + ) + })} + + 全部 + + {posts.length} + + +
+ + {filteredPosts.length === 0 ? ( +
+

暂无博客文章

+
+ ) : ( + <> +
+ {paginatedPosts.map((post) => ( +
+
+ Blog + {post.date && } +
+

{post.title}

+ {post.author &&

By {post.author}

} +

{post.excerpt}

+
+ {post.tags && post.tags.length > 0 && ( +
+ {post.tags.map((tag) => ( + + {tag} + + ))} +
+ )} + + Read more → + +
+
+ ))} +
+ + {totalPages > 1 && ( + + )} + + )} +
+
+
+ ) +} diff --git a/src/components/doc/DocArticle.tsx b/src/components/doc/DocArticle.tsx new file mode 100644 index 0000000..c34b4c4 --- /dev/null +++ b/src/components/doc/DocArticle.tsx @@ -0,0 +1,24 @@ +import { compileMDX } from 'next-mdx-remote/rsc' + +import DocCallout from './DocCallout' +import DocSteps from './DocSteps' + +interface DocArticleProps { + content: string +} + +export default async function DocArticle({ content }: DocArticleProps) { + const mdx = await compileMDX({ + source: content, + components: { + Callout: DocCallout, + Steps: DocSteps, + }, + }) + + return ( +
+ {mdx.content} +
+ ) +} diff --git a/src/components/doc/DocCallout.tsx b/src/components/doc/DocCallout.tsx new file mode 100644 index 0000000..8d445ad --- /dev/null +++ b/src/components/doc/DocCallout.tsx @@ -0,0 +1,22 @@ +import React from 'react' + +interface DocCalloutProps { + title?: string + children: React.ReactNode + tone?: 'info' | 'warning' | 'success' +} + +const toneStyles: Record, string> = { + info: 'border-blue-200 bg-blue-50 text-blue-800', + warning: 'border-amber-200 bg-amber-50 text-amber-800', + success: 'border-emerald-200 bg-emerald-50 text-emerald-800', +} + +export default function DocCallout({ title, children, tone = 'info' }: DocCalloutProps) { + return ( +
+ {title &&

{title}

} +
{children}
+
+ ) +} diff --git a/src/components/doc/DocMetaPanel.tsx b/src/components/doc/DocMetaPanel.tsx new file mode 100644 index 0000000..bec7fb4 --- /dev/null +++ b/src/components/doc/DocMetaPanel.tsx @@ -0,0 +1,29 @@ +import ClientTime from '@/app/components/ClientTime' + +interface DocMetaPanelProps { + description?: string + updatedAt?: string + tags?: string[] +} + +export default function DocMetaPanel({ description, updatedAt, tags }: DocMetaPanelProps) { + return ( +
+ {description &&

{description}

} + {tags && tags.length > 0 && ( +
+ {tags.map((tag) => ( + + {tag} + + ))} +
+ )} + {updatedAt && ( +

+ Updated +

+ )} +
+ ) +} diff --git a/src/components/doc/DocSteps.tsx b/src/components/doc/DocSteps.tsx new file mode 100644 index 0000000..587e9a4 --- /dev/null +++ b/src/components/doc/DocSteps.tsx @@ -0,0 +1,15 @@ +import React from 'react' + +interface DocStepsProps { + title?: string + children: React.ReactNode +} + +export default function DocSteps({ title, children }: DocStepsProps) { + return ( +
+ {title &&

{title}

} +
    {children}
+
+ ) +} diff --git a/src/components/doc/DocVersionSwitcher.tsx b/src/components/doc/DocVersionSwitcher.tsx new file mode 100644 index 0000000..dde0893 --- /dev/null +++ b/src/components/doc/DocVersionSwitcher.tsx @@ -0,0 +1,33 @@ +'use client' + +import { useRouter } from 'next/navigation' + +interface DocVersionSwitcherProps { + collectionSlug: string + versions: { slug: string; label: string }[] + activeSlug: string +} + +export default function DocVersionSwitcher({ collectionSlug, versions, activeSlug }: DocVersionSwitcherProps) { + const router = useRouter() + + return ( + + ) +} diff --git a/src/components/workshop/WorkshopArticle.tsx b/src/components/workshop/WorkshopArticle.tsx new file mode 100644 index 0000000..fff5b35 --- /dev/null +++ b/src/components/workshop/WorkshopArticle.tsx @@ -0,0 +1,18 @@ +'use client' + +import { useMDXComponent } from 'next-contentlayer/hooks' + +import WorkshopDemo from './WorkshopDemo' + +interface WorkshopArticleProps { + code: string +} + +export default function WorkshopArticle({ code }: WorkshopArticleProps) { + const MDXContent = useMDXComponent(code) + return ( +
+ +
+ ) +} diff --git a/src/components/workshop/WorkshopCard.tsx b/src/components/workshop/WorkshopCard.tsx new file mode 100644 index 0000000..0eadb9d --- /dev/null +++ b/src/components/workshop/WorkshopCard.tsx @@ -0,0 +1,40 @@ +import Link from 'next/link' + +import type { Workshop } from 'contentlayer/generated' + +interface WorkshopCardProps { + workshop: Workshop +} + +export default function WorkshopCard({ workshop }: WorkshopCardProps) { + return ( +
+
+

Workshop

+

{workshop.title}

+

{workshop.summary}

+ {workshop.tags?.length ? ( +
+ {workshop.tags.map((tag) => ( + + {tag} + + ))} +
+ ) : null} +
+
+
+ {workshop.level} + {workshop.duration && {workshop.duration}} +
+ + View + +
+
+ ) +} diff --git a/src/components/workshop/WorkshopDemo.tsx b/src/components/workshop/WorkshopDemo.tsx new file mode 100644 index 0000000..f1697d2 --- /dev/null +++ b/src/components/workshop/WorkshopDemo.tsx @@ -0,0 +1,51 @@ +'use client' + +import { useState } from 'react' + +export default function WorkshopDemo() { + const [environment, setEnvironment] = useState<'staging' | 'production'>('staging') + const [enabled, setEnabled] = useState(false) + + return ( +
+
+
+

Live Toggle

+

Switch environments to preview workshop actions.

+
+ +
+
+ {(['staging', 'production'] as const).map((item) => { + const isActive = environment === item + return ( + + ) + })} +
+
+

+ {enabled ? 'Automation ready' : 'Preview mode'} · {environment} +

+

Stateful interactions stay inside workshop scope.

+
+
+ ) +} diff --git a/src/content/doc/observability/overview.md b/src/content/doc/observability/overview.md new file mode 100644 index 0000000..45b53ea --- /dev/null +++ b/src/content/doc/observability/overview.md @@ -0,0 +1,29 @@ +--- +title: Observability Baseline +description: Establish a consistent telemetry surface before onboarding workloads. +updatedAt: 2024-11-05 +tags: + - tracing + - metrics + - dashboards +collection: observability +collectionLabel: Observability +version: "2024 Q4" +versionSlug: overview +--- + +## Why this matters + +Reliable dashboards and alerts depend on predictable signals. This baseline locks in a minimal telemetry contract so new services inherit the same trace attributes, metric names, and log keys. + +### Core checklist + +- Emit request, dependency, and queue spans with shared trace IDs. +- Forward deployment, region, and tenant labels with every metric. +- Normalize structured logs with `severity`, `service`, and `component` fields. + +### Rollout tips + +1. Start with staging namespaces and mirror traffic where possible. +2. Validate alerts on canary services before expanding coverage. +3. Keep a changelog in the runbook so teams can replay the rollout. diff --git a/src/content/doc/observability/zero-downtime.mdx b/src/content/doc/observability/zero-downtime.mdx new file mode 100644 index 0000000..c050692 --- /dev/null +++ b/src/content/doc/observability/zero-downtime.mdx @@ -0,0 +1,25 @@ +--- +title: Zero Downtime Dashboards +description: Use shadow pipelines to publish dashboards without interrupting operators. +updatedAt: 2024-12-12 +tags: + - dashboards + - releases +collection: observability +collectionLabel: Observability +version: Preview +versionSlug: zero-downtime +format: mdx +--- + + +Always keep the stable dashboard folder intact. Publish experimental panels into a shadow folder first. + + + +
  • Create a new folder such as `dashboards/shadow` and sync it to staging only.
  • +
  • Attach the same data sources as production but pin to canary namespaces.
  • +
  • After validation, promote the folder and archive the previous release.
  • +
    + +Teams can safely add complex visualizations without losing historical parity. The same pattern works for alert rule experiments. diff --git a/src/content/workshop/fast-feedback-loops.mdx b/src/content/workshop/fast-feedback-loops.mdx new file mode 100644 index 0000000..4647fad --- /dev/null +++ b/src/content/workshop/fast-feedback-loops.mdx @@ -0,0 +1,25 @@ +--- +title: Fast Feedback Loops +summary: Prototype change workflows with interactive toggles before wiring production automation. +level: Intermediate +duration: 25 min +tags: + - gitops + - automation + - rollout +updatedAt: 2024-12-01 +--- + +Live demos in this workshop stay close to how engineers actually deploy. Toggle environments, flip feature states, and observe how the rollout recipe responds in real time. + +## What you will build + +- A staged toggle flow that mirrors your GitOps pipelines. +- A small guardrail to ensure approvals stay attached to risky rollouts. +- A preview card that highlights the blast radius of each action. + +## Try it now + + + +Because the MDX runs through Contentlayer, interactive components compile at build time while preserving state on the client. diff --git a/src/lib/blogContent.ts b/src/lib/blogContent.ts new file mode 100644 index 0000000..bd1bb00 --- /dev/null +++ b/src/lib/blogContent.ts @@ -0,0 +1,144 @@ +import { cache } from 'react' + +import { readMdxDirectory, readMdxFile } from './mdx' +import { resolveBlogContentRoot } from './marketingContent' + +export interface BlogPost { + slug: string + title: string + author?: string + date?: string + tags: string[] + excerpt: string + content: string + category?: { + key: string + label: string + } +} + +const BLOG_EXTENSIONS = ['.md', '.mdx'] + +const CATEGORY_MAP: { key: string; label: string; match: (segments: string[]) => boolean }[] = [ + { key: 'infra-cloud', label: 'Infra & Cloud', match: (segments) => segments[0] === '04-infra-platform' }, + { key: 'observability', label: 'Observability', match: (segments) => segments[0] === '03-observability' }, + { key: 'identity', label: 'ID & Security', match: (segments) => segments[0] === '01-id-security' }, + { key: 'iac-devops', label: 'IaC & DevOps', match: (segments) => segments[0] === '02-iac-devops' }, + { key: 'data-ai', label: 'Data & AI', match: (segments) => segments[0] === '05-data-ai' }, + { + key: 'insight', + label: '资讯', + match: (segments) => segments[0] === '00-global' && (!segments[1] || segments[1] === 'news' || segments[1] === 'workshops'), + }, + { + key: 'essays', + label: '随笔&观察', + match: (segments) => segments[0] === '00-global' && segments[1] === 'essays', + }, +] + +const readBlogFiles = cache(async () => + readMdxDirectory('', { + baseDir: resolveBlogContentRoot(), + recursive: true, + extensions: BLOG_EXTENSIONS, + }), +) + +function resolveCategory(slug: string): { key: string; label: string } | undefined { + const segments = slug.split('/') + const matched = CATEGORY_MAP.find((category) => category.match(segments)) + + return matched ? { key: matched.key, label: matched.label } : undefined +} + +function buildExcerpt(markdown: string): string { + const cleaned = markdown + .replace(/^\s*import\s+.*$/gm, '') + .replace(/^\s*export\s+const\s+.*$/gm, '') + .trim() + + const blocks = cleaned.split(/\r?\n\s*\r?\n/) + for (const block of blocks) { + const trimmed = block.trim() + if (!trimmed) continue + const withoutFormatting = trimmed + .replace(/^#+\s*/g, '') + .replace(/[`*_>\[\]]/g, '') + .replace(/\[(.*?)\]\((.*?)\)/g, '$1') + if (withoutFormatting.trim()) { + return withoutFormatting.trim() + } + } + return '' +} + +function normalizePost(file: Awaited>[number]): BlogPost { + const title = typeof file.metadata.title === 'string' ? file.metadata.title : file.slug + const author = typeof file.metadata.author === 'string' ? file.metadata.author : undefined + const date = typeof file.metadata.date === 'string' ? file.metadata.date : undefined + const tags = Array.isArray(file.metadata.tags) + ? file.metadata.tags.filter((tag): tag is string => typeof tag === 'string') + : [] + const excerpt = typeof file.metadata.excerpt === 'string' ? file.metadata.excerpt : buildExcerpt(file.content) + const categoryKey = typeof file.metadata.category === 'string' ? file.metadata.category : undefined + const categoryLabel = typeof file.metadata.categoryLabel === 'string' ? file.metadata.categoryLabel : categoryKey + const category = + categoryKey && categoryLabel + ? { key: categoryKey, label: categoryLabel } + : resolveCategory(file.slug) + + return { + slug: file.slug, + title, + author, + date, + tags, + excerpt, + content: file.content, + category, + } +} + +export const getBlogPosts = cache(async (): Promise => { + try { + const files = await readBlogFiles() + const posts = files.map(normalizePost) + + return posts + .map((post) => ({ + ...post, + dateValue: post.date ? new Date(post.date) : undefined, + })) + .sort((a, b) => { + if (a.dateValue && b.dateValue) { + return b.dateValue.getTime() - a.dateValue.getTime() + } + if (a.dateValue) return -1 + if (b.dateValue) return 1 + return a.title.localeCompare(b.title) + }) + .map(({ dateValue: _dateValue, ...post }) => post) + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { + throw error + } + return [] + } +}) + +export async function getBlogPostBySlug(slug: string): Promise { + const posts = await getBlogPosts() + return posts.find((post) => post.slug === slug) +} + +export async function getBlogSlugs(): Promise { + const posts = await getBlogPosts() + return posts.map((post) => post.slug) +} + +export async function loadBlogContent(slug: string): Promise { + const contentRoot = resolveBlogContentRoot() + const file = await readMdxFile(slug, { baseDir: contentRoot, extensions: BLOG_EXTENSIONS }) + return file.content +} diff --git a/src/lib/docContent.ts b/src/lib/docContent.ts new file mode 100644 index 0000000..cb8216b --- /dev/null +++ b/src/lib/docContent.ts @@ -0,0 +1,202 @@ +import path from 'path' +import { cache } from 'react' + +import { readMdxDirectory } from './mdx' + +export interface DocVersion { + slug: string + label: string + title: string + description: string + updatedAt?: string + tags: string[] + content: string + isMdx: boolean +} + +export interface DocCollection { + slug: string + title: string + description: string + updatedAt?: string + tags: string[] + versions: DocVersion[] + defaultVersionSlug: string + category?: string +} + +const DOC_CONTENT_ROOT = path.join(process.cwd(), 'src', 'content', 'doc') +const DOC_EXTENSIONS = ['.md', '.mdx'] + +const readDocFiles = cache(async () => + readMdxDirectory('', { + baseDir: DOC_CONTENT_ROOT, + recursive: true, + extensions: DOC_EXTENSIONS, + }), +) + +function humanize(value: string) { + return value + .replace(/[-_]+/g, ' ') + .split(' ') + .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) + .join(' ') +} + +function buildExcerpt(markdown: string): string { + const cleaned = markdown + .replace(/^\s*import\s+.*$/gm, '') + .replace(/^\s*export\s+const\s+.*$/gm, '') + .trim() + + const blocks = cleaned.split(/\r?\n\s*\r?\n/) + for (const block of blocks) { + const trimmed = block.trim() + if (!trimmed) continue + const withoutFormatting = trimmed + .replace(/^#+\s*/g, '') + .replace(/[`*_>\[\]]/g, '') + .replace(/\[(.*?)\]\((.*?)\)/g, '$1') + if (withoutFormatting.trim()) { + return withoutFormatting.trim() + } + } + return '' +} + +function normalizeDoc(file: Awaited>[number]): DocVersion & { + collection: string + collectionLabel: string +} { + const segments = file.slug.split('/') + const collection = typeof file.metadata.collection === 'string' ? file.metadata.collection : segments[0] || 'docs' + const collectionLabel = + typeof file.metadata.collectionLabel === 'string' + ? file.metadata.collectionLabel + : humanize(collection) + + const versionSlug = typeof file.metadata.versionSlug === 'string' ? file.metadata.versionSlug : segments.at(-1) ?? 'latest' + const label = typeof file.metadata.version === 'string' ? file.metadata.version : versionSlug + const title = typeof file.metadata.title === 'string' ? file.metadata.title : label + const description = + typeof file.metadata.description === 'string' ? file.metadata.description : buildExcerpt(file.content) + const updatedAt = typeof file.metadata.updatedAt === 'string' ? file.metadata.updatedAt : undefined + const tags = Array.isArray(file.metadata.tags) + ? file.metadata.tags.filter((tag): tag is string => typeof tag === 'string' && tag.trim().length > 0) + : [] + const isMdx = String(file.metadata.format || '').toLowerCase() === 'mdx' + + return { + slug: versionSlug, + label, + title, + description, + updatedAt, + tags, + content: file.content, + isMdx, + collection, + collectionLabel, + } +} + +export const getDocCollections = cache(async (): Promise => { + try { + const files = await readDocFiles() + const docs = files.map(normalizeDoc) + + const collections = new Map< + string, + { + collectionLabel: string + versions: DocVersion[] + } + >() + + for (const doc of docs) { + const existing = collections.get(doc.collection) + const version: DocVersion = { + slug: doc.slug, + label: doc.label, + title: doc.title, + description: doc.description, + updatedAt: doc.updatedAt, + tags: doc.tags, + content: doc.content, + isMdx: doc.isMdx, + } + + if (existing) { + existing.versions.push(version) + continue + } + collections.set(doc.collection, { + collectionLabel: doc.collectionLabel, + versions: [version], + }) + } + + const result: DocCollection[] = [] + for (const [slug, data] of collections.entries()) { + const versions = [...data.versions].sort((a, b) => { + const aDate = a.updatedAt ? Date.parse(a.updatedAt) : 0 + const bDate = b.updatedAt ? Date.parse(b.updatedAt) : 0 + if (aDate && bDate && aDate !== bDate) { + return bDate - aDate + } + return a.title.localeCompare(b.title) + }) + + const primary = versions[0] + if (!primary) continue + + result.push({ + slug, + title: data.collectionLabel, + description: primary.description, + updatedAt: primary.updatedAt, + tags: versions.flatMap((item) => item.tags ?? []), + versions, + defaultVersionSlug: primary.slug, + }) + } + + return result.sort((a, b) => { + const aDate = a.updatedAt ? Date.parse(a.updatedAt) : 0 + const bDate = b.updatedAt ? Date.parse(b.updatedAt) : 0 + if (aDate && bDate && aDate !== bDate) { + return bDate - aDate + } + return a.title.localeCompare(b.title) + }) + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { + throw error + } + return [] + } +}) + +export async function getDocCollection(slug: string): Promise { + const collections = await getDocCollections() + return collections.find((collection) => collection.slug === slug) +} + +export async function getDocVersion( + collectionSlug: string, + versionSlug: string, +): Promise<{ collection: DocCollection; version: DocVersion } | undefined> { + const collection = await getDocCollection(collectionSlug) + if (!collection) return undefined + const version = collection.versions.find((item) => item.slug === versionSlug) + if (!version) return undefined + return { collection, version } +} + +export async function getDocParams() { + const collections = await getDocCollections() + return collections.flatMap((collection) => + collection.versions.map((version) => ({ collection: collection.slug, version: version.slug })), + ) +} diff --git a/yarn.lock b/yarn.lock index 3cc065c..e6132cb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -726,7 +726,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.12.5": +"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.16.3": version: 7.28.4 resolution: "@babel/runtime@npm:7.28.4" checksum: 10/6c9a70452322ea80b3c9b2a412bcf60771819213a67576c8cec41e88a95bb7bf01fc983754cda35dc19603eef52df22203ccbf7777b9d6316932f9fb77c25163 @@ -782,6 +782,120 @@ __metadata: languageName: node linkType: hard +"@contentlayer/cli@npm:0.3.4": + version: 0.3.4 + resolution: "@contentlayer/cli@npm:0.3.4" + dependencies: + "@contentlayer/core": "npm:0.3.4" + "@contentlayer/utils": "npm:0.3.4" + clipanion: "npm:^3.2.1" + typanion: "npm:^3.12.1" + checksum: 10/af4abb096d4ee4b9bbdd53ffa767d662c19cf960fceabe4085d3f3328269f764159750a6004e0a791163ea280223185fb3912be9833cc8484f01b16808fe9af8 + languageName: node + linkType: hard + +"@contentlayer/client@npm:0.3.4": + version: 0.3.4 + resolution: "@contentlayer/client@npm:0.3.4" + dependencies: + "@contentlayer/core": "npm:0.3.4" + checksum: 10/5ceeabcf5abc37aef582de531f7ddac4ebce0636a3768a3371e865e0c8ef02d3b946e199bcc84be64decee243acc7329539c2b447ef68c39e4c1f961d9a19cf4 + languageName: node + linkType: hard + +"@contentlayer/core@npm:0.3.4": + version: 0.3.4 + resolution: "@contentlayer/core@npm:0.3.4" + dependencies: + "@contentlayer/utils": "npm:0.3.4" + camel-case: "npm:^4.1.2" + comment-json: "npm:^4.2.3" + esbuild: "npm:0.17.x || 0.18.x" + gray-matter: "npm:^4.0.3" + mdx-bundler: "npm:^9.2.1" + rehype-stringify: "npm:^9.0.3" + remark-frontmatter: "npm:^4.0.1" + remark-parse: "npm:^10.0.2" + remark-rehype: "npm:^10.1.0" + source-map-support: "npm:^0.5.21" + type-fest: "npm:^3.12.0" + unified: "npm:^10.1.2" + peerDependencies: + esbuild: 0.17.x || 0.18.x + markdown-wasm: 1.x + peerDependenciesMeta: + esbuild: + optional: true + markdown-wasm: + optional: true + checksum: 10/265c712c3046e472d1ac5425bd5246467a94bbbd908d52b9119f9bb49df6e51da874edf11522dd02a1ebf961ef92158256726996feaeb67ba522cfe183e63d74 + languageName: node + linkType: hard + +"@contentlayer/source-files@npm:0.3.4": + version: 0.3.4 + resolution: "@contentlayer/source-files@npm:0.3.4" + dependencies: + "@contentlayer/core": "npm:0.3.4" + "@contentlayer/utils": "npm:0.3.4" + chokidar: "npm:^3.5.3" + fast-glob: "npm:^3.2.12" + gray-matter: "npm:^4.0.3" + imagescript: "npm:^1.2.16" + micromatch: "npm:^4.0.5" + ts-pattern: "npm:^4.3.0" + unified: "npm:^10.1.2" + yaml: "npm:^2.3.1" + zod: "npm:^3.21.4" + checksum: 10/a6f7b897354b32831bf46c610e43a4dd6049ba4520831d54d3d241fead4154a4b05d05a15485139b3cfffb4bbed7a5dcdf72fa074aabb5f0b24d33f8f073e6ff + languageName: node + linkType: hard + +"@contentlayer/source-remote-files@npm:0.3.4": + version: 0.3.4 + resolution: "@contentlayer/source-remote-files@npm:0.3.4" + dependencies: + "@contentlayer/core": "npm:0.3.4" + "@contentlayer/source-files": "npm:0.3.4" + "@contentlayer/utils": "npm:0.3.4" + checksum: 10/88ea1aeba765a910d34edd39274726e1baa8235fcad918dfdb8139f3f08a75a68aca07898e8827b132680867605070ad3ba84fbd5d9c6db1e05f926b11354cc4 + languageName: node + linkType: hard + +"@contentlayer/utils@npm:0.3.4": + version: 0.3.4 + resolution: "@contentlayer/utils@npm:0.3.4" + dependencies: + "@effect-ts/core": "npm:^0.60.5" + "@effect-ts/otel": "npm:^0.15.1" + "@effect-ts/otel-exporter-trace-otlp-grpc": "npm:^0.15.1" + "@effect-ts/otel-sdk-trace-node": "npm:^0.15.1" + "@js-temporal/polyfill": "npm:^0.4.4" + "@opentelemetry/api": "npm:^1.4.1" + "@opentelemetry/core": "npm:^1.13.0" + "@opentelemetry/exporter-trace-otlp-grpc": "npm:^0.39.1" + "@opentelemetry/resources": "npm:^1.13.0" + "@opentelemetry/sdk-trace-base": "npm:^1.13.0" + "@opentelemetry/sdk-trace-node": "npm:^1.13.0" + "@opentelemetry/semantic-conventions": "npm:^1.13.0" + chokidar: "npm:^3.5.3" + hash-wasm: "npm:^4.9.0" + inflection: "npm:^2.0.1" + memfs: "npm:^3.5.1" + oo-ascii-tree: "npm:^1.84.0" + ts-pattern: "npm:^4.3.0" + type-fest: "npm:^3.12.0" + peerDependenciesMeta: + "@effect-ts/core": + optional: true + "@effect-ts/otel": + optional: true + "@effect-ts/otel-node": + optional: true + checksum: 10/9d668ee2feee45db4fadd8cb4f0f90e2e9ecd80ee874404973a1a6e6bd99c05e24987f089afc604cef9f3bf579bad06d5681be86532b9209cc146c7a305c963a + languageName: node + linkType: hard + "@csstools/color-helpers@npm:^5.1.0": version: 5.1.0 resolution: "@csstools/color-helpers@npm:5.1.0" @@ -828,6 +942,64 @@ __metadata: languageName: node linkType: hard +"@effect-ts/core@npm:^0.60.5": + version: 0.60.5 + resolution: "@effect-ts/core@npm:0.60.5" + dependencies: + "@effect-ts/system": "npm:^0.57.5" + checksum: 10/9b6a33a3613e666a32143a7efad17cddb3f80156d40d298a7516d873eb708134a81398b89c00e3f9c5bdb6e1a0ac6f2f5d368d81a40ce830574df155c92d7dc4 + languageName: node + linkType: hard + +"@effect-ts/otel-exporter-trace-otlp-grpc@npm:^0.15.1": + version: 0.15.1 + resolution: "@effect-ts/otel-exporter-trace-otlp-grpc@npm:0.15.1" + dependencies: + "@effect-ts/otel": "npm:^0.15.1" + peerDependencies: + "@effect-ts/core": ^0.60.2 + "@opentelemetry/api": ^1.4.0 + "@opentelemetry/core": ^1.13.0 + "@opentelemetry/exporter-trace-otlp-grpc": ^0.39.0 + "@opentelemetry/sdk-trace-base": ^1.13.0 + checksum: 10/5f81693c725f9bdf515374752437c0d20d65b123ca2235ba9cedf477308e43c115edb8b8b4934e19d8e89f52307d5001efe6299e4ca43734459fc37aab9bad30 + languageName: node + linkType: hard + +"@effect-ts/otel-sdk-trace-node@npm:^0.15.1": + version: 0.15.1 + resolution: "@effect-ts/otel-sdk-trace-node@npm:0.15.1" + dependencies: + "@effect-ts/otel": "npm:^0.15.1" + peerDependencies: + "@effect-ts/core": ^0.60.2 + "@opentelemetry/api": ^1.4.0 + "@opentelemetry/core": ^1.13.0 + "@opentelemetry/sdk-trace-base": ^1.13.0 + "@opentelemetry/sdk-trace-node": ^1.13.0 + checksum: 10/70a5ba0ced3d15a4d66bb49f914822d1e1e9f4028da2cb64fa9d27d2596ab3ed59b2d889d0fedd87383749861f8dcf72b993a543150f4a5c8b24faa93350dc39 + languageName: node + linkType: hard + +"@effect-ts/otel@npm:^0.15.1": + version: 0.15.1 + resolution: "@effect-ts/otel@npm:0.15.1" + peerDependencies: + "@effect-ts/core": ^0.60.2 + "@opentelemetry/api": ^1.4.0 + "@opentelemetry/core": ^1.13.0 + "@opentelemetry/sdk-trace-base": ^1.13.0 + checksum: 10/1e74fbf98313780a8a1a9c8ee36528d6dfc6c49e5f5b0bded2406cffd13af29f55e3a4a097766bb2390350a2e4f7e41c6eece8016e9f910e84ac847bd05764a0 + languageName: node + linkType: hard + +"@effect-ts/system@npm:^0.57.5": + version: 0.57.5 + resolution: "@effect-ts/system@npm:0.57.5" + checksum: 10/d553572328dce96def5a24b4d611a180a9c8466aaf6baef8e8da5f7affc37d1e93a68d5b6e6483874c46ac2cf4d86015bdf185c07d357c7125fbc0c12fe113e4 + languageName: node + linkType: hard + "@emnapi/core@npm:^1.4.3": version: 1.7.1 resolution: "@emnapi/core@npm:1.7.1" @@ -856,6 +1028,20 @@ __metadata: languageName: node linkType: hard +"@esbuild-plugins/node-resolve@npm:^0.1.4": + version: 0.1.4 + resolution: "@esbuild-plugins/node-resolve@npm:0.1.4" + dependencies: + "@types/resolve": "npm:^1.17.1" + debug: "npm:^4.3.1" + escape-string-regexp: "npm:^4.0.0" + resolve: "npm:^1.19.0" + peerDependencies: + esbuild: "*" + checksum: 10/d4d9096a204041f04d24a0a7310805479edd3e7d09708dde8d449e6d39b5c06c2bf244bd6c42780f9e250fcb53b9f98774a786b066ddbb602b199d2421c32957 + languageName: node + linkType: hard + "@esbuild/aix-ppc64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/aix-ppc64@npm:0.25.12" @@ -870,6 +1056,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/android-arm64@npm:0.18.20" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/android-arm64@npm:0.25.12" @@ -884,6 +1077,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/android-arm@npm:0.18.20" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/android-arm@npm:0.25.12" @@ -898,6 +1098,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/android-x64@npm:0.18.20" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/android-x64@npm:0.25.12" @@ -912,6 +1119,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/darwin-arm64@npm:0.18.20" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/darwin-arm64@npm:0.25.12" @@ -926,6 +1140,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/darwin-x64@npm:0.18.20" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/darwin-x64@npm:0.25.12" @@ -940,6 +1161,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/freebsd-arm64@npm:0.18.20" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/freebsd-arm64@npm:0.25.12" @@ -954,6 +1182,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/freebsd-x64@npm:0.18.20" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/freebsd-x64@npm:0.25.12" @@ -968,6 +1203,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/linux-arm64@npm:0.18.20" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-arm64@npm:0.25.12" @@ -982,6 +1224,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/linux-arm@npm:0.18.20" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-arm@npm:0.25.12" @@ -996,6 +1245,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/linux-ia32@npm:0.18.20" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-ia32@npm:0.25.12" @@ -1010,6 +1266,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/linux-loong64@npm:0.18.20" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-loong64@npm:0.25.12" @@ -1024,6 +1287,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/linux-mips64el@npm:0.18.20" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-mips64el@npm:0.25.12" @@ -1038,6 +1308,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/linux-ppc64@npm:0.18.20" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-ppc64@npm:0.25.12" @@ -1052,6 +1329,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/linux-riscv64@npm:0.18.20" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-riscv64@npm:0.25.12" @@ -1066,6 +1350,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/linux-s390x@npm:0.18.20" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-s390x@npm:0.25.12" @@ -1080,6 +1371,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/linux-x64@npm:0.18.20" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/linux-x64@npm:0.25.12" @@ -1108,6 +1406,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/netbsd-x64@npm:0.18.20" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/netbsd-x64@npm:0.25.12" @@ -1136,6 +1441,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/openbsd-x64@npm:0.18.20" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/openbsd-x64@npm:0.25.12" @@ -1164,6 +1476,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/sunos-x64@npm:0.18.20" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/sunos-x64@npm:0.25.12" @@ -1178,6 +1497,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/win32-arm64@npm:0.18.20" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/win32-arm64@npm:0.25.12" @@ -1192,6 +1518,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/win32-ia32@npm:0.18.20" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/win32-ia32@npm:0.25.12" @@ -1206,6 +1539,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.18.20": + version: 0.18.20 + resolution: "@esbuild/win32-x64@npm:0.18.20" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.25.12": version: 0.25.12 resolution: "@esbuild/win32-x64@npm:0.25.12" @@ -1262,6 +1602,13 @@ __metadata: languageName: node linkType: hard +"@fal-works/esbuild-plugin-global-externals@npm:^2.1.2": + version: 2.1.2 + resolution: "@fal-works/esbuild-plugin-global-externals@npm:2.1.2" + checksum: 10/fd68714cccfbd33a8ec31d11ac7c6373100a5e1b8e31941a45c723c802feccb0a00dde946f55cc91d58bff77d405adc2064b22f0faf5ee165968965e5da758a1 + languageName: node + linkType: hard + "@floating-ui/core@npm:^1.7.3": version: 1.7.3 resolution: "@floating-ui/core@npm:1.7.3" @@ -1300,6 +1647,30 @@ __metadata: languageName: node linkType: hard +"@grpc/grpc-js@npm:^1.7.1": + version: 1.14.3 + resolution: "@grpc/grpc-js@npm:1.14.3" + dependencies: + "@grpc/proto-loader": "npm:^0.8.0" + "@js-sdsl/ordered-map": "npm:^4.4.2" + checksum: 10/bb9bfe2f749179ae5ac7774d30486dfa2e0b004518c28de158b248e0f6f65f40138f01635c48266fa540670220f850216726e3724e1eb29d078817581c96e4db + languageName: node + linkType: hard + +"@grpc/proto-loader@npm:^0.8.0": + version: 0.8.0 + resolution: "@grpc/proto-loader@npm:0.8.0" + dependencies: + lodash.camelcase: "npm:^4.3.0" + long: "npm:^5.0.0" + protobufjs: "npm:^7.5.3" + yargs: "npm:^17.7.2" + bin: + proto-loader-gen-types: build/bin/proto-loader-gen-types.js + checksum: 10/216813bdca52cd3a84ac355ad93c2c3f54252be47327692fe666fd85baa5b1d50aa681ebc5626ab08926564fb2deae3b2ea435aa5bd883197650bbe56f2ae108 + languageName: node + linkType: hard + "@humanwhocodes/config-array@npm:^0.11.14": version: 0.11.14 resolution: "@humanwhocodes/config-array@npm:0.11.14" @@ -1627,6 +1998,61 @@ __metadata: languageName: node linkType: hard +"@js-sdsl/ordered-map@npm:^4.4.2": + version: 4.4.2 + resolution: "@js-sdsl/ordered-map@npm:4.4.2" + checksum: 10/ac64e3f0615ecc015461c9f527f124d2edaa9e68de153c1e270c627e01e83d046522d7e872692fd57a8c514578b539afceff75831c0d8b2a9a7a347fbed35af4 + languageName: node + linkType: hard + +"@js-temporal/polyfill@npm:^0.4.4": + version: 0.4.4 + resolution: "@js-temporal/polyfill@npm:0.4.4" + dependencies: + jsbi: "npm:^4.3.0" + tslib: "npm:^2.4.1" + checksum: 10/f8b1fa23c48e1e6acaef991accac2f252260b50d7a1b1af8176bdc848ecb4d1cb5c0b29cc9c7393b94e92ee1438a50425251a75f631d0ff50617582407da2a57 + languageName: node + linkType: hard + +"@mdx-js/esbuild@npm:^2.0.0": + version: 2.3.0 + resolution: "@mdx-js/esbuild@npm:2.3.0" + dependencies: + "@mdx-js/mdx": "npm:^2.0.0" + node-fetch: "npm:^3.0.0" + vfile: "npm:^5.0.0" + peerDependencies: + esbuild: ">=0.11.0" + checksum: 10/7f8632ada5d0331d7f00e7bc4a4de825ffd0402ae66825a63fc302e123e1afdf8f631af35f03cfce929502ed85a40f819ab7c28f2ad0d6e9299c82598f1deb68 + languageName: node + linkType: hard + +"@mdx-js/mdx@npm:^2.0.0": + version: 2.3.0 + resolution: "@mdx-js/mdx@npm:2.3.0" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + "@types/mdx": "npm:^2.0.0" + estree-util-build-jsx: "npm:^2.0.0" + estree-util-is-identifier-name: "npm:^2.0.0" + estree-util-to-js: "npm:^1.1.0" + estree-walker: "npm:^3.0.0" + hast-util-to-estree: "npm:^2.0.0" + markdown-extensions: "npm:^1.0.0" + periscopic: "npm:^3.0.0" + remark-mdx: "npm:^2.0.0" + remark-parse: "npm:^10.0.0" + remark-rehype: "npm:^10.0.0" + unified: "npm:^10.0.0" + unist-util-position-from-estree: "npm:^1.0.0" + unist-util-stringify-position: "npm:^3.0.0" + unist-util-visit: "npm:^4.0.0" + vfile: "npm:^5.0.0" + checksum: 10/3f56d25d7e410278881e8ff8ea9efef0b538aed7d4c3481f89790be832863236c3e582b4233a3d5a5f05491f23d2ba6df46c04deab268976013032c4603ccafe + languageName: node + linkType: hard + "@mdx-js/mdx@npm:^3.0.1": version: 3.1.1 resolution: "@mdx-js/mdx@npm:3.1.1" @@ -1929,6 +2355,245 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/api-logs@npm:0.39.1": + version: 0.39.1 + resolution: "@opentelemetry/api-logs@npm:0.39.1" + dependencies: + "@opentelemetry/api": "npm:^1.0.0" + checksum: 10/566f05094c69b9ec53eefb530256680fd1c77aad0627bd9504ddd8806dadf278523e29091f8cba41ed6c790a56eb098bd60852cac96ffde79c480ff0c1725b8c + languageName: node + linkType: hard + +"@opentelemetry/api@npm:^1.0.0, @opentelemetry/api@npm:^1.4.1": + version: 1.9.0 + resolution: "@opentelemetry/api@npm:1.9.0" + checksum: 10/a607f0eef971893c4f2ee2a4c2069aade6ec3e84e2a1f5c2aac19f65c5d9eeea41aa72db917c1029faafdd71789a1a040bdc18f40d63690e22ccae5d7070f194 + languageName: node + linkType: hard + +"@opentelemetry/context-async-hooks@npm:1.30.1": + version: 1.30.1 + resolution: "@opentelemetry/context-async-hooks@npm:1.30.1" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10/95c3ec3683afb26e5d00a6efbdc459f76d1526a4f5bda07b265bb1f62a77770242695a48feb44b7b479490f89503e2283a2efdb833ed0cdf0256398feed9870f + languageName: node + linkType: hard + +"@opentelemetry/core@npm:1.13.0": + version: 1.13.0 + resolution: "@opentelemetry/core@npm:1.13.0" + dependencies: + "@opentelemetry/semantic-conventions": "npm:1.13.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.5.0" + checksum: 10/f1778a0eadd7e398095d7dbfdacb884a18cc3e7e14ffcc25ecf727c7186c8ab63ebf0baab31b2b8a3d81cee2cf03247bbceef59fa21dfe8ccdab783e4138637b + languageName: node + linkType: hard + +"@opentelemetry/core@npm:1.30.1, @opentelemetry/core@npm:^1.13.0": + version: 1.30.1 + resolution: "@opentelemetry/core@npm:1.30.1" + dependencies: + "@opentelemetry/semantic-conventions": "npm:1.28.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10/fa3df9619fdbf8f607132d72915849754b71c4c5f5f705b30c8c59b209abe97206decf25cb8ebafdbb6105a4baab2acddee47468cb9d0b67f1a8df96cebc3548 + languageName: node + linkType: hard + +"@opentelemetry/exporter-trace-otlp-grpc@npm:^0.39.1": + version: 0.39.1 + resolution: "@opentelemetry/exporter-trace-otlp-grpc@npm:0.39.1" + dependencies: + "@grpc/grpc-js": "npm:^1.7.1" + "@opentelemetry/core": "npm:1.13.0" + "@opentelemetry/otlp-grpc-exporter-base": "npm:0.39.1" + "@opentelemetry/otlp-transformer": "npm:0.39.1" + "@opentelemetry/resources": "npm:1.13.0" + "@opentelemetry/sdk-trace-base": "npm:1.13.0" + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 10/2eebb2e40d6d2fdc7d629e7fbbbccce4db9207dac80dd060bf00490fd7186438b7972499da66e8829d4e4e80fea82252ddc04ff44773857558637817b7c926d6 + languageName: node + linkType: hard + +"@opentelemetry/otlp-exporter-base@npm:0.39.1": + version: 0.39.1 + resolution: "@opentelemetry/otlp-exporter-base@npm:0.39.1" + dependencies: + "@opentelemetry/core": "npm:1.13.0" + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 10/0ccfde09f2b57dffd8e115c356c9c50073f9c2817466d31bd1fc0c9fd0169163178b9760f08d264cefed064b8cd0f4236d22b95a6f16744748828cf3ae34020a + languageName: node + linkType: hard + +"@opentelemetry/otlp-grpc-exporter-base@npm:0.39.1": + version: 0.39.1 + resolution: "@opentelemetry/otlp-grpc-exporter-base@npm:0.39.1" + dependencies: + "@grpc/grpc-js": "npm:^1.7.1" + "@opentelemetry/core": "npm:1.13.0" + "@opentelemetry/otlp-exporter-base": "npm:0.39.1" + protobufjs: "npm:^7.2.2" + peerDependencies: + "@opentelemetry/api": ^1.0.0 + checksum: 10/b5444d4def68887b4f8ca24c8c6f5be01b6a7367898fc47ac60bad56bad735253eb059766209fcc7c3b8215e190beba38d466987ca71dbdf48a8f6f9511869d4 + languageName: node + linkType: hard + +"@opentelemetry/otlp-transformer@npm:0.39.1": + version: 0.39.1 + resolution: "@opentelemetry/otlp-transformer@npm:0.39.1" + dependencies: + "@opentelemetry/api-logs": "npm:0.39.1" + "@opentelemetry/core": "npm:1.13.0" + "@opentelemetry/resources": "npm:1.13.0" + "@opentelemetry/sdk-logs": "npm:0.39.1" + "@opentelemetry/sdk-metrics": "npm:1.13.0" + "@opentelemetry/sdk-trace-base": "npm:1.13.0" + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.5.0" + checksum: 10/4d3987cfff4f69d1e941983d59d3cf7b5eafdac720fb884735137a4fdc0138ac14340aecd07a4c4db94361b0ee74ddc451aeb0fd72461da4f9e07543f2616584 + languageName: node + linkType: hard + +"@opentelemetry/propagator-b3@npm:1.30.1": + version: 1.30.1 + resolution: "@opentelemetry/propagator-b3@npm:1.30.1" + dependencies: + "@opentelemetry/core": "npm:1.30.1" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10/df246fff27cd2075221fa4731fdfd26f0fdb1c82f6045bcc8f4abeee808c4fc9f396097106755ae0c975fafe3e602b8870541fabedb29376c6c58b83e2eb8a7c + languageName: node + linkType: hard + +"@opentelemetry/propagator-jaeger@npm:1.30.1": + version: 1.30.1 + resolution: "@opentelemetry/propagator-jaeger@npm:1.30.1" + dependencies: + "@opentelemetry/core": "npm:1.30.1" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10/a3603852129a09a1224acc36b90994be5b1b7eb9a7a6fe87b09522c16b348a5567de8ea3fc441ee0717e8eacecfca1eaaf79ec9bfcb8fded8463fc25c29c3c9e + languageName: node + linkType: hard + +"@opentelemetry/resources@npm:1.13.0": + version: 1.13.0 + resolution: "@opentelemetry/resources@npm:1.13.0" + dependencies: + "@opentelemetry/core": "npm:1.13.0" + "@opentelemetry/semantic-conventions": "npm:1.13.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.5.0" + checksum: 10/50be595c25569d3ecf7c1662c1fa22c06ce1e435f4a1b0fa0898cc0788ad663693d191853ca4fb41516fae44bb3aa08336b18f3fc56fe9dc7ac3def2ed23edaf + languageName: node + linkType: hard + +"@opentelemetry/resources@npm:1.30.1, @opentelemetry/resources@npm:^1.13.0": + version: 1.30.1 + resolution: "@opentelemetry/resources@npm:1.30.1" + dependencies: + "@opentelemetry/core": "npm:1.30.1" + "@opentelemetry/semantic-conventions": "npm:1.28.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10/9b7544b639e8fee41315e2646615676ffb1020dba0f6c81e6ec1dd2daf5409fc6ce3d2b629bbd9cd32f85decc3a8bfa5dc8cc52bb72bd84c1777ca25b4301aa0 + languageName: node + linkType: hard + +"@opentelemetry/sdk-logs@npm:0.39.1": + version: 0.39.1 + resolution: "@opentelemetry/sdk-logs@npm:0.39.1" + dependencies: + "@opentelemetry/core": "npm:1.13.0" + "@opentelemetry/resources": "npm:1.13.0" + peerDependencies: + "@opentelemetry/api": ">=1.4.0 <1.5.0" + "@opentelemetry/api-logs": ">=0.38.0" + checksum: 10/168340d145d68001e83a5271afb4996b005a33428b2ad8a5e32ee629f106e5e9c1dd533fa8fac7f9cd269b29699a59223be5d1ad43ff2047ffb0501899bea521 + languageName: node + linkType: hard + +"@opentelemetry/sdk-metrics@npm:1.13.0": + version: 1.13.0 + resolution: "@opentelemetry/sdk-metrics@npm:1.13.0" + dependencies: + "@opentelemetry/core": "npm:1.13.0" + "@opentelemetry/resources": "npm:1.13.0" + lodash.merge: "npm:4.6.2" + peerDependencies: + "@opentelemetry/api": ">=1.3.0 <1.5.0" + checksum: 10/a78e416607c6be16475a6907c61837cef9511f2f7b79e3fe9bb100067ede610e14904c9b0f71e2a2786036f2f8776d2fb6ed0200394747b43270a30b69f44663 + languageName: node + linkType: hard + +"@opentelemetry/sdk-trace-base@npm:1.13.0": + version: 1.13.0 + resolution: "@opentelemetry/sdk-trace-base@npm:1.13.0" + dependencies: + "@opentelemetry/core": "npm:1.13.0" + "@opentelemetry/resources": "npm:1.13.0" + "@opentelemetry/semantic-conventions": "npm:1.13.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.5.0" + checksum: 10/4b19f1800bd9c091886618514750c2b35e75ba4649bea9bd7ce317494edf555523382b609aeb3438a468994fdb3fc43d1e48a00b288c55237909bb8bebb55a5a + languageName: node + linkType: hard + +"@opentelemetry/sdk-trace-base@npm:1.30.1, @opentelemetry/sdk-trace-base@npm:^1.13.0": + version: 1.30.1 + resolution: "@opentelemetry/sdk-trace-base@npm:1.30.1" + dependencies: + "@opentelemetry/core": "npm:1.30.1" + "@opentelemetry/resources": "npm:1.30.1" + "@opentelemetry/semantic-conventions": "npm:1.28.0" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10/3ba794622c9ff1d147b77fcd0c8547a6a1356edb5af884cf1d09838c71a004a044ea55d4c742b956e9247e46053583bdbda533836686b2f54ee1ecfc527254ff + languageName: node + linkType: hard + +"@opentelemetry/sdk-trace-node@npm:^1.13.0": + version: 1.30.1 + resolution: "@opentelemetry/sdk-trace-node@npm:1.30.1" + dependencies: + "@opentelemetry/context-async-hooks": "npm:1.30.1" + "@opentelemetry/core": "npm:1.30.1" + "@opentelemetry/propagator-b3": "npm:1.30.1" + "@opentelemetry/propagator-jaeger": "npm:1.30.1" + "@opentelemetry/sdk-trace-base": "npm:1.30.1" + semver: "npm:^7.5.2" + peerDependencies: + "@opentelemetry/api": ">=1.0.0 <1.10.0" + checksum: 10/75d793718e3785abbfab337a6d8ab12cfdfdb2ec8c3c642c2657ebf8d589397beea10646b2fb094aaac106d4539a8105626bfcb3ad845eb852ff460148b3e34f + languageName: node + linkType: hard + +"@opentelemetry/semantic-conventions@npm:1.13.0": + version: 1.13.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.13.0" + checksum: 10/2ff7286ad8548d2b4a21757e1eb94b28b5843062cd6d0a626ce10e357aa455456ea786ba470642cac9799c90889a58360fd6da8cea45b39233ee0597fb357c05 + languageName: node + linkType: hard + +"@opentelemetry/semantic-conventions@npm:1.28.0": + version: 1.28.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.28.0" + checksum: 10/c182a3206769b5d5a8ab89a5c674d046fd789421cef27ea55af179990e314732433c98e5017aa23e99f15fd2b0e13cb129bb6c2282da6860ce9419adf32b2e87 + languageName: node + linkType: hard + +"@opentelemetry/semantic-conventions@npm:^1.13.0": + version: 1.38.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.38.0" + checksum: 10/9d549f4896e900f644d5e70dd7142505daff88ed83c1cb7bcd976ac55e9496d4ddd686bb2815dd68655c739950514394c3b73ff51e53b2e4ff2d54a7f6d22521 + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -1947,6 +2612,79 @@ __metadata: languageName: node linkType: hard +"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/aspromise@npm:1.1.2" + checksum: 10/8a938d84fe4889411296db66b29287bd61ea3c14c2d23e7a8325f46a2b8ce899857c5f038d65d7641805e6c1d06b495525c7faf00c44f85a7ee6476649034969 + languageName: node + linkType: hard + +"@protobufjs/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/base64@npm:1.1.2" + checksum: 10/c71b100daeb3c9bdccab5cbc29495b906ba0ae22ceedc200e1ba49717d9c4ab15a6256839cebb6f9c6acae4ed7c25c67e0a95e734f612b258261d1a3098fe342 + languageName: node + linkType: hard + +"@protobufjs/codegen@npm:^2.0.4": + version: 2.0.4 + resolution: "@protobufjs/codegen@npm:2.0.4" + checksum: 10/c6ee5fa172a8464f5253174d3c2353ea520c2573ad7b6476983d9b1346f4d8f2b44aa29feb17a949b83c1816bc35286a5ea265ed9d8fdd2865acfa09668c0447 + languageName: node + linkType: hard + +"@protobufjs/eventemitter@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/eventemitter@npm:1.1.0" + checksum: 10/03af3e99f17ad421283d054c88a06a30a615922a817741b43ca1b13e7c6b37820a37f6eba9980fb5150c54dba6e26cb6f7b64a6f7d8afa83596fafb3afa218c3 + languageName: node + linkType: hard + +"@protobufjs/fetch@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/fetch@npm:1.1.0" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.1" + "@protobufjs/inquire": "npm:^1.1.0" + checksum: 10/67ae40572ad536e4ef94269199f252c024b66e3059850906bdaee161ca1d75c73d04d35cd56f147a8a5a079f5808e342b99e61942c1dae15604ff0600b09a958 + languageName: node + linkType: hard + +"@protobufjs/float@npm:^1.0.2": + version: 1.0.2 + resolution: "@protobufjs/float@npm:1.0.2" + checksum: 10/634c2c989da0ef2f4f19373d64187e2a79f598c5fb7991afb689d29a2ea17c14b796b29725945fa34b9493c17fb799e08ac0a7ccaae460ee1757d3083ed35187 + languageName: node + linkType: hard + +"@protobufjs/inquire@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/inquire@npm:1.1.0" + checksum: 10/c09efa34a5465cb120775e1a482136f2340a58b4abce7e93d72b8b5a9324a0e879275016ef9fcd73d72a4731639c54f2bb755bb82f916e4a78892d1d840bb3d2 + languageName: node + linkType: hard + +"@protobufjs/path@npm:^1.1.2": + version: 1.1.2 + resolution: "@protobufjs/path@npm:1.1.2" + checksum: 10/bb709567935fd385a86ad1f575aea98131bbd719c743fb9b6edd6b47ede429ff71a801cecbd64fc72deebf4e08b8f1bd8062793178cdaed3713b8d15771f9b83 + languageName: node + linkType: hard + +"@protobufjs/pool@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/pool@npm:1.1.0" + checksum: 10/b9c7047647f6af28e92aac54f6f7c1f7ff31b201b4bfcc7a415b2861528854fce3ec666d7e7e10fd744da905f7d4aef2205bbcc8944ca0ca7a82e18134d00c46 + languageName: node + linkType: hard + +"@protobufjs/utf8@npm:^1.1.0": + version: 1.1.0 + resolution: "@protobufjs/utf8@npm:1.1.0" + checksum: 10/131e289c57534c1d73a0e55782d6751dd821db1583cb2f7f7e017c9d6747addaebe79f28120b2e0185395d990aad347fb14ffa73ef4096fa38508d61a0e64602 + languageName: node + linkType: hard + "@radix-ui/number@npm:1.1.1": version: 1.1.1 resolution: "@radix-ui/number@npm:1.1.1" @@ -3972,6 +4710,15 @@ __metadata: languageName: node linkType: hard +"@types/acorn@npm:^4.0.0": + version: 4.0.6 + resolution: "@types/acorn@npm:4.0.6" + dependencies: + "@types/estree": "npm:*" + checksum: 10/e00671d5055d06b07feccb8c2841467a4bdd1ab95a29e191d51cacc08c496e1ba1f54edeefab274bb2ba51cb45b0aaaa662a63897650e9d02e9997ad82124ae4 + languageName: node + linkType: hard + "@types/aria-query@npm:^5.0.1": version: 5.0.4 resolution: "@types/aria-query@npm:5.0.4" @@ -4286,7 +5033,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:1.0.8, @types/estree@npm:^1.0.0": +"@types/estree@npm:*, @types/estree@npm:1.0.8, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" checksum: 10/25a4c16a6752538ffde2826c2cc0c6491d90e69cd6187bef4a006dd2c3c45469f049e643d7e516c515f21484dc3d48fd5c870be158a5beb72f5baf3dc43e4099 @@ -4300,6 +5047,15 @@ __metadata: languageName: node linkType: hard +"@types/hast@npm:^2.0.0": + version: 2.3.10 + resolution: "@types/hast@npm:2.3.10" + dependencies: + "@types/unist": "npm:^2" + checksum: 10/41531b7fbf590b02452996fc63272479c20a07269e370bd6514982cbcd1819b4b84d3ea620f2410d1b9541a23d08ce2eeb0a592145d05e00e249c3d56700d460 + languageName: node + linkType: hard + "@types/hast@npm:^3.0.0": version: 3.0.4 resolution: "@types/hast@npm:3.0.4" @@ -4340,6 +5096,15 @@ __metadata: languageName: node linkType: hard +"@types/mdast@npm:^3.0.0": + version: 3.0.15 + resolution: "@types/mdast@npm:3.0.15" + dependencies: + "@types/unist": "npm:^2" + checksum: 10/050a5c1383928b2688dd145382a22535e2af87dc3fd592c843abb7851bcc99893a1ee0f63be19fc4e89779387ec26a57486cfb425b016c0b2a98a17fc4a1e8b3 + languageName: node + linkType: hard + "@types/mdast@npm:^4.0.0": version: 4.0.4 resolution: "@types/mdast@npm:4.0.4" @@ -4356,7 +5121,7 @@ __metadata: languageName: node linkType: hard -"@types/mdx@npm:^2.0.0": +"@types/mdx@npm:^2.0.0, @types/mdx@npm:^2.0.13": version: 2.0.13 resolution: "@types/mdx@npm:2.0.13" checksum: 10/b73ed5f08114879b9590dc6a9ee8b648643c57c708583cd24b2bc3cc8961361fc63139ac7e9291e7b3b6e6b45707749d01d6f9727ddec5533df75dc3b90871a4 @@ -4379,6 +5144,22 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:>=13.7.0": + version: 25.0.3 + resolution: "@types/node@npm:25.0.3" + dependencies: + undici-types: "npm:~7.16.0" + checksum: 10/5889b00f398eff4d4af28c3e5e97976f65c39a63fa3d7011f35cbf8640675fa6835e5dd47dce94d6ba48667711ddcd1f5c9bc5d93233e6a8e9ea1e502e8aa5a4 + languageName: node + linkType: hard + +"@types/parse5@npm:^6.0.0": + version: 6.0.3 + resolution: "@types/parse5@npm:6.0.3" + checksum: 10/834d40c9b1a8a99a9574b0b3f6629cf48adcff2eda01a35d701f1de5dcf46ce24223684647890aba9f985d6c801b233f878168683de0ae425940403c383fba8f + languageName: node + linkType: hard + "@types/prismjs@npm:^1.26.3": version: 1.26.5 resolution: "@types/prismjs@npm:1.26.5" @@ -4430,6 +5211,13 @@ __metadata: languageName: node linkType: hard +"@types/resolve@npm:^1.17.1": + version: 1.20.6 + resolution: "@types/resolve@npm:1.20.6" + checksum: 10/dc35f5517606b6687cd971c0281ac58bdee2c50c051b030f04647d3991688be2259c304ee97e5b5d4b9936072c36767eb5933b54611a407d6557972bb6fea4f6 + languageName: node + linkType: hard + "@types/sanitize-html@npm:^2.16.0": version: 2.16.0 resolution: "@types/sanitize-html@npm:2.16.0" @@ -4453,7 +5241,7 @@ __metadata: languageName: node linkType: hard -"@types/unist@npm:^2.0.0": +"@types/unist@npm:^2, @types/unist@npm:^2.0.0": version: 2.0.11 resolution: "@types/unist@npm:2.0.11" checksum: 10/6d436e832bc35c6dde9f056ac515ebf2b3384a1d7f63679d12358766f9b313368077402e9c1126a14d827f10370a5485e628bf61aa91117cf4fc882423191a4e @@ -4996,6 +5784,13 @@ __metadata: languageName: node linkType: hard +"array-timsort@npm:^1.0.3": + version: 1.0.3 + resolution: "array-timsort@npm:1.0.3" + checksum: 10/f417f073b3733baec3a80decdf5d45bf763f04676ef3610b0e71f9b1d88c6e4c38154c05b28b31529d308bfd0e043d08059fcd9df966245a1276af15b5584936 + languageName: node + linkType: hard + "array.prototype.findlast@npm:^1.2.5": version: 1.2.5 resolution: "array.prototype.findlast@npm:1.2.5" @@ -5267,6 +6062,13 @@ __metadata: languageName: node linkType: hard +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 10/0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb + languageName: node + linkType: hard + "buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" @@ -5335,6 +6137,16 @@ __metadata: languageName: node linkType: hard +"camel-case@npm:^4.1.2": + version: 4.1.2 + resolution: "camel-case@npm:4.1.2" + dependencies: + pascal-case: "npm:^3.1.2" + tslib: "npm:^2.0.3" + checksum: 10/bcbd25cd253b3cbc69be3f535750137dbf2beb70f093bdc575f73f800acc8443d34fd52ab8f0a2413c34f1e8203139ffc88428d8863e4dfe530cfb257a379ad6 + languageName: node + linkType: hard + "camelcase-css@npm:^2.0.1": version: 2.0.1 resolution: "camelcase-css@npm:2.0.1" @@ -5444,7 +6256,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.6.0": +"chokidar@npm:^3.5.3, chokidar@npm:^3.6.0": version: 3.6.0 resolution: "chokidar@npm:3.6.0" dependencies: @@ -5493,6 +6305,17 @@ __metadata: languageName: node linkType: hard +"clipanion@npm:^3.2.1": + version: 3.2.1 + resolution: "clipanion@npm:3.2.1" + dependencies: + typanion: "npm:^3.8.0" + peerDependencies: + typanion: "*" + checksum: 10/fdc4d066e6b4683a5264d22851039d41ffcd159eed6888e5aea9744a637effd7a19601fe630c1ab849f22e35620850c5681fe48f12e43c58db1f7ca93ef7bb72 + languageName: node + linkType: hard + "cliui@npm:^6.0.0": version: 6.0.0 resolution: "cliui@npm:6.0.0" @@ -5504,6 +6327,17 @@ __metadata: languageName: node linkType: hard +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 10/eaa5561aeb3135c2cddf7a3b3f562fc4238ff3b3fc666869ef2adf264be0f372136702f16add9299087fb1907c2e4ec5dbfe83bd24bce815c70a80c6c1a2e950 + languageName: node + linkType: hard + "clsx@npm:^2.0.0, clsx@npm:^2.1.1": version: 2.1.1 resolution: "clsx@npm:2.1.1" @@ -5571,6 +6405,17 @@ __metadata: languageName: node linkType: hard +"comment-json@npm:^4.2.3": + version: 4.5.0 + resolution: "comment-json@npm:4.5.0" + dependencies: + array-timsort: "npm:^1.0.3" + core-util-is: "npm:^1.0.3" + esprima: "npm:^4.0.1" + checksum: 10/a9ea23772f228aea05ab597918e024802bf723c01d93ee2a63c380939594e6dcfa837f7946ca253793fc7c79b6bdd65acb2c5fe1c5cb5409db245ebbb7f7bbd0 + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -5585,7 +6430,23 @@ __metadata: languageName: node linkType: hard -"core-util-is@npm:~1.0.0": +"contentlayer@npm:^0.3.4": + version: 0.3.4 + resolution: "contentlayer@npm:0.3.4" + dependencies: + "@contentlayer/cli": "npm:0.3.4" + "@contentlayer/client": "npm:0.3.4" + "@contentlayer/core": "npm:0.3.4" + "@contentlayer/source-files": "npm:0.3.4" + "@contentlayer/source-remote-files": "npm:0.3.4" + "@contentlayer/utils": "npm:0.3.4" + bin: + contentlayer: ./bin/cli.cjs + checksum: 10/ca049eeb301a38728a8e1397a4c59795d9f7c16d703e75dfbc1669f3063c766e370c85d3a69c0ef638c8dec3f563ad071d1d7ac9f9fcab8e96445d4448d56206 + languageName: node + linkType: hard + +"core-util-is@npm:^1.0.3, core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" checksum: 10/9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 @@ -6097,6 +6958,7 @@ __metadata: "@tiptap/react": "npm:^3.13.0" "@tiptap/starter-kit": "npm:^3.13.0" "@types/js-yaml": "npm:^4.0.9" + "@types/mdx": "npm:^2.0.13" "@types/node": "npm:24.0.3" "@types/prismjs": "npm:^1.26.3" "@types/react": "npm:^18.3.26" @@ -6106,6 +6968,7 @@ __metadata: baseline-browser-mapping: "npm:^2.8.32" class-variance-authority: "npm:^0.7.1" clsx: "npm:^2.1.1" + contentlayer: "npm:^0.3.4" dompurify: "npm:^3.2.6" eslint: "npm:8.57.0" eslint-config-next: "npm:^15.5.3" @@ -6119,6 +6982,7 @@ __metadata: marked: "npm:^16.1.2" mermaid: "npm:^11.12.2" next: "npm:^16.0.9" + next-contentlayer: "npm:^0.3.4" next-mdx-remote: "npm:^5.0.0" next-themes: "npm:^0.4.6" pdfjs-dist: "npm:^4.2.67" @@ -6145,6 +7009,13 @@ __metadata: languageName: unknown linkType: soft +"data-uri-to-buffer@npm:^4.0.0": + version: 4.0.1 + resolution: "data-uri-to-buffer@npm:4.0.1" + checksum: 10/0d0790b67ffec5302f204c2ccca4494f70b4e2d940fea3d36b09f0bb2b8539c2e86690429eb1f1dc4bcc9e4df0644193073e63d9ee48ac9fce79ec1506e4aa4c + languageName: node + linkType: hard + "data-urls@npm:^5.0.0": version: 5.0.0 resolution: "data-urls@npm:5.0.0" @@ -6370,6 +7241,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^5.0.0": + version: 5.2.0 + resolution: "diff@npm:5.2.0" + checksum: 10/01b7b440f83a997350a988e9d2f558366c0f90f15be19f4aa7f1bb3109a4e153dfc3b9fbf78e14ea725717017407eeaa2271e3896374a0181e8f52445740846d + languageName: node + linkType: hard + "dijkstrajs@npm:^1.0.1": version: 1.0.3 resolution: "dijkstrajs@npm:1.0.3" @@ -6750,6 +7628,83 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:0.17.x || 0.18.x": + version: 0.18.20 + resolution: "esbuild@npm:0.18.20" + dependencies: + "@esbuild/android-arm": "npm:0.18.20" + "@esbuild/android-arm64": "npm:0.18.20" + "@esbuild/android-x64": "npm:0.18.20" + "@esbuild/darwin-arm64": "npm:0.18.20" + "@esbuild/darwin-x64": "npm:0.18.20" + "@esbuild/freebsd-arm64": "npm:0.18.20" + "@esbuild/freebsd-x64": "npm:0.18.20" + "@esbuild/linux-arm": "npm:0.18.20" + "@esbuild/linux-arm64": "npm:0.18.20" + "@esbuild/linux-ia32": "npm:0.18.20" + "@esbuild/linux-loong64": "npm:0.18.20" + "@esbuild/linux-mips64el": "npm:0.18.20" + "@esbuild/linux-ppc64": "npm:0.18.20" + "@esbuild/linux-riscv64": "npm:0.18.20" + "@esbuild/linux-s390x": "npm:0.18.20" + "@esbuild/linux-x64": "npm:0.18.20" + "@esbuild/netbsd-x64": "npm:0.18.20" + "@esbuild/openbsd-x64": "npm:0.18.20" + "@esbuild/sunos-x64": "npm:0.18.20" + "@esbuild/win32-arm64": "npm:0.18.20" + "@esbuild/win32-ia32": "npm:0.18.20" + "@esbuild/win32-x64": "npm:0.18.20" + dependenciesMeta: + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10/1f723ec71c3aa196473bf3298316eedc3f62d523924652dfeb60701b609792f918fc60db84b420d1d8ba9bfa7d69de2fc1d3157ba47c028bdae5d507a26a3c64 + languageName: node + linkType: hard + "esbuild@npm:^0.25.0": version: 0.25.12 resolution: "esbuild@npm:0.25.12" @@ -6928,7 +7883,7 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.2.0": +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" checksum: 10/9d7169e3965b2f9ae46971afa392f6e5a25545ea30f2e2dd99c9b0a95a3f52b5653681a84f5b2911a413ddad2d7a93d3514165072f349b5ffc59c75a899970d6 @@ -7187,7 +8142,7 @@ __metadata: languageName: node linkType: hard -"esprima@npm:^4.0.0": +"esprima@npm:^4.0.0, esprima@npm:^4.0.1": version: 4.0.1 resolution: "esprima@npm:4.0.1" bin: @@ -7222,6 +8177,15 @@ __metadata: languageName: node linkType: hard +"estree-util-attach-comments@npm:^2.0.0": + version: 2.1.1 + resolution: "estree-util-attach-comments@npm:2.1.1" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10/f5b4d46a9d78fc41ec707dceba9773b225d73a5de9d48bc3c3d813726f84bc143a682a181eb3b60562653eac16e7d5eeb03c20d06248fbb989a98c0877dd8c42 + languageName: node + linkType: hard + "estree-util-attach-comments@npm:^3.0.0": version: 3.0.0 resolution: "estree-util-attach-comments@npm:3.0.0" @@ -7231,6 +8195,17 @@ __metadata: languageName: node linkType: hard +"estree-util-build-jsx@npm:^2.0.0": + version: 2.2.2 + resolution: "estree-util-build-jsx@npm:2.2.2" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + estree-util-is-identifier-name: "npm:^2.0.0" + estree-walker: "npm:^3.0.0" + checksum: 10/f690334ea48843a25596f44808c404c7cdbb5211a754cc095cf8f8856240e8b7b3154350f5f0c39318581f05827b55f55ed1d89e0c9ebd7ad6ed1fe51054c9a5 + languageName: node + linkType: hard + "estree-util-build-jsx@npm:^3.0.0": version: 3.0.1 resolution: "estree-util-build-jsx@npm:3.0.1" @@ -7243,6 +8218,20 @@ __metadata: languageName: node linkType: hard +"estree-util-is-identifier-name@npm:^1.0.0": + version: 1.1.0 + resolution: "estree-util-is-identifier-name@npm:1.1.0" + checksum: 10/821954d22365239c1418a6cf82ef03107919b480d363664c19d27cc2a5efd6ec749c650b006fd39a85510508d8f4d0e8393b230bc43b89648caa96d60319801e + languageName: node + linkType: hard + +"estree-util-is-identifier-name@npm:^2.0.0": + version: 2.1.0 + resolution: "estree-util-is-identifier-name@npm:2.1.0" + checksum: 10/8d99b0ce26dc0711c8d600ec69c653047d803464aed049402f492a40ccacf3b6a9d89c6ccfb2d8a17cb7a18869dc432302898702cb28e8b9172c9cda7ef82888 + languageName: node + linkType: hard + "estree-util-is-identifier-name@npm:^3.0.0": version: 3.0.0 resolution: "estree-util-is-identifier-name@npm:3.0.0" @@ -7260,6 +8249,17 @@ __metadata: languageName: node linkType: hard +"estree-util-to-js@npm:^1.1.0": + version: 1.2.0 + resolution: "estree-util-to-js@npm:1.2.0" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + astring: "npm:^1.8.0" + source-map: "npm:^0.7.0" + checksum: 10/58ac98eae45bced9e865843f64ad8fb986f49eab2e67c7903c6f09a1df9f0fd40b89487d176906a34eb37acc94f9d07fce979889aec8e1b4b063f51b0c3b0fdd + languageName: node + linkType: hard + "estree-util-to-js@npm:^2.0.0": version: 2.0.0 resolution: "estree-util-to-js@npm:2.0.0" @@ -7271,6 +8271,25 @@ __metadata: languageName: node linkType: hard +"estree-util-value-to-estree@npm:^1.0.0": + version: 1.3.0 + resolution: "estree-util-value-to-estree@npm:1.3.0" + dependencies: + is-plain-obj: "npm:^3.0.0" + checksum: 10/ebde685fe5f16b2a6d7b4204e9ac08c0ec71da855ece61dab84f748edbc9a4f77f47eba71c1d9d1755fabf88792d75accccc3c00d6433f1f65840e7dabb0c453 + languageName: node + linkType: hard + +"estree-util-visit@npm:^1.0.0": + version: 1.2.1 + resolution: "estree-util-visit@npm:1.2.1" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + "@types/unist": "npm:^2.0.0" + checksum: 10/f86b923312ca69620718d3429eabf9a3e03f7a3521c87e271f3b4152a906370dea56b58970bc574650ec7163ede1357fe27ee12a32a62a61561e33c249395d65 + languageName: node + linkType: hard + "estree-util-visit@npm:^2.0.0": version: 2.0.0 resolution: "estree-util-visit@npm:2.0.0" @@ -7368,7 +8387,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.3.2": +"fast-glob@npm:^3.2.12, fast-glob@npm:^3.3.2": version: 3.3.3 resolution: "fast-glob@npm:3.3.3" dependencies: @@ -7415,6 +8434,15 @@ __metadata: languageName: node linkType: hard +"fault@npm:^2.0.0": + version: 2.0.1 + resolution: "fault@npm:2.0.1" + dependencies: + format: "npm:^0.2.0" + checksum: 10/c9b30f47d95769177130a9409976a899ed31eb598450fbad5b0d39f2f5f56d5f4a9ff9257e0bee8407cb0fc3ce37165657888c6aa6d78472e403893104329b72 + languageName: node + linkType: hard + "fdir@npm:^6.5.0": version: 6.5.0 resolution: "fdir@npm:6.5.0" @@ -7427,6 +8455,16 @@ __metadata: languageName: node linkType: hard +"fetch-blob@npm:^3.1.2, fetch-blob@npm:^3.1.4": + version: 3.2.0 + resolution: "fetch-blob@npm:3.2.0" + dependencies: + node-domexception: "npm:^1.0.0" + web-streams-polyfill: "npm:^3.0.3" + checksum: 10/5264ecceb5fdc19eb51d1d0359921f12730941e333019e673e71eb73921146dceabcb0b8f534582be4497312d656508a439ad0f5edeec2b29ab2e10c72a1f86b + languageName: node + linkType: hard + "file-entry-cache@npm:^6.0.1": version: 6.0.1 resolution: "file-entry-cache@npm:6.0.1" @@ -7515,6 +8553,22 @@ __metadata: languageName: node linkType: hard +"format@npm:^0.2.0": + version: 0.2.2 + resolution: "format@npm:0.2.2" + checksum: 10/5f878b8fc1a672c8cbefa4f293bdd977c822862577d70d53456a48b4169ec9b51677c0c995bf62c633b4e5cd673624b7c273f57923b28735a6c0c0a72c382a4a + languageName: node + linkType: hard + +"formdata-polyfill@npm:^4.0.10": + version: 4.0.10 + resolution: "formdata-polyfill@npm:4.0.10" + dependencies: + fetch-blob: "npm:^3.1.2" + checksum: 10/9b5001d2edef3c9449ac3f48bd4f8cc92e7d0f2e7c1a5c8ba555ad4e77535cc5cf621fabe49e97f304067037282dd9093b9160a3cb533e46420b446c4e6bc06f + languageName: node + linkType: hard + "fraction.js@npm:^5.3.4": version: 5.3.4 resolution: "fraction.js@npm:5.3.4" @@ -7538,6 +8592,13 @@ __metadata: languageName: node linkType: hard +"fs-monkey@npm:^1.0.4": + version: 1.1.0 + resolution: "fs-monkey@npm:1.1.0" + checksum: 10/1c6da5d07f6c91e31fd9bcd68909666e18fa243c7af6697e9d2ded16d4ee87cc9c2b67889b19f98211006c228d1915e1beb0678b4080778fb52539ef3e4eab6c + languageName: node + linkType: hard + "fsevents@npm:2.3.2": version: 2.3.2 resolution: "fsevents@npm:2.3.2" @@ -7611,7 +8672,7 @@ __metadata: languageName: node linkType: hard -"get-caller-file@npm:^2.0.1": +"get-caller-file@npm:^2.0.1, get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" checksum: 10/b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 @@ -7824,6 +8885,13 @@ __metadata: languageName: node linkType: hard +"hash-wasm@npm:^4.9.0": + version: 4.12.0 + resolution: "hash-wasm@npm:4.12.0" + checksum: 10/529549f9565389b09310147a03cb6a5dd993f34f6742ed7fc84816e8881ce30036137aa995353bc2e8575883a6681299c3b2d181df56fcbe246f9cda82912084 + languageName: node + linkType: hard + "hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" @@ -7833,6 +8901,72 @@ __metadata: languageName: node linkType: hard +"hast-util-from-parse5@npm:^7.0.0": + version: 7.1.2 + resolution: "hast-util-from-parse5@npm:7.1.2" + dependencies: + "@types/hast": "npm:^2.0.0" + "@types/unist": "npm:^2.0.0" + hastscript: "npm:^7.0.0" + property-information: "npm:^6.0.0" + vfile: "npm:^5.0.0" + vfile-location: "npm:^4.0.0" + web-namespaces: "npm:^2.0.0" + checksum: 10/7a90a16430a1482ed1be5c2f8b182e8b12aee8834781245b101700b5a04cea8b569cf40ef08214e1eb333249432e861b17e6fe46d0447b5281827c8798e86f1a + languageName: node + linkType: hard + +"hast-util-parse-selector@npm:^3.0.0": + version: 3.1.1 + resolution: "hast-util-parse-selector@npm:3.1.1" + dependencies: + "@types/hast": "npm:^2.0.0" + checksum: 10/511d373465f60dd65e924f88bf0954085f4fb6e3a2b062a4b5ac43b93cbfd36a8dce6234b5d1e3e63499d936375687e83fc5da55628b22bd6b581b5ee167d1c4 + languageName: node + linkType: hard + +"hast-util-raw@npm:^7.0.0": + version: 7.2.3 + resolution: "hast-util-raw@npm:7.2.3" + dependencies: + "@types/hast": "npm:^2.0.0" + "@types/parse5": "npm:^6.0.0" + hast-util-from-parse5: "npm:^7.0.0" + hast-util-to-parse5: "npm:^7.0.0" + html-void-elements: "npm:^2.0.0" + parse5: "npm:^6.0.0" + unist-util-position: "npm:^4.0.0" + unist-util-visit: "npm:^4.0.0" + vfile: "npm:^5.0.0" + web-namespaces: "npm:^2.0.0" + zwitch: "npm:^2.0.0" + checksum: 10/fe39d4b9e68de7131ec61e9abe887cc0579dc7491f738735150c6021565fc998e37c9d096e97fc35c769e986e04b721d4724835ee82fcc22076d778acf6c4832 + languageName: node + linkType: hard + +"hast-util-to-estree@npm:^2.0.0": + version: 2.3.3 + resolution: "hast-util-to-estree@npm:2.3.3" + dependencies: + "@types/estree": "npm:^1.0.0" + "@types/estree-jsx": "npm:^1.0.0" + "@types/hast": "npm:^2.0.0" + "@types/unist": "npm:^2.0.0" + comma-separated-tokens: "npm:^2.0.0" + estree-util-attach-comments: "npm:^2.0.0" + estree-util-is-identifier-name: "npm:^2.0.0" + hast-util-whitespace: "npm:^2.0.0" + mdast-util-mdx-expression: "npm:^1.0.0" + mdast-util-mdxjs-esm: "npm:^1.0.0" + property-information: "npm:^6.0.0" + space-separated-tokens: "npm:^2.0.0" + style-to-object: "npm:^0.4.1" + unist-util-position: "npm:^4.0.0" + zwitch: "npm:^2.0.0" + checksum: 10/86818cba4cceb94006ba09a21026df3732e638d3f871ce7f087436287f7a0a7da6e7c0178256a007849e10d4cea6e346bf224ecd6e5009d9f82a71064d3d3183 + languageName: node + linkType: hard + "hast-util-to-estree@npm:^3.0.0": version: 3.1.3 resolution: "hast-util-to-estree@npm:3.1.3" @@ -7857,6 +8991,25 @@ __metadata: languageName: node linkType: hard +"hast-util-to-html@npm:^8.0.0": + version: 8.0.4 + resolution: "hast-util-to-html@npm:8.0.4" + dependencies: + "@types/hast": "npm:^2.0.0" + "@types/unist": "npm:^2.0.0" + ccount: "npm:^2.0.0" + comma-separated-tokens: "npm:^2.0.0" + hast-util-raw: "npm:^7.0.0" + hast-util-whitespace: "npm:^2.0.0" + html-void-elements: "npm:^2.0.0" + property-information: "npm:^6.0.0" + space-separated-tokens: "npm:^2.0.0" + stringify-entities: "npm:^4.0.0" + zwitch: "npm:^2.0.4" + checksum: 10/cb37233a21dae417957b4c13aadb577d98fb81dd0050c6807bfc8afdb892880570a904cd1c6b18e4717c7169face2a60d58b34156ef80c82fa7dbeaebe4c2427 + languageName: node + linkType: hard + "hast-util-to-jsx-runtime@npm:^2.0.0": version: 2.3.6 resolution: "hast-util-to-jsx-runtime@npm:2.3.6" @@ -7880,6 +9033,27 @@ __metadata: languageName: node linkType: hard +"hast-util-to-parse5@npm:^7.0.0": + version: 7.1.0 + resolution: "hast-util-to-parse5@npm:7.1.0" + dependencies: + "@types/hast": "npm:^2.0.0" + comma-separated-tokens: "npm:^2.0.0" + property-information: "npm:^6.0.0" + space-separated-tokens: "npm:^2.0.0" + web-namespaces: "npm:^2.0.0" + zwitch: "npm:^2.0.0" + checksum: 10/695539881431f9713ca4a0be7d06bf3e57ae4d9f930eccba371534c50cff11855d345f8ec30099d04482637ad82e3c70d480269bfa4c109f37993536e8ea690d + languageName: node + linkType: hard + +"hast-util-whitespace@npm:^2.0.0": + version: 2.0.1 + resolution: "hast-util-whitespace@npm:2.0.1" + checksum: 10/ad5a61f4e81330413d4182247e158d77408a076994fbe7257574ea6489728bb4138c83e00482051c941973d4ed3049729afb35600debfc6d1d945c40453685f7 + languageName: node + linkType: hard + "hast-util-whitespace@npm:^3.0.0": version: 3.0.0 resolution: "hast-util-whitespace@npm:3.0.0" @@ -7889,6 +9063,19 @@ __metadata: languageName: node linkType: hard +"hastscript@npm:^7.0.0": + version: 7.2.0 + resolution: "hastscript@npm:7.2.0" + dependencies: + "@types/hast": "npm:^2.0.0" + comma-separated-tokens: "npm:^2.0.0" + hast-util-parse-selector: "npm:^3.0.0" + property-information: "npm:^6.0.0" + space-separated-tokens: "npm:^2.0.0" + checksum: 10/98740e0b69b4765a23d0174fb93eb1c1bdcae6a9f1c9e1b07de6aca2d578427a42e1d45ee98eda26463ac58ff73a8ce45af19c4eb8b5f6f768a9c8543964d28f + languageName: node + linkType: hard + "html-encoding-sniffer@npm:^4.0.0": version: 4.0.0 resolution: "html-encoding-sniffer@npm:4.0.0" @@ -7898,6 +9085,13 @@ __metadata: languageName: node linkType: hard +"html-void-elements@npm:^2.0.0": + version: 2.0.1 + resolution: "html-void-elements@npm:2.0.1" + checksum: 10/06d41f13b9d5d6e0f39861c4bec9a9196fa4906d56cd5cf6cf54ad2e52a85bf960cca2bf9600026bde16c8331db171bedba5e5a35e2e43630c8f1d497b2fb658 + languageName: node + linkType: hard + "html2canvas@npm:^1.4.1": version: 1.4.1 resolution: "html2canvas@npm:1.4.1" @@ -7977,6 +9171,13 @@ __metadata: languageName: node linkType: hard +"imagescript@npm:^1.2.16": + version: 1.3.1 + resolution: "imagescript@npm:1.3.1" + checksum: 10/3dc6223ee17856f2a4be1c4fa5583ba5f95eb2778601ab397b1aca71f0a61b5a371a0704914e70e4ee71710ff9aff62afcde0d1f50a17172b329e425c11f4bd8 + languageName: node + linkType: hard + "immediate@npm:~3.0.5": version: 3.0.6 resolution: "immediate@npm:3.0.6" @@ -8008,6 +9209,13 @@ __metadata: languageName: node linkType: hard +"inflection@npm:^2.0.1": + version: 2.0.1 + resolution: "inflection@npm:2.0.1" + checksum: 10/b6ccc9432d5b3247541f6f290dcb96927a47a6d71875e5a2b0ac092d4e7ed3171a11112a85c44e9f33d3e981feffd6c646282703fdf0c323b3a66993f4e7ccea + languageName: node + linkType: hard + "inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" @@ -8022,6 +9230,13 @@ __metadata: languageName: node linkType: hard +"inline-style-parser@npm:0.1.1": + version: 0.1.1 + resolution: "inline-style-parser@npm:0.1.1" + checksum: 10/e661f4fb6824a41076c4d23358e8b581fd3410fbfb9baea4cb542a85448b487691c3b9bbb58ad73a95613041ca616f059595f19cadd0c22476a1fffa79842b48 + languageName: node + linkType: hard + "inline-style-parser@npm:0.2.7": version: 0.2.7 resolution: "inline-style-parser@npm:0.2.7" @@ -8140,6 +9355,13 @@ __metadata: languageName: node linkType: hard +"is-buffer@npm:^2.0.0": + version: 2.0.5 + resolution: "is-buffer@npm:2.0.5" + checksum: 10/3261a8b858edcc6c9566ba1694bf829e126faa88911d1c0a747ea658c5d81b14b6955e3a702d59dabadd58fdd440c01f321aa71d6547105fd21d03f94d0597e7 + languageName: node + linkType: hard + "is-bun-module@npm:^2.0.0": version: 2.0.0 resolution: "is-bun-module@npm:2.0.0" @@ -8290,6 +9512,13 @@ __metadata: languageName: node linkType: hard +"is-plain-obj@npm:^3.0.0": + version: 3.0.0 + resolution: "is-plain-obj@npm:3.0.0" + checksum: 10/a6ebdf8e12ab73f33530641972a72a4b8aed6df04f762070d823808303e4f76d87d5ea5bd76f96a7bbe83d93f04ac7764429c29413bd9049853a69cb630fb21c + languageName: node + linkType: hard + "is-plain-obj@npm:^4.0.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" @@ -8311,6 +9540,15 @@ __metadata: languageName: node linkType: hard +"is-reference@npm:^3.0.0": + version: 3.0.3 + resolution: "is-reference@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.6" + checksum: 10/11371fb2669a8144bffb2ae9bd11b0342b7dc384c3c0f8d5996566b071614282a3a0d306fd2fd1c6b4c9078d0e2703d191b47f4f78f9ce08f464c44a3a412412 + languageName: node + linkType: hard + "is-regex@npm:^1.1.4, is-regex@npm:^1.2.1": version: 1.2.1 resolution: "is-regex@npm:1.2.1" @@ -8478,7 +9716,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^4.1.0": +"js-yaml@npm:^4.0.0, js-yaml@npm:^4.1.0": version: 4.1.1 resolution: "js-yaml@npm:4.1.1" dependencies: @@ -8489,6 +9727,13 @@ __metadata: languageName: node linkType: hard +"jsbi@npm:^4.3.0": + version: 4.3.2 + resolution: "jsbi@npm:4.3.2" + checksum: 10/71f2d292ba8db5fa68d3f7a2427664a356065adb629a35404635ccd70ed412631a301b910613323de14b3310dab71a6b8c4ecf0f9c0653ee61c22e94679d52f3 + languageName: node + linkType: hard + "jsdom@npm:^24.0.0": version: 24.1.3 resolution: "jsdom@npm:24.1.3" @@ -8622,6 +9867,13 @@ __metadata: languageName: node linkType: hard +"kleur@npm:^4.0.3": + version: 4.1.5 + resolution: "kleur@npm:4.1.5" + checksum: 10/44d84cc4eedd4311099402ef6d4acd9b2d16e08e499d6ef3bb92389bd4692d7ef09e35248c26e27f98acac532122acb12a1bfee645994ae3af4f0a37996da7df + languageName: node + linkType: hard + "langium@npm:3.3.1": version: 3.3.1 resolution: "langium@npm:3.3.1" @@ -8739,13 +9991,27 @@ __metadata: languageName: node linkType: hard -"lodash.merge@npm:^4.6.2": +"lodash.camelcase@npm:^4.3.0": + version: 4.3.0 + resolution: "lodash.camelcase@npm:4.3.0" + checksum: 10/c301cc379310441dc73cd6cebeb91fb254bea74e6ad3027f9346fc43b4174385153df420ffa521654e502fd34c40ef69ca4e7d40ee7129a99e06f306032bfc65 + languageName: node + linkType: hard + +"lodash.merge@npm:4.6.2, lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" checksum: 10/d0ea2dd0097e6201be083865d50c3fb54fbfbdb247d9cc5950e086c991f448b7ab0cdab0d57eacccb43473d3f2acd21e134db39f22dac2d6c9ba6bf26978e3d6 languageName: node linkType: hard +"long@npm:^5.0.0": + version: 5.3.2 + resolution: "long@npm:5.3.2" + checksum: 10/b6b55ddae56fcce2864d37119d6b02fe28f6dd6d9e44fd22705f86a9254b9321bd69e9ffe35263b4846d54aba197c64882adcb8c543f2383c1e41284b321ea64 + languageName: node + linkType: hard + "longest-streak@npm:^3.0.0": version: 3.1.0 resolution: "longest-streak@npm:3.1.0" @@ -8764,6 +10030,15 @@ __metadata: languageName: node linkType: hard +"lower-case@npm:^2.0.2": + version: 2.0.2 + resolution: "lower-case@npm:2.0.2" + dependencies: + tslib: "npm:^2.0.3" + checksum: 10/83a0a5f159ad7614bee8bf976b96275f3954335a84fad2696927f609ddae902802c4f3312d86668722e668bef41400254807e1d3a7f2e8c3eede79691aa1f010 + languageName: node + linkType: hard + "lru-cache@npm:^10.2.0, lru-cache@npm:^10.4.3": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" @@ -8838,6 +10113,13 @@ __metadata: languageName: node linkType: hard +"markdown-extensions@npm:^1.0.0": + version: 1.1.1 + resolution: "markdown-extensions@npm:1.1.1" + checksum: 10/8a6dd128be1c524049ea6a41a9193715c2835d3d706af4b8b714ff2043a82786dbcd4a8f1fa9ddd28facbc444426c97515aef2d1f3dd11d5e2d63749ba577b1e + languageName: node + linkType: hard + "markdown-extensions@npm:^2.0.0": version: 2.0.0 resolution: "markdown-extensions@npm:2.0.0" @@ -8877,6 +10159,37 @@ __metadata: languageName: node linkType: hard +"mdast-util-definitions@npm:^5.0.0": + version: 5.1.2 + resolution: "mdast-util-definitions@npm:5.1.2" + dependencies: + "@types/mdast": "npm:^3.0.0" + "@types/unist": "npm:^2.0.0" + unist-util-visit: "npm:^4.0.0" + checksum: 10/4491b7c551ce1bdeb6c8fb1968cd461acb01ca1584f12c240755541a92d7f02bc5b9c9d6303d50deaed6d959ba58fe9a352a3e676e0f1d954e003de1277f57e4 + languageName: node + linkType: hard + +"mdast-util-from-markdown@npm:^1.0.0, mdast-util-from-markdown@npm:^1.1.0": + version: 1.3.1 + resolution: "mdast-util-from-markdown@npm:1.3.1" + dependencies: + "@types/mdast": "npm:^3.0.0" + "@types/unist": "npm:^2.0.0" + decode-named-character-reference: "npm:^1.0.0" + mdast-util-to-string: "npm:^3.1.0" + micromark: "npm:^3.0.0" + micromark-util-decode-numeric-character-reference: "npm:^1.0.0" + micromark-util-decode-string: "npm:^1.0.0" + micromark-util-normalize-identifier: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + unist-util-stringify-position: "npm:^3.0.0" + uvu: "npm:^0.5.0" + checksum: 10/1d334a54ddd6481ec4acf64c2c537b6463bc5113ba5a408f65c228dcc302d46837352814f11307af0f8b51dd7e4a0b887ce692e4d30ff31ff9d578b8ca82810b + languageName: node + linkType: hard + "mdast-util-from-markdown@npm:^2.0.0": version: 2.0.2 resolution: "mdast-util-from-markdown@npm:2.0.2" @@ -8897,6 +10210,30 @@ __metadata: languageName: node linkType: hard +"mdast-util-frontmatter@npm:^1.0.0": + version: 1.0.1 + resolution: "mdast-util-frontmatter@npm:1.0.1" + dependencies: + "@types/mdast": "npm:^3.0.0" + mdast-util-to-markdown: "npm:^1.3.0" + micromark-extension-frontmatter: "npm:^1.0.0" + checksum: 10/74ba3314c545c085b1506a5e63cea3168c1a62fe8b501fbf8c11d4aa7fe3bad963f074d7d2bf37868041f9c448ac5ea7c8c2d4f330f668c6c56cb53f410012da + languageName: node + linkType: hard + +"mdast-util-mdx-expression@npm:^1.0.0": + version: 1.3.2 + resolution: "mdast-util-mdx-expression@npm:1.3.2" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + "@types/hast": "npm:^2.0.0" + "@types/mdast": "npm:^3.0.0" + mdast-util-from-markdown: "npm:^1.0.0" + mdast-util-to-markdown: "npm:^1.0.0" + checksum: 10/90b8ec5b6fdd05282f45c1286bb8c5c3568959877930a10b8bcae100676d3baead8c6f26a768abfe74fde93fbf9cd0eabb3ab63af88a6026a3029a3f6700bd63 + languageName: node + linkType: hard + "mdast-util-mdx-expression@npm:^2.0.0": version: 2.0.1 resolution: "mdast-util-mdx-expression@npm:2.0.1" @@ -8911,6 +10248,26 @@ __metadata: languageName: node linkType: hard +"mdast-util-mdx-jsx@npm:^2.0.0": + version: 2.1.4 + resolution: "mdast-util-mdx-jsx@npm:2.1.4" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + "@types/hast": "npm:^2.0.0" + "@types/mdast": "npm:^3.0.0" + "@types/unist": "npm:^2.0.0" + ccount: "npm:^2.0.0" + mdast-util-from-markdown: "npm:^1.1.0" + mdast-util-to-markdown: "npm:^1.3.0" + parse-entities: "npm:^4.0.0" + stringify-entities: "npm:^4.0.0" + unist-util-remove-position: "npm:^4.0.0" + unist-util-stringify-position: "npm:^3.0.0" + vfile-message: "npm:^3.0.0" + checksum: 10/549c84635ef3d6e69a9967eb799f6c7834b1571db2946f415661ce4e9e4c0b1d369ac6c4ac450cd27f93225224e107d8be2107efad71b0424d537c89720b1828 + languageName: node + linkType: hard + "mdast-util-mdx-jsx@npm:^3.0.0": version: 3.2.0 resolution: "mdast-util-mdx-jsx@npm:3.2.0" @@ -8931,6 +10288,19 @@ __metadata: languageName: node linkType: hard +"mdast-util-mdx@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-mdx@npm:2.0.1" + dependencies: + mdast-util-from-markdown: "npm:^1.0.0" + mdast-util-mdx-expression: "npm:^1.0.0" + mdast-util-mdx-jsx: "npm:^2.0.0" + mdast-util-mdxjs-esm: "npm:^1.0.0" + mdast-util-to-markdown: "npm:^1.0.0" + checksum: 10/58230fccd8f499182a0b98879d90c0c13c533627c00b4509cd6100a9f0b4b6c70a460782dc62f2230753b40b8f0795ce2090ce7d6d131c5ab2c87b7698efc3ec + languageName: node + linkType: hard + "mdast-util-mdx@npm:^3.0.0": version: 3.0.0 resolution: "mdast-util-mdx@npm:3.0.0" @@ -8944,6 +10314,19 @@ __metadata: languageName: node linkType: hard +"mdast-util-mdxjs-esm@npm:^1.0.0": + version: 1.3.1 + resolution: "mdast-util-mdxjs-esm@npm:1.3.1" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + "@types/hast": "npm:^2.0.0" + "@types/mdast": "npm:^3.0.0" + mdast-util-from-markdown: "npm:^1.0.0" + mdast-util-to-markdown: "npm:^1.0.0" + checksum: 10/319b4e138b25079964bd69b79c6d5c1cc7001f2cd392f48f024e235e5c14240c78fc9016c5c9c8001eb03e6efd3a2b06fcf1da62104ae94f93f65d12301c7957 + languageName: node + linkType: hard + "mdast-util-mdxjs-esm@npm:^2.0.0": version: 2.0.1 resolution: "mdast-util-mdxjs-esm@npm:2.0.1" @@ -8958,6 +10341,16 @@ __metadata: languageName: node linkType: hard +"mdast-util-phrasing@npm:^3.0.0": + version: 3.0.1 + resolution: "mdast-util-phrasing@npm:3.0.1" + dependencies: + "@types/mdast": "npm:^3.0.0" + unist-util-is: "npm:^5.0.0" + checksum: 10/c5b616d9b1eb76a6b351d195d94318494722525a12a89d9c8a3b091af7db3dd1fc55d294f9d29266d8159a8267b0df4a7a133bda8a3909d5331c383e1e1ff328 + languageName: node + linkType: hard + "mdast-util-phrasing@npm:^4.0.0": version: 4.1.0 resolution: "mdast-util-phrasing@npm:4.1.0" @@ -8968,6 +10361,22 @@ __metadata: languageName: node linkType: hard +"mdast-util-to-hast@npm:^12.1.0": + version: 12.3.0 + resolution: "mdast-util-to-hast@npm:12.3.0" + dependencies: + "@types/hast": "npm:^2.0.0" + "@types/mdast": "npm:^3.0.0" + mdast-util-definitions: "npm:^5.0.0" + micromark-util-sanitize-uri: "npm:^1.1.0" + trim-lines: "npm:^3.0.0" + unist-util-generated: "npm:^2.0.0" + unist-util-position: "npm:^4.0.0" + unist-util-visit: "npm:^4.0.0" + checksum: 10/82b72bf46863f0f5683dbf1c5917186ee2da2e06af1a5f5aaeca51b880f4cb2b3ae0463ebb4fa1a776f5d3c73f5fc6cd542920060cf5040f3d4431607ee73cce + languageName: node + linkType: hard + "mdast-util-to-hast@npm:^13.0.0": version: 13.2.1 resolution: "mdast-util-to-hast@npm:13.2.1" @@ -8985,6 +10394,22 @@ __metadata: languageName: node linkType: hard +"mdast-util-to-markdown@npm:^1.0.0, mdast-util-to-markdown@npm:^1.3.0": + version: 1.5.0 + resolution: "mdast-util-to-markdown@npm:1.5.0" + dependencies: + "@types/mdast": "npm:^3.0.0" + "@types/unist": "npm:^2.0.0" + longest-streak: "npm:^3.0.0" + mdast-util-phrasing: "npm:^3.0.0" + mdast-util-to-string: "npm:^3.0.0" + micromark-util-decode-string: "npm:^1.0.0" + unist-util-visit: "npm:^4.0.0" + zwitch: "npm:^2.0.0" + checksum: 10/713f674588a01969a2ce524a69985bd57e507377eea2c4ba69800fb305414468b30144ae9b837fbdde8c609877673140e4f56f6cabe9e0e2bc1487291e3c5144 + languageName: node + linkType: hard + "mdast-util-to-markdown@npm:^2.0.0": version: 2.1.2 resolution: "mdast-util-to-markdown@npm:2.1.2" @@ -9002,6 +10427,15 @@ __metadata: languageName: node linkType: hard +"mdast-util-to-string@npm:^3.0.0, mdast-util-to-string@npm:^3.1.0": + version: 3.2.0 + resolution: "mdast-util-to-string@npm:3.2.0" + dependencies: + "@types/mdast": "npm:^3.0.0" + checksum: 10/fafe201c12a0d412a875fe8540bf70b4360f3775fb7f0d19403ba7b59e50f74f730e3b405c72ad940bc8a3ec1ba311f76dfca61c4ce585dce1ccda2168ec244f + languageName: node + linkType: hard + "mdast-util-to-string@npm:^4.0.0": version: 4.0.0 resolution: "mdast-util-to-string@npm:4.0.0" @@ -9018,6 +10452,34 @@ __metadata: languageName: node linkType: hard +"mdx-bundler@npm:^9.2.1": + version: 9.2.1 + resolution: "mdx-bundler@npm:9.2.1" + dependencies: + "@babel/runtime": "npm:^7.16.3" + "@esbuild-plugins/node-resolve": "npm:^0.1.4" + "@fal-works/esbuild-plugin-global-externals": "npm:^2.1.2" + "@mdx-js/esbuild": "npm:^2.0.0" + gray-matter: "npm:^4.0.3" + remark-frontmatter: "npm:^4.0.1" + remark-mdx-frontmatter: "npm:^1.1.1" + uuid: "npm:^8.3.2" + vfile: "npm:^5.3.2" + peerDependencies: + esbuild: 0.* + checksum: 10/1da8ba3881188f77f13f381da228abbe62b0515549c83093757e5c58cbde1c9d0f6e89047c977317e68221617d69c82dd9dc287ac266b2cf5c61e8f0797a43af + languageName: node + linkType: hard + +"memfs@npm:^3.5.1": + version: 3.5.3 + resolution: "memfs@npm:3.5.3" + dependencies: + fs-monkey: "npm:^1.0.4" + checksum: 10/7c9cdb453a6b06e87f11e2dbe6c518fd3c1c1581b370ffa24f42f3fd5b1db8c2203f596e43321a0032963f3e9b66400f2c3cf043904ac496d6ae33eafd0878fe + languageName: node + linkType: hard + "merge-refs@npm:^1.3.0": version: 1.3.0 resolution: "merge-refs@npm:1.3.0" @@ -9065,6 +10527,30 @@ __metadata: languageName: node linkType: hard +"micromark-core-commonmark@npm:^1.0.0, micromark-core-commonmark@npm:^1.0.1": + version: 1.1.0 + resolution: "micromark-core-commonmark@npm:1.1.0" + dependencies: + decode-named-character-reference: "npm:^1.0.0" + micromark-factory-destination: "npm:^1.0.0" + micromark-factory-label: "npm:^1.0.0" + micromark-factory-space: "npm:^1.0.0" + micromark-factory-title: "npm:^1.0.0" + micromark-factory-whitespace: "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-chunked: "npm:^1.0.0" + micromark-util-classify-character: "npm:^1.0.0" + micromark-util-html-tag-name: "npm:^1.0.0" + micromark-util-normalize-identifier: "npm:^1.0.0" + micromark-util-resolve-all: "npm:^1.0.0" + micromark-util-subtokenize: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.1" + uvu: "npm:^0.5.0" + checksum: 10/a73694d223ac8baad8ff00597a3c39d61f5b32bfd56fe4bcf295d75b2a4e8e67fb2edbfc7cc287b362b9d7f6d24fce08b6a7e8b5b155d79bcc1e4d9b2756ffb2 + languageName: node + linkType: hard + "micromark-core-commonmark@npm:^2.0.0": version: 2.0.3 resolution: "micromark-core-commonmark@npm:2.0.3" @@ -9089,6 +10575,34 @@ __metadata: languageName: node linkType: hard +"micromark-extension-frontmatter@npm:^1.0.0": + version: 1.1.1 + resolution: "micromark-extension-frontmatter@npm:1.1.1" + dependencies: + fault: "npm:^2.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/3986f5154395e9e5d9de2e81c9db72f2b39b79f264d9a3739adb82a28982ae2926695cb3630b630d5f0042061fb57b2b33a65edc8b893dead98a235368b0c61b + languageName: node + linkType: hard + +"micromark-extension-mdx-expression@npm:^1.0.0": + version: 1.0.8 + resolution: "micromark-extension-mdx-expression@npm:1.0.8" + dependencies: + "@types/estree": "npm:^1.0.0" + micromark-factory-mdx-expression: "npm:^1.0.0" + micromark-factory-space: "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-events-to-acorn: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + uvu: "npm:^0.5.0" + checksum: 10/ea8b01bdd2ba7c5efad1620c89346e2c754814fa758729c4181cf9ea32d4e299bf86022a9d4383779e71ad5fa277e8da1aaba8b16db985da4f5517c0b2b4954f + languageName: node + linkType: hard + "micromark-extension-mdx-expression@npm:^3.0.0": version: 3.0.1 resolution: "micromark-extension-mdx-expression@npm:3.0.1" @@ -9105,6 +10619,24 @@ __metadata: languageName: node linkType: hard +"micromark-extension-mdx-jsx@npm:^1.0.0": + version: 1.0.5 + resolution: "micromark-extension-mdx-jsx@npm:1.0.5" + dependencies: + "@types/acorn": "npm:^4.0.0" + "@types/estree": "npm:^1.0.0" + estree-util-is-identifier-name: "npm:^2.0.0" + micromark-factory-mdx-expression: "npm:^1.0.0" + micromark-factory-space: "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + uvu: "npm:^0.5.0" + vfile-message: "npm:^3.0.0" + checksum: 10/0abcba8f156b13f7fee105836de371cd6234e73b7107fc2d13d2daf9ad9f315060de374c7b61c2647598411d90182f026310eb0f6ec189d0db7b5e59f45e5071 + languageName: node + linkType: hard + "micromark-extension-mdx-jsx@npm:^3.0.0": version: 3.0.2 resolution: "micromark-extension-mdx-jsx@npm:3.0.2" @@ -9123,6 +10655,15 @@ __metadata: languageName: node linkType: hard +"micromark-extension-mdx-md@npm:^1.0.0": + version: 1.0.1 + resolution: "micromark-extension-mdx-md@npm:1.0.1" + dependencies: + micromark-util-types: "npm:^1.0.0" + checksum: 10/ae4dfc7149d3219e754e3ed9b1f63bf09a6b7eba6289edf61be0456b27ce3c50c87880f18ed7ee77a7eebe1ce3aa9284a253e72126478ca20322ef81af5ea50b + languageName: node + linkType: hard + "micromark-extension-mdx-md@npm:^2.0.0": version: 2.0.0 resolution: "micromark-extension-mdx-md@npm:2.0.0" @@ -9132,6 +10673,23 @@ __metadata: languageName: node linkType: hard +"micromark-extension-mdxjs-esm@npm:^1.0.0": + version: 1.0.5 + resolution: "micromark-extension-mdxjs-esm@npm:1.0.5" + dependencies: + "@types/estree": "npm:^1.0.0" + micromark-core-commonmark: "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-events-to-acorn: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + unist-util-position-from-estree: "npm:^1.1.0" + uvu: "npm:^0.5.0" + vfile-message: "npm:^3.0.0" + checksum: 10/a8b43e32264adadb9069807ba7c65916c70dc47e23920f0519aea93e547708bf3668f66fd3bf223095d636a38e1dec53953d065f86d7b4416a8fb30ce30e97b3 + languageName: node + linkType: hard + "micromark-extension-mdxjs-esm@npm:^3.0.0": version: 3.0.0 resolution: "micromark-extension-mdxjs-esm@npm:3.0.0" @@ -9149,6 +10707,22 @@ __metadata: languageName: node linkType: hard +"micromark-extension-mdxjs@npm:^1.0.0": + version: 1.0.1 + resolution: "micromark-extension-mdxjs@npm:1.0.1" + dependencies: + acorn: "npm:^8.0.0" + acorn-jsx: "npm:^5.0.0" + micromark-extension-mdx-expression: "npm:^1.0.0" + micromark-extension-mdx-jsx: "npm:^1.0.0" + micromark-extension-mdx-md: "npm:^1.0.0" + micromark-extension-mdxjs-esm: "npm:^1.0.0" + micromark-util-combine-extensions: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/3ce9990814e9b5ebfdfc5df6feca8b352bd0088f99e602e23032b0138eeddf0b57f1ad1e3ba9621c4bcd68136dd995f049c728c5a86d68b4fb03cc238bf27271 + languageName: node + linkType: hard + "micromark-extension-mdxjs@npm:^3.0.0": version: 3.0.0 resolution: "micromark-extension-mdxjs@npm:3.0.0" @@ -9165,6 +10739,17 @@ __metadata: languageName: node linkType: hard +"micromark-factory-destination@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-destination@npm:1.1.0" + dependencies: + micromark-util-character: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/9e2b5fb5fedbf622b687e20d51eb3d56ae90c0e7ecc19b37bd5285ec392c1e56f6e21aa7cfcb3c01eda88df88fe528f3acb91a5f57d7f4cba310bc3cd7f824fa + languageName: node + linkType: hard + "micromark-factory-destination@npm:^2.0.0": version: 2.0.1 resolution: "micromark-factory-destination@npm:2.0.1" @@ -9176,6 +10761,18 @@ __metadata: languageName: node linkType: hard +"micromark-factory-label@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-label@npm:1.1.0" + dependencies: + micromark-util-character: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + uvu: "npm:^0.5.0" + checksum: 10/fcda48f1287d9b148c562c627418a2ab759cdeae9c8e017910a0cba94bb759a96611e1fc6df33182e97d28fbf191475237298983bb89ef07d5b02464b1ad28d5 + languageName: node + linkType: hard + "micromark-factory-label@npm:^2.0.0": version: 2.0.1 resolution: "micromark-factory-label@npm:2.0.1" @@ -9188,6 +10785,22 @@ __metadata: languageName: node linkType: hard +"micromark-factory-mdx-expression@npm:^1.0.0": + version: 1.0.9 + resolution: "micromark-factory-mdx-expression@npm:1.0.9" + dependencies: + "@types/estree": "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-events-to-acorn: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + unist-util-position-from-estree: "npm:^1.0.0" + uvu: "npm:^0.5.0" + vfile-message: "npm:^3.0.0" + checksum: 10/2a4367c50ab59a95a6c68befa64324cf3234ed3ae1b4c712254579113be2c6d043149e872e09515f0c42a88a753207fce95cab6344b039404ba88fbaccb94bc6 + languageName: node + linkType: hard + "micromark-factory-mdx-expression@npm:^2.0.0": version: 2.0.3 resolution: "micromark-factory-mdx-expression@npm:2.0.3" @@ -9205,6 +10818,16 @@ __metadata: languageName: node linkType: hard +"micromark-factory-space@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-space@npm:1.1.0" + dependencies: + micromark-util-character: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/b58435076b998a7e244259a4694eb83c78915581206b6e7fc07b34c6abd36a1726ade63df8972fbf6c8fa38eecb9074f4e17be8d53f942e3b3d23d1a0ecaa941 + languageName: node + linkType: hard + "micromark-factory-space@npm:^2.0.0": version: 2.0.1 resolution: "micromark-factory-space@npm:2.0.1" @@ -9215,6 +10838,18 @@ __metadata: languageName: node linkType: hard +"micromark-factory-title@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-title@npm:1.1.0" + dependencies: + micromark-factory-space: "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/4432d3dbc828c81f483c5901b0c6591a85d65a9e33f7d96ba7c3ae821617a0b3237ff5faf53a9152d00aaf9afb3a9f185b205590f40ed754f1d9232e0e9157b1 + languageName: node + linkType: hard + "micromark-factory-title@npm:^2.0.0": version: 2.0.1 resolution: "micromark-factory-title@npm:2.0.1" @@ -9227,6 +10862,18 @@ __metadata: languageName: node linkType: hard +"micromark-factory-whitespace@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-factory-whitespace@npm:1.1.0" + dependencies: + micromark-factory-space: "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/ef0fa682c7d593d85a514ee329809dee27d10bc2a2b65217d8ef81173e33b8e83c549049764b1ad851adfe0a204dec5450d9d20a4ca8598f6c94533a73f73fcd + languageName: node + linkType: hard + "micromark-factory-whitespace@npm:^2.0.0": version: 2.0.1 resolution: "micromark-factory-whitespace@npm:2.0.1" @@ -9239,6 +10886,16 @@ __metadata: languageName: node linkType: hard +"micromark-util-character@npm:^1.0.0": + version: 1.2.0 + resolution: "micromark-util-character@npm:1.2.0" + dependencies: + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/88cf80f9b4c95266f24814ef587fb4180454668dcc3be4ac829e1227188cf349c8981bfca29e3eab1682f324c2c47544c0b0b799a26fbf9df5f156c6a84c970c + languageName: node + linkType: hard + "micromark-util-character@npm:^2.0.0": version: 2.1.1 resolution: "micromark-util-character@npm:2.1.1" @@ -9249,6 +10906,15 @@ __metadata: languageName: node linkType: hard +"micromark-util-chunked@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-chunked@npm:1.1.0" + dependencies: + micromark-util-symbol: "npm:^1.0.0" + checksum: 10/c435bde9110cb595e3c61b7f54c2dc28ee03e6a57fa0fc1e67e498ad8bac61ee5a7457a2b6a73022ddc585676ede4b912d28dcf57eb3bd6951e54015e14dc20b + languageName: node + linkType: hard + "micromark-util-chunked@npm:^2.0.0": version: 2.0.1 resolution: "micromark-util-chunked@npm:2.0.1" @@ -9258,6 +10924,17 @@ __metadata: languageName: node linkType: hard +"micromark-util-classify-character@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-classify-character@npm:1.1.0" + dependencies: + micromark-util-character: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/8499cb0bb1f7fb946f5896285fcca65cd742f66cd3e79ba7744792bd413ec46834f932a286de650349914d02e822946df3b55d03e6a8e1d245d1ddbd5102e5b0 + languageName: node + linkType: hard + "micromark-util-classify-character@npm:^2.0.0": version: 2.0.1 resolution: "micromark-util-classify-character@npm:2.0.1" @@ -9269,6 +10946,16 @@ __metadata: languageName: node linkType: hard +"micromark-util-combine-extensions@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-combine-extensions@npm:1.1.0" + dependencies: + micromark-util-chunked: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + checksum: 10/ee78464f5d4b61ccb437850cd2d7da4d690b260bca4ca7a79c4bb70291b84f83988159e373b167181b6716cb197e309bc6e6c96a68cc3ba9d50c13652774aba9 + languageName: node + linkType: hard + "micromark-util-combine-extensions@npm:^2.0.0": version: 2.0.1 resolution: "micromark-util-combine-extensions@npm:2.0.1" @@ -9279,6 +10966,15 @@ __metadata: languageName: node linkType: hard +"micromark-util-decode-numeric-character-reference@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-decode-numeric-character-reference@npm:1.1.0" + dependencies: + micromark-util-symbol: "npm:^1.0.0" + checksum: 10/4733fe75146e37611243f055fc6847137b66f0cde74d080e33bd26d0408c1d6f44cabc984063eee5968b133cb46855e729d555b9ff8d744652262b7b51feec73 + languageName: node + linkType: hard + "micromark-util-decode-numeric-character-reference@npm:^2.0.0": version: 2.0.2 resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.2" @@ -9288,6 +10984,18 @@ __metadata: languageName: node linkType: hard +"micromark-util-decode-string@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-decode-string@npm:1.1.0" + dependencies: + decode-named-character-reference: "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-decode-numeric-character-reference: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + checksum: 10/f1625155db452f15aa472918499689ba086b9c49d1322a08b22bfbcabe918c61b230a3002c8bc3ea9b1f52ca7a9bb1c3dd43ccb548c7f5f8b16c24a1ae77a813 + languageName: node + linkType: hard + "micromark-util-decode-string@npm:^2.0.0": version: 2.0.1 resolution: "micromark-util-decode-string@npm:2.0.1" @@ -9300,6 +11008,13 @@ __metadata: languageName: node linkType: hard +"micromark-util-encode@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-encode@npm:1.1.0" + checksum: 10/4ef29d02b12336918cea6782fa87c8c578c67463925221d4e42183a706bde07f4b8b5f9a5e1c7ce8c73bb5a98b261acd3238fecd152e6dd1cdfa2d1ae11b60a0 + languageName: node + linkType: hard + "micromark-util-encode@npm:^2.0.0": version: 2.0.1 resolution: "micromark-util-encode@npm:2.0.1" @@ -9307,6 +11022,22 @@ __metadata: languageName: node linkType: hard +"micromark-util-events-to-acorn@npm:^1.0.0": + version: 1.2.3 + resolution: "micromark-util-events-to-acorn@npm:1.2.3" + dependencies: + "@types/acorn": "npm:^4.0.0" + "@types/estree": "npm:^1.0.0" + "@types/unist": "npm:^2.0.0" + estree-util-visit: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + uvu: "npm:^0.5.0" + vfile-message: "npm:^3.0.0" + checksum: 10/192dc159154d491f7c91116ec7721f12e02ed44fc57fe101402fd2c5156e3adaad9b9276a8ad3245ef0f05d04d6ecb98f591f319b26bd062d623c79dc0986c79 + languageName: node + linkType: hard + "micromark-util-events-to-acorn@npm:^2.0.0": version: 2.0.3 resolution: "micromark-util-events-to-acorn@npm:2.0.3" @@ -9322,6 +11053,13 @@ __metadata: languageName: node linkType: hard +"micromark-util-html-tag-name@npm:^1.0.0": + version: 1.2.0 + resolution: "micromark-util-html-tag-name@npm:1.2.0" + checksum: 10/ccf0fa99b5c58676dc5192c74665a3bfd1b536fafaf94723bd7f31f96979d589992df6fcf2862eba290ef18e6a8efb30ec8e1e910d9f3fc74f208871e9f84750 + languageName: node + linkType: hard + "micromark-util-html-tag-name@npm:^2.0.0": version: 2.0.1 resolution: "micromark-util-html-tag-name@npm:2.0.1" @@ -9329,6 +11067,15 @@ __metadata: languageName: node linkType: hard +"micromark-util-normalize-identifier@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-normalize-identifier@npm:1.1.0" + dependencies: + micromark-util-symbol: "npm:^1.0.0" + checksum: 10/8655bea41ffa4333e03fc22462cb42d631bbef9c3c07b625fd852b7eb442a110f9d2e5902a42e65188d85498279569502bf92f3434a1180fc06f7c37edfbaee2 + languageName: node + linkType: hard + "micromark-util-normalize-identifier@npm:^2.0.0": version: 2.0.1 resolution: "micromark-util-normalize-identifier@npm:2.0.1" @@ -9338,6 +11085,15 @@ __metadata: languageName: node linkType: hard +"micromark-util-resolve-all@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-resolve-all@npm:1.1.0" + dependencies: + micromark-util-types: "npm:^1.0.0" + checksum: 10/1ce6c0237cd3ca061e76fae6602cf95014e764a91be1b9f10d36cb0f21ca88f9a07de8d49ab8101efd0b140a4fbfda6a1efb72027ab3f4d5b54c9543271dc52c + languageName: node + linkType: hard + "micromark-util-resolve-all@npm:^2.0.0": version: 2.0.1 resolution: "micromark-util-resolve-all@npm:2.0.1" @@ -9347,6 +11103,17 @@ __metadata: languageName: node linkType: hard +"micromark-util-sanitize-uri@npm:^1.0.0, micromark-util-sanitize-uri@npm:^1.1.0": + version: 1.2.0 + resolution: "micromark-util-sanitize-uri@npm:1.2.0" + dependencies: + micromark-util-character: "npm:^1.0.0" + micromark-util-encode: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + checksum: 10/0d024100d95ffb88bf75f3360e305b545c1eb745430959b8633f7aa93f37ec401fc7094c90c97298409a9e30d94d53b895bae224e1bb966bea114976cfa0fd48 + languageName: node + linkType: hard + "micromark-util-sanitize-uri@npm:^2.0.0": version: 2.0.1 resolution: "micromark-util-sanitize-uri@npm:2.0.1" @@ -9358,6 +11125,18 @@ __metadata: languageName: node linkType: hard +"micromark-util-subtokenize@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-subtokenize@npm:1.1.0" + dependencies: + micromark-util-chunked: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.0" + uvu: "npm:^0.5.0" + checksum: 10/075a1db6ea586d65827d3eead33dbfc520c4e43659c93fcd8fd82f44a7b75cfe61dcde967a3dfcc2ffd999347440ba5aa6698e65a04f3fc627e13e9f12a1a910 + languageName: node + linkType: hard + "micromark-util-subtokenize@npm:^2.0.0": version: 2.1.0 resolution: "micromark-util-subtokenize@npm:2.1.0" @@ -9370,6 +11149,13 @@ __metadata: languageName: node linkType: hard +"micromark-util-symbol@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-symbol@npm:1.1.0" + checksum: 10/a26b6b1efd77a715a4d9bbe0a5338eaf3d04ea5e85733e34fee56dfeabf64495c0afc5438fe5220316884cd3a5eae1f17768e0ff4e117827ea4a653897466f86 + languageName: node + linkType: hard + "micromark-util-symbol@npm:^2.0.0": version: 2.0.1 resolution: "micromark-util-symbol@npm:2.0.1" @@ -9377,6 +11163,13 @@ __metadata: languageName: node linkType: hard +"micromark-util-types@npm:^1.0.0, micromark-util-types@npm:^1.0.1": + version: 1.1.0 + resolution: "micromark-util-types@npm:1.1.0" + checksum: 10/287ac5de4a3802bb6f6c3842197c294997a488db1c0486e03c7a8e674d9eb7720c17dda1bcb814814b8343b338c4826fcbc0555f3e75463712a60dcdb53a028e + languageName: node + linkType: hard + "micromark-util-types@npm:^2.0.0": version: 2.0.2 resolution: "micromark-util-types@npm:2.0.2" @@ -9384,6 +11177,31 @@ __metadata: languageName: node linkType: hard +"micromark@npm:^3.0.0": + version: 3.2.0 + resolution: "micromark@npm:3.2.0" + dependencies: + "@types/debug": "npm:^4.0.0" + debug: "npm:^4.0.0" + decode-named-character-reference: "npm:^1.0.0" + micromark-core-commonmark: "npm:^1.0.1" + micromark-factory-space: "npm:^1.0.0" + micromark-util-character: "npm:^1.0.0" + micromark-util-chunked: "npm:^1.0.0" + micromark-util-combine-extensions: "npm:^1.0.0" + micromark-util-decode-numeric-character-reference: "npm:^1.0.0" + micromark-util-encode: "npm:^1.0.0" + micromark-util-normalize-identifier: "npm:^1.0.0" + micromark-util-resolve-all: "npm:^1.0.0" + micromark-util-sanitize-uri: "npm:^1.0.0" + micromark-util-subtokenize: "npm:^1.0.0" + micromark-util-symbol: "npm:^1.0.0" + micromark-util-types: "npm:^1.0.1" + uvu: "npm:^0.5.0" + checksum: 10/560a4a501efc3859d622461aaa9345fb95b99a2f34d3d3f2a775ab04de1dd857cb0f642083a6b28ab01bd817f5f0741a1be9857fd702f45e04a3752927a66719 + languageName: node + linkType: hard + "micromark@npm:^4.0.0": version: 4.0.2 resolution: "micromark@npm:4.0.2" @@ -9409,7 +11227,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -9569,6 +11387,13 @@ __metadata: languageName: node linkType: hard +"mri@npm:^1.1.0": + version: 1.2.0 + resolution: "mri@npm:1.2.0" + checksum: 10/6775a1d2228bb9d191ead4efc220bd6be64f943ad3afd4dcb3b3ac8fc7b87034443f666e38805df38e8d047b29f910c3cc7810da0109af83e42c82c73bd3f6bc + languageName: node + linkType: hard + "ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" @@ -9626,6 +11451,21 @@ __metadata: languageName: node linkType: hard +"next-contentlayer@npm:^0.3.4": + version: 0.3.4 + resolution: "next-contentlayer@npm:0.3.4" + dependencies: + "@contentlayer/core": "npm:0.3.4" + "@contentlayer/utils": "npm:0.3.4" + peerDependencies: + contentlayer: 0.3.4 + next: ^12 || ^13 + react: "*" + react-dom: "*" + checksum: 10/dfcc09eae8fa064c2d538c6aa027b8330967e9e92263758d076a121ca58bebff4bbc3d84d2f952c8e7d5e29a7ecd98ef68cd8478e94731d7b173a7c598530168 + languageName: node + linkType: hard + "next-mdx-remote@npm:^5.0.0": version: 5.0.0 resolution: "next-mdx-remote@npm:5.0.0" @@ -9711,6 +11551,16 @@ __metadata: languageName: node linkType: hard +"no-case@npm:^3.0.4": + version: 3.0.4 + resolution: "no-case@npm:3.0.4" + dependencies: + lower-case: "npm:^2.0.2" + tslib: "npm:^2.0.3" + checksum: 10/0b2ebc113dfcf737d48dde49cfebf3ad2d82a8c3188e7100c6f375e30eafbef9e9124aadc3becef237b042fd5eb0aad2fd78669c20972d045bbe7fea8ba0be5c + languageName: node + linkType: hard + "node-abi@npm:^3.3.0": version: 3.85.0 resolution: "node-abi@npm:3.85.0" @@ -9729,6 +11579,24 @@ __metadata: languageName: node linkType: hard +"node-domexception@npm:^1.0.0": + version: 1.0.0 + resolution: "node-domexception@npm:1.0.0" + checksum: 10/e332522f242348c511640c25a6fc7da4f30e09e580c70c6b13cb0be83c78c3e71c8d4665af2527e869fc96848924a4316ae7ec9014c091e2156f41739d4fa233 + languageName: node + linkType: hard + +"node-fetch@npm:^3.0.0": + version: 3.3.2 + resolution: "node-fetch@npm:3.3.2" + dependencies: + data-uri-to-buffer: "npm:^4.0.0" + fetch-blob: "npm:^3.1.4" + formdata-polyfill: "npm:^4.0.10" + checksum: 10/24207ca8c81231c7c59151840e3fded461d67a31cf3e3b3968e12201a42f89ce4a0b5fb7079b1fa0a4655957b1ca9257553200f03a9f668b45ebad265ca5593d + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 12.1.0 resolution: "node-gyp@npm:12.1.0" @@ -9903,6 +11771,13 @@ __metadata: languageName: node linkType: hard +"oo-ascii-tree@npm:^1.84.0": + version: 1.121.0 + resolution: "oo-ascii-tree@npm:1.121.0" + checksum: 10/2793727ead8000942ba37133bd5478473600420b4ace57360315d43736cc993380862175be37f5b5919537549cd2a44caaced76bec4d507ae4d28e5d5244d9f5 + languageName: node + linkType: hard + "optionator@npm:^0.9.3": version: 0.9.4 resolution: "optionator@npm:0.9.4" @@ -10037,6 +11912,13 @@ __metadata: languageName: node linkType: hard +"parse5@npm:^6.0.0": + version: 6.0.1 + resolution: "parse5@npm:6.0.1" + checksum: 10/dfb110581f62bd1425725a7c784ae022a24669bd0efc24b58c71fc731c4d868193e2ebd85b74cde2dbb965e4dcf07059b1e651adbec1b3b5267531bd132fdb75 + languageName: node + linkType: hard + "parse5@npm:^7.1.2": version: 7.3.0 resolution: "parse5@npm:7.3.0" @@ -10046,6 +11928,16 @@ __metadata: languageName: node linkType: hard +"pascal-case@npm:^3.1.2": + version: 3.1.2 + resolution: "pascal-case@npm:3.1.2" + dependencies: + no-case: "npm:^3.0.4" + tslib: "npm:^2.0.3" + checksum: 10/ba98bfd595fc91ef3d30f4243b1aee2f6ec41c53b4546bfa3039487c367abaa182471dcfc830a1f9e1a0df00c14a370514fa2b3a1aacc68b15a460c31116873e + languageName: node + linkType: hard + "path-data-parser@npm:0.1.0, path-data-parser@npm:^0.1.0": version: 0.1.0 resolution: "path-data-parser@npm:0.1.0" @@ -10125,6 +12017,17 @@ __metadata: languageName: node linkType: hard +"periscopic@npm:^3.0.0": + version: 3.1.0 + resolution: "periscopic@npm:3.1.0" + dependencies: + "@types/estree": "npm:^1.0.0" + estree-walker: "npm:^3.0.0" + is-reference: "npm:^3.0.0" + checksum: 10/088a85a6de42e2f34414392dec8348218508609389ecb8002b009c357fa26bdfb67c385d9ec0e4e1089e27748ddc0789254073ef78fd576a32b5e641474c56ba + languageName: node + linkType: hard + "picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" @@ -10424,6 +12327,13 @@ __metadata: languageName: node linkType: hard +"property-information@npm:^6.0.0": + version: 6.5.0 + resolution: "property-information@npm:6.5.0" + checksum: 10/fced94f3a09bf651ad1824d1bdc8980428e3e480e6d01e98df6babe2cc9d45a1c52eee9a7736d2006958f9b394eb5964dedd37e23038086ddc143fc2fd5e426c + languageName: node + linkType: hard + "property-information@npm:^7.0.0": version: 7.1.0 resolution: "property-information@npm:7.1.0" @@ -10625,6 +12535,26 @@ __metadata: languageName: node linkType: hard +"protobufjs@npm:^7.2.2, protobufjs@npm:^7.5.3": + version: 7.5.4 + resolution: "protobufjs@npm:7.5.4" + dependencies: + "@protobufjs/aspromise": "npm:^1.1.2" + "@protobufjs/base64": "npm:^1.1.2" + "@protobufjs/codegen": "npm:^2.0.4" + "@protobufjs/eventemitter": "npm:^1.1.0" + "@protobufjs/fetch": "npm:^1.1.0" + "@protobufjs/float": "npm:^1.0.2" + "@protobufjs/inquire": "npm:^1.1.0" + "@protobufjs/path": "npm:^1.1.2" + "@protobufjs/pool": "npm:^1.1.0" + "@protobufjs/utf8": "npm:^1.1.0" + "@types/node": "npm:>=13.7.0" + long: "npm:^5.0.0" + checksum: 10/88d677bb6f11a2ecec63fdd053dfe6d31120844d04e865efa9c8fbe0674cd077d6624ecfdf014018a20dcb114ae2a59c1b21966dd8073e920650c71370966439 + languageName: node + linkType: hard + "psl@npm:^1.1.33": version: 1.15.0 resolution: "psl@npm:1.15.0" @@ -11002,6 +12932,51 @@ __metadata: languageName: node linkType: hard +"rehype-stringify@npm:^9.0.3": + version: 9.0.4 + resolution: "rehype-stringify@npm:9.0.4" + dependencies: + "@types/hast": "npm:^2.0.0" + hast-util-to-html: "npm:^8.0.0" + unified: "npm:^10.0.0" + checksum: 10/b14bcbd15a97bdc25eb4e10532e46d0302c52271ee3e1b01de37d2c7d367403725d3e2a4581a1e1b9a11c6f51559788c8fb2bee13b8eafc4c2deef4f464676b6 + languageName: node + linkType: hard + +"remark-frontmatter@npm:^4.0.1": + version: 4.0.1 + resolution: "remark-frontmatter@npm:4.0.1" + dependencies: + "@types/mdast": "npm:^3.0.0" + mdast-util-frontmatter: "npm:^1.0.0" + micromark-extension-frontmatter: "npm:^1.0.0" + unified: "npm:^10.0.0" + checksum: 10/d458e4150af9dcf625193badfbb29c35fd20ac33bd5e6a210aee15d2f6bc9d262f2f4b6195c7f9ab157e2d78f256879a80eacadaeba0536d88548cc70d11dbb1 + languageName: node + linkType: hard + +"remark-mdx-frontmatter@npm:^1.1.1": + version: 1.1.1 + resolution: "remark-mdx-frontmatter@npm:1.1.1" + dependencies: + estree-util-is-identifier-name: "npm:^1.0.0" + estree-util-value-to-estree: "npm:^1.0.0" + js-yaml: "npm:^4.0.0" + toml: "npm:^3.0.0" + checksum: 10/a2d87e0d6cc7f541f7c854270e740da3bb403ee0398414aa77ee17df157853b692072eaff6242d439c20bf416c80908fdf44096771e25bfefd30e3463dace5e7 + languageName: node + linkType: hard + +"remark-mdx@npm:^2.0.0": + version: 2.3.0 + resolution: "remark-mdx@npm:2.3.0" + dependencies: + mdast-util-mdx: "npm:^2.0.0" + micromark-extension-mdxjs: "npm:^1.0.0" + checksum: 10/811419d0ec041f671e916798dbb305c07152469f1fe7a7a1388d0a13040170caba6d5e6c1719e90f9da5de2b989f97f6562fc4f65a7379b3ba1f90ad3e521765 + languageName: node + linkType: hard + "remark-mdx@npm:^3.0.0": version: 3.1.1 resolution: "remark-mdx@npm:3.1.1" @@ -11012,6 +12987,17 @@ __metadata: languageName: node linkType: hard +"remark-parse@npm:^10.0.0, remark-parse@npm:^10.0.2": + version: 10.0.2 + resolution: "remark-parse@npm:10.0.2" + dependencies: + "@types/mdast": "npm:^3.0.0" + mdast-util-from-markdown: "npm:^1.0.0" + unified: "npm:^10.0.0" + checksum: 10/184f48956734a58a7e157d83233e532ea289697f5ecebd1fb082cce79e6d9f5b1d3da72462356b2b3b5843643cee890280ffe3d21c9d4ad2d7d5e20bb5de7f14 + languageName: node + linkType: hard + "remark-parse@npm:^11.0.0": version: 11.0.0 resolution: "remark-parse@npm:11.0.0" @@ -11024,6 +13010,18 @@ __metadata: languageName: node linkType: hard +"remark-rehype@npm:^10.0.0, remark-rehype@npm:^10.1.0": + version: 10.1.0 + resolution: "remark-rehype@npm:10.1.0" + dependencies: + "@types/hast": "npm:^2.0.0" + "@types/mdast": "npm:^3.0.0" + mdast-util-to-hast: "npm:^12.1.0" + unified: "npm:^10.0.0" + checksum: 10/cf765b639d16872404b50d5945df0ba825d14f1150397dde804e7d9e2e856a7b7343c4dc3796c85e7c18ca84f3c989bd40e476bd194fc00a5a870e8a64ec30d9 + languageName: node + linkType: hard + "remark-rehype@npm:^11.0.0": version: 11.1.2 resolution: "remark-rehype@npm:11.1.2" @@ -11079,7 +13077,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.7, resolve@npm:^1.22.4, resolve@npm:^1.22.8": +"resolve@npm:^1.1.7, resolve@npm:^1.19.0, resolve@npm:^1.22.4, resolve@npm:^1.22.8": version: 1.22.11 resolution: "resolve@npm:1.22.11" dependencies: @@ -11105,7 +13103,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": version: 1.22.11 resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=c3c19d" dependencies: @@ -11293,6 +13291,15 @@ __metadata: languageName: node linkType: hard +"sade@npm:^1.7.3": + version: 1.8.1 + resolution: "sade@npm:1.8.1" + dependencies: + mri: "npm:^1.1.0" + checksum: 10/1c67ba03c94083e0ae307ff5564ecb86c2104c0f558042fdaa40ea0054f91a63a9783f14069870f2f784336adabb70f90f22a84dc457b5a25e859aaadefe0910 + languageName: node + linkType: hard + "safe-array-concat@npm:^1.1.3": version: 1.1.3 resolution: "safe-array-concat@npm:1.1.3" @@ -11399,7 +13406,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.5, semver@npm:^7.6.0, semver@npm:^7.7.1, semver@npm:^7.7.3": +"semver@npm:^7.3.5, semver@npm:^7.5.2, semver@npm:^7.6.0, semver@npm:^7.7.1, semver@npm:^7.7.3": version: 7.7.3 resolution: "semver@npm:7.7.3" bin: @@ -11674,6 +13681,23 @@ __metadata: languageName: node linkType: hard +"source-map-support@npm:^0.5.21": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 10/8317e12d84019b31e34b86d483dd41d6f832f389f7417faf8fc5c75a66a12d9686e47f589a0554a868b8482f037e23df9d040d29387eb16fa14cb85f091ba207 + languageName: node + linkType: hard + +"source-map@npm:^0.6.0": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10/59ef7462f1c29d502b3057e822cdbdae0b0e565302c4dd1a95e11e793d8d9d62006cdc10e0fd99163ca33ff2071360cf50ee13f90440806e7ed57d81cba2f7ff + languageName: node + linkType: hard + "source-map@npm:^0.7.0": version: 0.7.6 resolution: "source-map@npm:0.7.6" @@ -11735,7 +13759,7 @@ __metadata: languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -11945,6 +13969,15 @@ __metadata: languageName: node linkType: hard +"style-to-object@npm:^0.4.1": + version: 0.4.4 + resolution: "style-to-object@npm:0.4.4" + dependencies: + inline-style-parser: "npm:0.1.1" + checksum: 10/3101c0de5325e8051c3665125468af73578eba4712b818458b9f7ed732d7800f3b34e088e5c16f60070644db25316fa5a5b8b69e7f3414c879401eb074a2211e + languageName: node + linkType: hard + "styled-jsx@npm:5.1.6": version: 5.1.6 resolution: "styled-jsx@npm:5.1.6" @@ -12187,6 +14220,13 @@ __metadata: languageName: node linkType: hard +"toml@npm:^3.0.0": + version: 3.0.0 + resolution: "toml@npm:3.0.0" + checksum: 10/cfef0966868d552bd02e741f30945a611f70841b7cddb07ea2b17441fe32543985bc0a7c0dcf7971af26fcaf8a17712a485d911f46bfe28644536e9a71a2bd09 + languageName: node + linkType: hard + "tough-cookie@npm:^4.1.4": version: 4.1.4 resolution: "tough-cookie@npm:4.1.4" @@ -12245,6 +14285,13 @@ __metadata: languageName: node linkType: hard +"ts-pattern@npm:^4.3.0": + version: 4.3.0 + resolution: "ts-pattern@npm:4.3.0" + checksum: 10/bfece8241117031bc302e7dd657afc1d4f504c64ec745ca9f9ec3ea454e441fd1491dc73e10f62c3685ee51a740699244a716c4145d98bd61b38fcc067e81f81 + languageName: node + linkType: hard + "tsconfig-paths-webpack-plugin@npm:^4.2.0": version: 4.2.0 resolution: "tsconfig-paths-webpack-plugin@npm:4.2.0" @@ -12280,7 +14327,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2, tslib@npm:^2.8.0": +"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:^2.6.2, tslib@npm:^2.8.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 @@ -12312,6 +14359,13 @@ __metadata: languageName: node linkType: hard +"typanion@npm:^3.12.1, typanion@npm:^3.8.0": + version: 3.14.0 + resolution: "typanion@npm:3.14.0" + checksum: 10/5e88d9e6121ff0ec543f572152fdd1b70e9cca35406d79013ec8e08defa8ef96de5fec9e98da3afbd1eb4426b9e8e8fe423163d0b482e34a40103cab1ef29abd + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -12328,6 +14382,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^3.12.0": + version: 3.13.1 + resolution: "type-fest@npm:3.13.1" + checksum: 10/9a8a2359ada34c9b3affcaf3a8f73ee14c52779e89950db337ce66fb74c3399776c697c99f2532e9b16e10e61cfdba3b1c19daffb93b338b742f0acd0117ce12 + languageName: node + linkType: hard + "typed-array-buffer@npm:^1.0.3": version: 1.0.3 resolution: "typed-array-buffer@npm:1.0.3" @@ -12427,6 +14488,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~7.16.0": + version: 7.16.0 + resolution: "undici-types@npm:7.16.0" + checksum: 10/db43439f69c2d94cc29f75cbfe9de86df87061d6b0c577ebe9bb3255f49b22c50162a7d7eb413b0458b6510b8ca299ac7cff38c3a29fbd31af9f504bcf7fbc0d + languageName: node + linkType: hard + "undici-types@npm:~7.8.0": version: 7.8.0 resolution: "undici-types@npm:7.8.0" @@ -12434,6 +14502,21 @@ __metadata: languageName: node linkType: hard +"unified@npm:^10.0.0, unified@npm:^10.1.2": + version: 10.1.2 + resolution: "unified@npm:10.1.2" + dependencies: + "@types/unist": "npm:^2.0.0" + bail: "npm:^2.0.0" + extend: "npm:^3.0.0" + is-buffer: "npm:^2.0.0" + is-plain-obj: "npm:^4.0.0" + trough: "npm:^2.0.0" + vfile: "npm:^5.0.0" + checksum: 10/6cffebcefc3290be26d25a58ba714cda943142782baf320fddf374ca3a319bdaabb006f96df4be17b8b367f5e6f6e113b1027c52ef66154846a7a110550f6688 + languageName: node + linkType: hard + "unified@npm:^11.0.0": version: 11.0.5 resolution: "unified@npm:11.0.5" @@ -12467,6 +14550,13 @@ __metadata: languageName: node linkType: hard +"unist-util-generated@npm:^2.0.0": + version: 2.0.1 + resolution: "unist-util-generated@npm:2.0.1" + checksum: 10/0528642918683f1518ab7a50cf8c900df10d8717b58bd2fb05aab29393b1c4050fd2740792f18d477b52f942bfb0e6e00023e985c0a7bd63859d3d836b56e4ce + languageName: node + linkType: hard + "unist-util-is@npm:^5.0.0": version: 5.2.1 resolution: "unist-util-is@npm:5.2.1" @@ -12485,6 +14575,15 @@ __metadata: languageName: node linkType: hard +"unist-util-position-from-estree@npm:^1.0.0, unist-util-position-from-estree@npm:^1.1.0": + version: 1.1.2 + resolution: "unist-util-position-from-estree@npm:1.1.2" + dependencies: + "@types/unist": "npm:^2.0.0" + checksum: 10/e3f4060e2a9e894c6ed63489c5a7cb58ff282e5dae9497cbc2073033ca74d6e412af4d4d342c97aea08d997c908b8bce2fe43a2062aafc2bb3f266533016588b + languageName: node + linkType: hard + "unist-util-position-from-estree@npm:^2.0.0": version: 2.0.0 resolution: "unist-util-position-from-estree@npm:2.0.0" @@ -12494,6 +14593,15 @@ __metadata: languageName: node linkType: hard +"unist-util-position@npm:^4.0.0": + version: 4.0.4 + resolution: "unist-util-position@npm:4.0.4" + dependencies: + "@types/unist": "npm:^2.0.0" + checksum: 10/aedbc5d112cdab85b752a7dacd8f04233655f00e08948a42f6e49682467c6fc0c531c91acc71188da5ac8acfea9e67d72bc054127d1c4b76b31792cfb5132423 + languageName: node + linkType: hard + "unist-util-position@npm:^5.0.0": version: 5.0.0 resolution: "unist-util-position@npm:5.0.0" @@ -12503,6 +14611,16 @@ __metadata: languageName: node linkType: hard +"unist-util-remove-position@npm:^4.0.0": + version: 4.0.2 + resolution: "unist-util-remove-position@npm:4.0.2" + dependencies: + "@types/unist": "npm:^2.0.0" + unist-util-visit: "npm:^4.0.0" + checksum: 10/b809693035a110a597b8ce7dc64c49dd8b8e0f4cb57e51850b1677ac7f3b831620992ab921df1272f08135cb5f507c2c495c2f1e9531c51511102cce4119ff5d + languageName: node + linkType: hard + "unist-util-remove@npm:^3.1.0": version: 3.1.1 resolution: "unist-util-remove@npm:3.1.1" @@ -12514,6 +14632,15 @@ __metadata: languageName: node linkType: hard +"unist-util-stringify-position@npm:^3.0.0": + version: 3.0.3 + resolution: "unist-util-stringify-position@npm:3.0.3" + dependencies: + "@types/unist": "npm:^2.0.0" + checksum: 10/07913e4fd77fe57d95f8b2f771354f97a29082229c1ad14ceedce6bbc77b2d784ca8296563335471cdca97915e548204bd6f098ea5b808b822b4b54087662cfb + languageName: node + linkType: hard + "unist-util-stringify-position@npm:^4.0.0": version: 4.0.0 resolution: "unist-util-stringify-position@npm:4.0.0" @@ -12523,7 +14650,7 @@ __metadata: languageName: node linkType: hard -"unist-util-visit-parents@npm:^5.0.0": +"unist-util-visit-parents@npm:^5.0.0, unist-util-visit-parents@npm:^5.1.1": version: 5.1.3 resolution: "unist-util-visit-parents@npm:5.1.3" dependencies: @@ -12543,6 +14670,17 @@ __metadata: languageName: node linkType: hard +"unist-util-visit@npm:^4.0.0": + version: 4.1.2 + resolution: "unist-util-visit@npm:4.1.2" + dependencies: + "@types/unist": "npm:^2.0.0" + unist-util-is: "npm:^5.0.0" + unist-util-visit-parents: "npm:^5.1.1" + checksum: 10/e3b20c6b1f5ae1b7b40bbf9be49103a342d98fad98bdf958110c20d72e5923bd3f12966b6702459bc61ab832facb5af418a79af87cefa7a8a41b892369678b13 + languageName: node + linkType: hard + "unist-util-visit@npm:^5.0.0": version: 5.0.0 resolution: "unist-util-visit@npm:5.0.0" @@ -12726,6 +14864,39 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^8.3.2": + version: 8.3.2 + resolution: "uuid@npm:8.3.2" + bin: + uuid: dist/bin/uuid + checksum: 10/9a5f7aa1d6f56dd1e8d5f2478f855f25c645e64e26e347a98e98d95781d5ed20062d6cca2eecb58ba7c84bc3910be95c0451ef4161906abaab44f9cb68ffbdd1 + languageName: node + linkType: hard + +"uvu@npm:^0.5.0": + version: 0.5.6 + resolution: "uvu@npm:0.5.6" + dependencies: + dequal: "npm:^2.0.0" + diff: "npm:^5.0.0" + kleur: "npm:^4.0.3" + sade: "npm:^1.7.3" + bin: + uvu: bin.js + checksum: 10/66ba25afc6732249877f9f4f8b6146f3aaa97538c51cf498f55825d602c33dbb903e02c7e1547cbca6bdfbb609e07eb7ea758b5156002ac2dd5072f00606f8d9 + languageName: node + linkType: hard + +"vfile-location@npm:^4.0.0": + version: 4.1.0 + resolution: "vfile-location@npm:4.1.0" + dependencies: + "@types/unist": "npm:^2.0.0" + vfile: "npm:^5.0.0" + checksum: 10/c894e8e5224170d1f85288f4a1d1ebcee0780823ea2b49d881648ab360ebf01b37ecb09b1c4439a75f9a51f31a9f9742cd045e987763e367c352a1ef7c50d446 + languageName: node + linkType: hard + "vfile-matter@npm:^5.0.0": version: 5.0.1 resolution: "vfile-matter@npm:5.0.1" @@ -12736,6 +14907,16 @@ __metadata: languageName: node linkType: hard +"vfile-message@npm:^3.0.0": + version: 3.1.4 + resolution: "vfile-message@npm:3.1.4" + dependencies: + "@types/unist": "npm:^2.0.0" + unist-util-stringify-position: "npm:^3.0.0" + checksum: 10/423ca87f4427a403e4688d7ec663a2e6add694eefac47c945746463377428c7553bc613058841f1da83e18b68af886d3dd11cb96d582b5cc3c98e11efb7e55e9 + languageName: node + linkType: hard + "vfile-message@npm:^4.0.0": version: 4.0.3 resolution: "vfile-message@npm:4.0.3" @@ -12746,6 +14927,18 @@ __metadata: languageName: node linkType: hard +"vfile@npm:^5.0.0, vfile@npm:^5.3.2": + version: 5.3.7 + resolution: "vfile@npm:5.3.7" + dependencies: + "@types/unist": "npm:^2.0.0" + is-buffer: "npm:^2.0.0" + unist-util-stringify-position: "npm:^3.0.0" + vfile-message: "npm:^3.0.0" + checksum: 10/d8f59b419d4c83b3ed24f500cf02393149b728f8803f88519c18fe0733f62544fa9ab0d8425a8bc7835181d848b9ce29c014168dc45af72f416074bbe475f643 + languageName: node + linkType: hard + "vfile@npm:^6.0.0, vfile@npm:^6.0.1": version: 6.0.3 resolution: "vfile@npm:6.0.3" @@ -12944,6 +15137,20 @@ __metadata: languageName: node linkType: hard +"web-namespaces@npm:^2.0.0": + version: 2.0.1 + resolution: "web-namespaces@npm:2.0.1" + checksum: 10/b6d9f02f1a43d0ef0848a812d89c83801d5bbad57d8bb61f02eb6d7eb794c3736f6cc2e1191664bb26136594c8218ac609f4069722c6f56d9fc2d808fa9271c6 + languageName: node + linkType: hard + +"web-streams-polyfill@npm:^3.0.3": + version: 3.3.3 + resolution: "web-streams-polyfill@npm:3.3.3" + checksum: 10/8e7e13501b3834094a50abe7c0b6456155a55d7571312b89570012ef47ec2a46d766934768c50aabad10a9c30dd764a407623e8bfcc74fcb58495c29130edea9 + languageName: node + linkType: hard + "webidl-conversions@npm:^7.0.0": version: 7.0.0 resolution: "webidl-conversions@npm:7.0.0" @@ -13086,7 +15293,7 @@ __metadata: languageName: node linkType: hard -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" dependencies: @@ -13162,6 +15369,13 @@ __metadata: languageName: node linkType: hard +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 10/5f1b5f95e3775de4514edbb142398a2c37849ccfaf04a015be5d75521e9629d3be29bd4432d23c57f37e5b61ade592fb0197022e9993f81a06a5afbdcda9346d + languageName: node + linkType: hard + "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0" @@ -13176,7 +15390,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.0.0": +"yaml@npm:^2.0.0, yaml@npm:^2.3.1": version: 2.8.2 resolution: "yaml@npm:2.8.2" bin: @@ -13195,6 +15409,13 @@ __metadata: languageName: node linkType: hard +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: 10/9dc2c217ea3bf8d858041252d43e074f7166b53f3d010a8c711275e09cd3d62a002969a39858b92bbda2a6a63a585c7127014534a560b9c69ed2d923d113406e + languageName: node + linkType: hard + "yargs@npm:^15.3.1": version: 15.4.1 resolution: "yargs@npm:15.4.1" @@ -13214,6 +15435,21 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10/abb3e37678d6e38ea85485ed86ebe0d1e3464c640d7d9069805ea0da12f69d5a32df8e5625e370f9c96dd1c2dc088ab2d0a4dd32af18222ef3c4224a19471576 + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" @@ -13221,6 +15457,13 @@ __metadata: languageName: node linkType: hard +"zod@npm:^3.21.4": + version: 3.25.76 + resolution: "zod@npm:3.25.76" + checksum: 10/f0c963ec40cd96858451d1690404d603d36507c1fc9682f2dae59ab38b578687d542708a7fdbf645f77926f78c9ed558f57c3d3aa226c285f798df0c4da16995 + languageName: node + linkType: hard + "zustand@npm:^4.5.4": version: 4.5.7 resolution: "zustand@npm:4.5.7" @@ -13241,7 +15484,7 @@ __metadata: languageName: node linkType: hard -"zwitch@npm:^2.0.0": +"zwitch@npm:^2.0.0, zwitch@npm:^2.0.4": version: 2.0.4 resolution: "zwitch@npm:2.0.4" checksum: 10/f22ec5fc2d5f02c423c93d35cdfa83573a3a3bd98c66b927c368ea4d0e7252a500df2a90a6b45522be536a96a73404393c958e945fdba95e6832c200791702b6