@unterberg/nivel 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mdx/components/Alert.tsx","../src/mdx/code-blocks/ChoiceGroup.tsx","../src/mdx/code-blocks/CodeBlockHeaderMeta.tsx","../src/mdx/code-blocks/CopyButton.tsx","../src/mdx/code-blocks/context.tsx","../src/mdx/code-blocks/useRestoreScroll.ts","../src/mdx/code-blocks/useSelectedChoice.ts","../src/mdx/code-blocks/CodeBlockTransformer.tsx","../src/mdx/code-blocks/FileState.tsx","../src/mdx/code-blocks/Pre.tsx","../src/mdx/components/Link.tsx","../src/mdx/components/Overview.tsx","../src/mdx/components/RepoLink.tsx","../src/mdx/components/Table.tsx"],"sourcesContent":["import cm, { cmMerge } from '@classmatejs/react'\nimport { Check, CircleX, Info, TriangleAlert } from 'lucide-react'\nimport type { ReactNode } from 'react'\n\nexport type AlertVariant = 'info' | 'warning' | 'error' | 'success'\n\nconst alertIconMap = {\n info: Info,\n warning: TriangleAlert,\n error: CircleX,\n success: Check,\n}\n\nexport const Alert = ({\n type = 'info',\n heading,\n children,\n icon = true,\n}: {\n type?: AlertVariant\n heading?: ReactNode\n children: ReactNode\n icon?: boolean | ReactNode\n}) => {\n const AlertIcon = icon === true ? alertIconMap[type] : typeof icon === 'object' ? () => <>{icon}</> : null\n\n const alertIconTextColorClass = {\n info: 'text-info',\n warning: 'text-warning',\n error: 'text-error',\n success: 'text-success',\n }[type]\n\n return (\n <AlertOuter $variant={type}>\n {!!heading && AlertIcon && (\n <div className=\"mb-3 flex items-center gap-2\">\n <AlertIcon className={cmMerge(alertIconTextColorClass, 'float-left h-5 w-5')} />\n <AlertHeading>{heading}</AlertHeading>\n </div>\n )}\n {!(!!heading && AlertIcon) && !!heading && <AlertHeading>{heading}</AlertHeading>}\n {!(!!heading && AlertIcon) && AlertIcon && (\n <div className={cmMerge(alertIconTextColorClass, 'float-left mr-2')}>\n <AlertIcon className=\"mt-1 h-5 w-5\" />\n </div>\n )}\n {children}\n </AlertOuter>\n )\n}\n\nconst AlertOuter = cm.section.variants<{ $variant: AlertVariant }>({\n base: `\n p-4\n mt-5\n mb-5\n border\n rounded-lg\n prose-p:last:mb-0\n prose-p:mt-0\n prose-headings:first:mt-0\n prose-headings:last:mb-0\n prose-ul:first:mt-0\n prose-ul:last:mb-0\n text-sm\n `,\n variants: {\n $variant: {\n info: 'bg-info/10 border-info/30',\n warning: 'bg-warning/10 border-warning/30',\n error: 'bg-error/10 border-error/25',\n success: 'bg-success/10 border-success/35',\n },\n },\n defaultVariants: {\n $variant: 'info',\n },\n})\n\nconst AlertHeading = cm.header`\n font-bold\n text-base\n`\n","export { ChoiceGroup }\n\nimport { Children, isValidElement, type ReactElement, type ReactNode, useRef } from 'react'\nimport { CodeBlockHeaderMeta } from './CodeBlockHeaderMeta.js'\nimport { CodeBlockCopyButton, trimTrailingWhitespace } from './CopyButton.js'\nimport { CodeBlockGroupProvider } from './context.js'\nimport { useRestoreScroll } from './useRestoreScroll.js'\nimport { useSelectedChoice } from './useSelectedChoice.js'\n\ntype ChoiceGroupDescriptor = {\n default: string\n disabled: string[]\n name: string\n choices: string[]\n}\n\ntype ChoiceElementProps = {\n children?: ReactNode\n 'data-choice-value'?: string\n}\n\nconst isChoiceElement = (node: ReactNode): node is ReactElement<ChoiceElementProps> => {\n return isValidElement<ChoiceElementProps>(node) && typeof node.props?.['data-choice-value'] === 'string'\n}\n\nconst asTrimmedString = (value: unknown) => {\n return typeof value === 'string' && value.trim() ? value.trim() : null\n}\n\nconst getActiveCodeBlockMeta = (node: ReactNode): { env: string | null; hideCopy: boolean; title: string | null } => {\n for (const child of Children.toArray(node)) {\n if (!isValidElement(child)) {\n continue\n }\n\n const props = child.props as {\n children?: ReactNode\n 'data-code-env'?: string\n 'data-code-title'?: string\n 'hide-menu'?: string\n }\n const env = asTrimmedString(props['data-code-env'])\n const title = asTrimmedString(props['data-code-title'])\n const hideCopy = props['hide-menu'] === 'true'\n\n if (title || env || hideCopy) {\n return { env, hideCopy, title }\n }\n\n const nestedMeta = getActiveCodeBlockMeta(props.children)\n if (nestedMeta.title || nestedMeta.env || nestedMeta.hideCopy) {\n return nestedMeta\n }\n }\n\n return { env: null, hideCopy: false, title: null }\n}\n\nconst ChoiceGroup = ({\n children,\n choiceGroup,\n hide = false,\n}: {\n children: ReactNode\n choiceGroup: ChoiceGroupDescriptor\n hide?: boolean\n lvl?: number\n}) => {\n const [selectedChoice, setSelectedChoice] = useSelectedChoice(choiceGroup.name, choiceGroup.default)\n const bodyRef = useRef<HTMLDivElement>(null)\n const previousPositionRef = useRestoreScroll([selectedChoice])\n const choiceElements = Children.toArray(children).filter(isChoiceElement)\n const activeChoiceElement =\n choiceElements.find((choiceElement) => choiceElement.props['data-choice-value'] === selectedChoice) ??\n choiceElements[0]\n\n if (!activeChoiceElement) {\n return <>{children}</>\n }\n\n const activeCodeBlockMeta = getActiveCodeBlockMeta(activeChoiceElement.props.children)\n const headerLabel = activeCodeBlockMeta.title ?? activeChoiceElement.props['data-choice-value'] ?? ''\n\n if (hide) {\n return <>{activeChoiceElement.props.children}</>\n }\n\n return (\n <div\n data-choice-group-outer\n className=\"mt-5 mb-5 flex h-full flex-col overflow-hidden rounded-box border border-base-muted-light\"\n >\n <div\n className=\"not-prose flex min-h-10 items-center relative justify-between gap-3 border-b border-base-muted-light bg-base-muted-superlight px-4\"\n data-choice-group-header\n >\n <CodeBlockHeaderMeta label={headerLabel} env={activeCodeBlockMeta.env} />\n <div className=\"flex items-center gap-1\">\n <label className=\"select select-xs min-w-28 w-fit\">\n <select\n name={`choicesFor-${choiceGroup.name}`}\n value={activeChoiceElement.props['data-choice-value']}\n onChange={(event) => {\n previousPositionRef.current = {\n top: event.currentTarget.getBoundingClientRect().top,\n element: event.currentTarget,\n }\n setSelectedChoice(event.currentTarget.value)\n }}\n >\n {choiceGroup.choices.map((choice) => (\n <option key={choice} value={choice} disabled={choiceGroup.disabled.includes(choice)}>\n {choice}\n </option>\n ))}\n </select>\n </label>\n {!activeCodeBlockMeta.hideCopy && (\n <CodeBlockCopyButton\n onCopy={async () => {\n const text = trimTrailingWhitespace(bodyRef.current?.textContent ?? '')\n\n try {\n await navigator.clipboard.writeText(text)\n return true\n } catch {\n return false\n }\n }}\n />\n )}\n </div>\n </div>\n <div ref={bodyRef} className=\"h-full flex-1 bg-base-200! [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\">\n <CodeBlockGroupProvider value={true}>{activeChoiceElement.props.children}</CodeBlockGroupProvider>\n </div>\n </div>\n )\n}\n","import cm from '@classmatejs/react'\n\nexport { CodeBlockHeaderMeta }\n\nconst CodeBlockHeaderMeta = ({ env, label }: { env?: string | null; label: string }) => {\n const effectiveEnv = env === 'server' || env === 'client' ? env : undefined\n\n return (\n <div className=\"flex min-w-0 items-center gap-2\">\n {env && <StyledDivider $env={env === 'server' || env === 'client' ? env : undefined} />}\n {env && <StyledBgShade $env={env === 'server' || env === 'client' ? env : undefined} />}\n <div className=\"font-mono text-xs font-semibold text-base-muted\">{label}</div>\n {env && <StyledBadge $env={effectiveEnv}>{env}</StyledBadge>}\n </div>\n )\n}\n\nconst StyledDivider = cm.div.variants<{ $env?: 'server' | 'client' }>({\n base: 'absolute h-1 -bottom-px left-0 w-full pointer-events-none',\n variants: {\n $env: {\n server: 'border-info/50 border-b ',\n client: 'border-success/50 border-b',\n },\n },\n defaultVariants: { $env: 'server' },\n})\n\nconst StyledBadge = cm.div.variants<{ $env?: 'server' | 'client' }>({\n base: 'shrink-0 badge badge-sm rounded-field badge-soft border pointer-events-none',\n variants: {\n $env: {\n server: 'badge-info border-info',\n client: 'badge-success border-success',\n },\n },\n defaultVariants: { $env: 'server' },\n})\n\nconst StyledBgShade = cm.div.variants<{ $env?: 'server' | 'client' }>({\n base: 'absolute inset-0 opacity-5 bg-linear-to-t via-40% via-transparent pointer-events-none',\n variants: {\n $env: {\n server: 'from-info',\n client: 'from-success',\n },\n },\n defaultVariants: { $env: 'server' },\n})\n","export { CodeBlockCopyButton, trimTrailingWhitespace }\n\nimport { cmMerge } from '@classmatejs/react'\nimport { Check, Copy } from 'lucide-react'\nimport { useState } from 'react'\n\nconst trimTrailingWhitespace = (text: string) => {\n return text\n .split('\\n')\n .map((line) => line.trimEnd())\n .join('\\n')\n}\n\nconst CodeBlockCopyButton = ({\n onCopy,\n className = '',\n}: {\n onCopy: () => Promise<boolean> | boolean\n className?: string\n}) => {\n const [copyState, setCopyState] = useState<'idle' | 'success' | 'error'>('idle')\n\n return (\n <button\n type=\"button\"\n className={cmMerge('btn btn-ghost btn-xs h-8 min-h-8 px-2 text-base-muted hover:text-base-content', className)}\n onClick={async () => {\n const success = await onCopy()\n setCopyState(success ? 'success' : 'error')\n window.setTimeout(() => setCopyState('idle'), 900)\n }}\n aria-label={copyState === 'idle' ? 'Copy to clipboard' : copyState === 'success' ? 'Copied' : 'Copy failed'}\n >\n {copyState === 'success' ? <Check size={14} /> : <Copy size={14} />}\n </button>\n )\n}\n","import { createContext, useContext } from 'react'\n\nconst CodeBlockGroupContext = createContext(false)\n\nexport const CodeBlockGroupProvider = CodeBlockGroupContext.Provider\n\nexport const useIsInCodeBlockGroup = () => useContext(CodeBlockGroupContext)\n","import { useEffect, useRef } from 'react'\n\ntype ScrollPosition = {\n top: number\n element: Element\n}\n\nexport const useRestoreScroll = (deps: ReadonlyArray<unknown>) => {\n const previousPositionRef = useRef<ScrollPosition | null>(null)\n\n useEffect(() => {\n if (!previousPositionRef.current) {\n return\n }\n\n const { top, element } = previousPositionRef.current\n const delta = element.getBoundingClientRect().top - top\n\n if (delta !== 0) {\n window.scrollBy(0, delta)\n }\n\n previousPositionRef.current = null\n // biome-ignore lint/correctness/useExhaustiveDependencies: restore only when the tracked value changes\n }, deps)\n\n return previousPositionRef\n}\n","import { useEffect, useState, useSyncExternalStore } from 'react'\nimport { useUniversalMdxRuntime } from '../components/UniversalMdxProvider.js'\n\nconst subscribeNoop = () => () => {}\nconst getServerSnapshot = () => null\n\nexport const useSelectedChoice = (choiceGroupName: string, defaultValue: string) => {\n const runtime = useUniversalMdxRuntime()\n const choiceStore = runtime?.codeBlockChoices\n const storedChoice = useSyncExternalStore(\n choiceStore?.subscribe ?? subscribeNoop,\n () => choiceStore?.getChoice(choiceGroupName) ?? null,\n getServerSnapshot,\n )\n const [localChoice, setLocalChoice] = useState(defaultValue)\n\n useEffect(() => {\n if (!choiceStore || storedChoice) {\n return\n }\n\n const legacyChoice = choiceStore.getLegacyChoice?.(choiceGroupName)\n if (legacyChoice) {\n choiceStore.setChoice(choiceGroupName, legacyChoice)\n }\n }, [choiceGroupName, choiceStore, storedChoice])\n\n if (choiceStore) {\n return [storedChoice ?? defaultValue, (value: string) => choiceStore.setChoice(choiceGroupName, value)] as const\n }\n\n return [localChoice, setLocalChoice] as const\n}\n","export { CodeBlockTransformer }\nexport type { LineBreak }\n\nimport type { ReactNode } from 'react'\n\ntype LineBreak = 'white-space' | 'break-word'\n\nconst CodeBlockTransformer = ({ children, lineBreak }: { children: ReactNode; lineBreak: LineBreak }) => {\n const className = `with-line-break_${lineBreak}` as const\n return <div className={className}>{children}</div>\n}\n","export { FileAdded, FileRemoved }\n\nimport type { ReactNode } from 'react'\n\nconst FileAdded = ({ children }: { children: ReactNode }) => {\n return <div className=\"doc-code-file-state doc-code-file-added\">{children}</div>\n}\n\nconst FileRemoved = ({ children }: { children: ReactNode }) => {\n return <div className=\"doc-code-file-state doc-code-file-removed\">{children}</div>\n}\n","export { Pre }\n\nimport { cmMerge } from '@classmatejs/react'\nimport {\n Children,\n type ComponentPropsWithoutRef,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useRef,\n} from 'react'\nimport { CodeBlockHeaderMeta } from './CodeBlockHeaderMeta.js'\nimport { CodeBlockCopyButton, trimTrailingWhitespace } from './CopyButton.js'\nimport { useIsInCodeBlockGroup } from './context.js'\n\ntype PreProps = ComponentPropsWithoutRef<'pre'> & {\n 'data-code-env'?: string\n 'data-code-title'?: string\n 'data-language'?: string\n 'data-language-label'?: string\n 'file-added'?: string\n 'file-removed'?: string\n 'hide-menu'?: string\n}\n\nconst asTrimmedString = (value: unknown) => {\n return typeof value === 'string' && value.trim() ? value.trim() : null\n}\n\nconst getLanguageFromChildren = (children: ReactNode) => {\n const firstChild = Children.toArray(children)[0]\n if (!isValidElement(firstChild)) {\n return null\n }\n\n const props = (firstChild as ReactElement<{ className?: string; 'data-language'?: string }>).props\n const explicitLanguage = asTrimmedString(props['data-language'])\n if (explicitLanguage) {\n return explicitLanguage\n }\n\n const classNames = typeof props.className === 'string' ? props.className.split(/\\s+/) : []\n const languageClassName = classNames.find((className) => className.startsWith('language-'))\n return languageClassName ? languageClassName.slice('language-'.length) : null\n}\n\nconst getLanguageLabel = (props: PreProps) => {\n const explicitLabel = asTrimmedString(props['data-language-label'])\n if (explicitLabel) {\n return explicitLabel\n }\n\n const explicitLanguage = asTrimmedString(props['data-language']) ?? getLanguageFromChildren(props.children)\n return explicitLanguage ? explicitLanguage.toUpperCase() : 'CODE'\n}\n\nconst Pre = ({ children, className, ...props }: PreProps) => {\n const preRef = useRef<HTMLPreElement>(null)\n const isInChoiceGroup = useIsInCodeBlockGroup()\n const label = asTrimmedString(props['data-code-title']) ?? getLanguageLabel(props)\n const env = asTrimmedString(props['data-code-env'])\n const fileState = props['file-added'] ? 'added' : props['file-removed'] ? 'removed' : null\n const hideMenu = props['hide-menu'] === 'true'\n\n const copyButton =\n hideMenu || isInChoiceGroup ? null : (\n <CodeBlockCopyButton\n onCopy={async () => {\n const text = trimTrailingWhitespace(preRef.current?.textContent ?? '')\n\n try {\n await navigator.clipboard.writeText(text)\n return true\n } catch {\n return false\n }\n }}\n />\n )\n\n return (\n <div\n className={cmMerge(\n 'group relative h-full not-prose overflow-hidden',\n isInChoiceGroup ? '' : 'mb-6 rounded-box border border-base-muted-light',\n className,\n )}\n data-code-block-frame=\"\"\n data-file-state={fileState ?? undefined}\n >\n {!isInChoiceGroup && (\n <div\n className=\"flex min-h-10 relative items-center justify-between gap-3 border-b border-base-muted-light bg-base-muted-superlight! px-4\"\n data-code-block-header=\"\"\n >\n <CodeBlockHeaderMeta label={label} env={env} />\n {copyButton}\n </div>\n )}\n <pre\n {...props}\n ref={preRef}\n className={cmMerge('doc-code-pre m-0 h-full overflow-x-auto bg-base-200! p-4 text-sm', className)}\n data-code-block-content=\"\"\n >\n {children}\n </pre>\n </div>\n )\n}\n","import { cmMerge } from '@classmatejs/react'\nimport type { ComponentPropsWithoutRef, ReactNode } from 'react'\nimport { withSiteBaseUrl } from '../../shared/assets.js'\nimport { useUniversalMdxRuntime } from './UniversalMdxProvider.js'\n\nexport type LinkProps = ComponentPropsWithoutRef<'a'> & {\n href?: string\n text?: string | ReactNode\n noBreadcrumb?: boolean\n doNotInferSectionTitle?: boolean\n noWarning?: boolean\n}\n\nfunction assertUsage(condition: unknown, message: string): asserts condition {\n if (!condition) {\n throw new Error(`[UniversalMdxMods][Wrong Usage] ${message}`)\n }\n}\n\nconst assertWarning = (condition: unknown, message: string) => {\n const isDev = (import.meta as ImportMeta & { env?: { DEV?: boolean } }).env?.DEV === true\n\n if (condition || !isDev) {\n return\n }\n\n console.warn(`[UniversalMdxMods][Warning] ${message}`)\n}\n\nconst parseMarkdownMini = (markdown: string) => {\n type Part = { content: string; nodeType: 'code' | 'text' }\n const parts: Part[] = []\n let current: Part | undefined\n\n for (const letter of markdown.split('')) {\n if (letter === '`') {\n if (current?.nodeType === 'code') {\n parts.push(current)\n current = undefined\n } else {\n if (current) {\n parts.push(current)\n }\n current = { nodeType: 'code', content: '' }\n }\n continue\n }\n\n current ??= { nodeType: 'text', content: '' }\n current.content += letter\n }\n\n if (current) {\n parts.push(current)\n }\n\n return (\n <>\n {parts.map((part, index) =>\n part.nodeType === 'code' ? <code key={index}>{part.content}</code> : <span key={index}>{part.content}</span>,\n )}\n </>\n )\n}\n\nconst determineSectionTitle = (href: string) => {\n const hash = href.split('#')[1]\n\n if (!hash) {\n return null\n }\n\n return hash\n .split(':~:text')[0]\n ?.split('-')\n .map((word, index) => (index === 0 ? `${word[0]?.toUpperCase() ?? ''}${word.slice(1)}` : word))\n .join(' ')\n}\n\nconst isExternalHref = (href: string) => {\n return /^(?:[a-z]+:)?\\/\\//i.test(href) || href.startsWith('mailto:') || href.startsWith('tel:')\n}\n\nconst renderLabelPart = (value: ReactNode) => {\n return typeof value === 'string' ? parseMarkdownMini(value) : value\n}\n\nconst getLinkText = ({\n isCurrentPage,\n breadcrumb,\n noBreadcrumb,\n sectionTitle,\n title,\n}: {\n isCurrentPage?: boolean\n breadcrumb?: ReactNode[]\n noBreadcrumb?: boolean\n sectionTitle?: ReactNode\n title?: ReactNode\n}) => {\n const breadcrumbParts: ReactNode[] = []\n\n if (breadcrumb) {\n breadcrumbParts.push(...breadcrumb.map((item) => renderLabelPart(item)))\n }\n\n if (title) {\n breadcrumbParts.push(renderLabelPart(title))\n }\n\n if (sectionTitle) {\n breadcrumbParts.push(renderLabelPart(sectionTitle))\n }\n\n if (noBreadcrumb || isCurrentPage) {\n return breadcrumbParts[breadcrumbParts.length - 1] ?? null\n }\n\n return (\n <>\n {breadcrumbParts.map((part, index) => (\n <span key={index}>\n {index > 0 ? ' > ' : null}\n {part}\n </span>\n ))}\n </>\n )\n}\n\nexport const Link = ({\n href,\n text,\n noBreadcrumb,\n doNotInferSectionTitle,\n noWarning,\n children,\n className,\n ...props\n}: LinkProps) => {\n const runtime = useUniversalMdxRuntime()\n\n if (typeof href !== 'string' || href === '') {\n assertWarning(false, '<Link /> is missing `href`.')\n\n return (\n <a className={cmMerge(className, 'inline-flex gap-1 items-center')} {...props}>\n {text ?? children ?? 'LINK-TARGET-NOT-FOUND'}\n </a>\n )\n }\n\n assertUsage(\n href.startsWith('/') || href.startsWith('#') || isExternalHref(href),\n `<Link href /> prop \\`href==='${href}'\\` but should be external or start with '/' or '#'`,\n )\n assertUsage(!text || !children, 'Cannot use both `text` or `children`')\n\n const content = text ?? children\n const resolvedDocLink = runtime?.resolveDocLink?.({\n href,\n doNotInferSectionTitle,\n noWarning,\n })\n const localizedHref = resolvedDocLink?.href ?? runtime?.localizeHref?.(href) ?? withSiteBaseUrl(href)\n const inferredSectionTitle =\n resolvedDocLink?.sectionTitle ?? (!doNotInferSectionTitle ? determineSectionTitle(href) : null)\n const inferredText =\n content ??\n (resolvedDocLink\n ? getLinkText({\n breadcrumb: resolvedDocLink.breadcrumb,\n isCurrentPage: resolvedDocLink.isCurrentPage,\n noBreadcrumb,\n sectionTitle: inferredSectionTitle ?? undefined,\n title: resolvedDocLink.title,\n })\n : isExternalHref(href)\n ? href\n : (inferredSectionTitle ?? 'LINK-TARGET-NOT-FOUND'))\n\n return (\n <a href={localizedHref} className={cmMerge(className, '')} {...props}>\n {inferredText}\n </a>\n )\n}\n","import type { ReactNode } from 'react'\nimport { withSiteBaseUrl } from '../../shared/assets.js'\nimport { renderInlineMarkdown } from '../../shared/renderInlineMarkdown.js'\nimport type { UniversalResolvedOverviewItem } from './types.js'\nimport { useUniversalMdxRuntime } from './UniversalMdxProvider.js'\n\ntype OverviewLinkItem = {\n title: ReactNode\n href: string\n excerpt?: ReactNode | null\n}\n\ntype OverviewDividerItem = {\n dividerText: ReactNode\n}\n\nexport type OverviewItem = OverviewLinkItem | OverviewDividerItem\n\ninterface OverviewProps {\n items: Array<string | OverviewItem>\n}\n\nconst isOverviewDividerItem = (item: string | OverviewItem): item is OverviewDividerItem =>\n typeof item === 'object' && item !== null && 'dividerText' in item\n\nfunction assertUsage(condition: unknown, message: string): asserts condition {\n if (!condition) {\n throw new Error(`[UniversalMdxMods][Wrong Usage] ${message}`)\n }\n}\n\nconst groupOverviewItems = (items: OverviewItem[]) => {\n const groups: { dividerText?: ReactNode; items: OverviewLinkItem[] }[] = []\n let currentGroup: { dividerText?: ReactNode; items: OverviewLinkItem[] } = {\n items: [],\n }\n\n const commitCurrentGroup = () => {\n if (currentGroup.items.length > 0) {\n groups.push(currentGroup)\n }\n }\n\n for (const item of items) {\n if (isOverviewDividerItem(item)) {\n commitCurrentGroup()\n currentGroup = {\n dividerText: item.dividerText,\n items: [],\n }\n continue\n }\n\n currentGroup.items.push(item)\n }\n\n commitCurrentGroup()\n\n return groups\n}\n\nconst OverviewCard = ({ excerpt, href, title }: OverviewLinkItem) => {\n return (\n <a\n href={withSiteBaseUrl(href)}\n className=\"group flex h-full flex-col gap-3 rounded-box border border-base-muted-light bg-base-muted-superlight p-5 no-underline hover:border-primary-muted-medium hover:bg-base-muted-superlight/50\"\n >\n <h3 className=\"text-lg font-semibold text-base-content\">{renderInlineMarkdown(title)}</h3>\n {excerpt ? <p className=\"text-sm leading-relaxed text-base-muted\">{renderInlineMarkdown(excerpt)}</p> : null}\n </a>\n )\n}\n\nconst normalizeOverviewItems = (\n items: Array<string | OverviewItem>,\n resolveOverviewItem?: (key: string) => UniversalResolvedOverviewItem | null,\n): OverviewItem[] => {\n return items.map((item) => {\n if (typeof item !== 'string') {\n return item\n }\n\n const resolvedItem = resolveOverviewItem?.(item)\n\n assertUsage(\n resolvedItem,\n `Overview item \"${item}\" requires runtime.resolveOverviewItem(). Pass { title, href, excerpt } manually when no resolver is available.`,\n )\n\n return resolvedItem\n })\n}\n\nexport const Overview = ({ items }: OverviewProps) => {\n const runtime = useUniversalMdxRuntime()\n const groups = groupOverviewItems(normalizeOverviewItems(items, runtime?.resolveOverviewItem))\n\n if (groups.length === 0) {\n return null\n }\n\n return (\n <div className=\"prose-headings:my-0 prose-p:my-0 my-5 flex flex-col gap-8\">\n {groups.map((group, groupIndex) => (\n <section className=\"flex flex-col gap-4\" key={groupIndex}>\n {group.dividerText ? (\n <p className=\"text-sm font-semibold uppercase tracking-wide\">{renderInlineMarkdown(group.dividerText)}</p>\n ) : null}\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {group.items.map((item, itemIndex) => (\n <OverviewCard {...item} key={item.href || itemIndex} />\n ))}\n </div>\n </section>\n ))}\n </div>\n )\n}\n","type Repo = `${string}/${string}`\ntype TimestampType = `${number}.${number}`\n\nexport const RepoLink = ({ repo, timestamp }: { repo: Repo; timestamp: TimestampType }) => {\n if (!repo || repo.split('/').length !== 2) {\n throw new Error('Invalid repo')\n }\n\n return (\n <span className=\"inline-flex items-center gap-1\">\n <span className=\"bg-white font-mono font-bold h-fit px-1 text-sm!\">{timestamp}</span>\n <a href={`https://github.com/${repo}`} target=\"_blank\" rel=\"noopener\">\n GitHub &gt; <code>{repo}</code>\n </a>\n </span>\n )\n}\n","import cm from '@classmatejs/react'\n\nexport interface TableData {\n headers: string[]\n rows: string[][]\n}\n\nexport interface TableProps {\n size?: 'sm' | 'md' | 'lg'\n data: TableData\n}\n\nexport const Table = ({ size = 'md', data }: TableProps) => {\n return (\n <StyledTable $size={size}>\n <thead className=\"overflow-hidden rounded-t-box bg-base-200\">\n <tr>\n {data.headers.map((header, index) => (\n <th key={index}>{header}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.rows.map((row, rowIndex) => (\n <tr key={rowIndex}>\n {row.map((cell, cellIndex) => (\n <td key={cellIndex}>{cell}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </StyledTable>\n )\n}\n\nconst StyledTable = cm.table.variants<{ $size: TableProps['size'] }>({\n base: `\n not-prose\n table\n w-full\n table-zebra\n mb-6\n `,\n variants: {\n $size: {\n sm: 'table-sm',\n md: 'table-md',\n lg: 'table-lg',\n },\n },\n defaultVariants: {\n $size: 'md',\n },\n})\n"],"mappings":"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","names":["useRef","cm","jsx","jsxs","jsxs","jsx","cm","cmMerge","Check","jsx","jsx","cmMerge","Check","useEffect","useState","useState","useEffect","Fragment","jsx","jsxs","useRef","jsx","Fragment","jsxs","jsx","jsx","jsx","jsx","cmMerge","Children","isValidElement","useRef","jsx","jsxs","asTrimmedString","Children","isValidElement","useRef","jsx","jsxs","cmMerge","cmMerge","Fragment","jsx","jsxs","cmMerge","jsx","jsxs","assertUsage","jsx","jsxs","cm","jsx","jsxs"]}
@@ -0,0 +1,198 @@
1
+ import {
2
+ isDocsSourcePath,
3
+ loadDocsConfig,
4
+ syncGeneratedDocsPages
5
+ } from "./chunk-DNCQR5NH.js";
6
+ import {
7
+ nivelPublicRoute
8
+ } from "./chunk-PYYPYIBD.js";
9
+
10
+ // src/runtime/node/plugin.ts
11
+ import fs2 from "fs";
12
+
13
+ // src/runtime/node/publicAssets.ts
14
+ import fs from "fs";
15
+ import path from "path";
16
+ import { fileURLToPath, pathToFileURL } from "url";
17
+ var toPosix = (value) => value.split(path.sep).join(path.posix.sep);
18
+ var collectPublicAssetFilePaths = (directoryPath) => {
19
+ return fs.readdirSync(directoryPath, { withFileTypes: true }).flatMap((entry) => {
20
+ const entryPath = path.join(directoryPath, entry.name);
21
+ return entry.isDirectory() ? collectPublicAssetFilePaths(entryPath) : [entryPath];
22
+ });
23
+ };
24
+ var getRequestPathname = (requestUrl) => {
25
+ return requestUrl?.split("?")[0]?.split("#")[0] ?? "";
26
+ };
27
+ var normalizeNivelAssetPathname = (pathname) => {
28
+ if (pathname === nivelPublicRoute) {
29
+ return pathname;
30
+ }
31
+ if (!pathname.startsWith(`${nivelPublicRoute}/`)) {
32
+ return null;
33
+ }
34
+ const trimmedPathname = pathname.replace(/\/+$/g, "");
35
+ if (trimmedPathname !== pathname && path.extname(trimmedPathname)) {
36
+ return trimmedPathname;
37
+ }
38
+ return pathname;
39
+ };
40
+ var getPublicAssetsRootCandidates = (runtimeDir) => {
41
+ let packageRoot = null;
42
+ try {
43
+ const nivelConfigUrl = import.meta.resolve("@unterberg/nivel/vike");
44
+ const nivelConfigPath = fileURLToPath(nivelConfigUrl);
45
+ packageRoot = path.resolve(path.dirname(nivelConfigPath), "..");
46
+ } catch {
47
+ packageRoot = null;
48
+ }
49
+ return [
50
+ ...packageRoot ? [path.join(packageRoot, "assets")] : [],
51
+ path.resolve(runtimeDir, "../assets"),
52
+ path.resolve(runtimeDir, "../../assets")
53
+ ];
54
+ };
55
+ var getNivelPublicAssetsRoot = () => {
56
+ const runtimeUrl = import.meta.url.startsWith("/") ? pathToFileURL(import.meta.url).href : import.meta.url;
57
+ const runtimeDir = path.dirname(fileURLToPath(runtimeUrl));
58
+ for (const candidate of getPublicAssetsRootCandidates(runtimeDir)) {
59
+ if (fs.existsSync(candidate) && fs.statSync(candidate).isDirectory()) {
60
+ return candidate;
61
+ }
62
+ }
63
+ throw new Error(`Unable to locate nivel public assets from ${runtimeDir}.`);
64
+ };
65
+ var getNivelPublicAssets = () => {
66
+ const assetsRoot = getNivelPublicAssetsRoot();
67
+ return collectPublicAssetFilePaths(assetsRoot).map((filePath) => ({
68
+ fileName: toPosix(path.relative(assetsRoot, filePath)),
69
+ filePath
70
+ }));
71
+ };
72
+ var getNivelPublicAssetFilePath = (requestUrl) => {
73
+ const pathname = normalizeNivelAssetPathname(getRequestPathname(requestUrl));
74
+ if (!pathname) {
75
+ return null;
76
+ }
77
+ const assetsRoot = getNivelPublicAssetsRoot();
78
+ const relativePath = pathname.replace(/^\/+/, "");
79
+ const filePath = path.resolve(assetsRoot, relativePath);
80
+ const relativeToRoot = path.relative(assetsRoot, filePath);
81
+ if (relativeToRoot.startsWith("..") || path.isAbsolute(relativeToRoot) || !fs.existsSync(filePath) || !fs.statSync(filePath).isFile()) {
82
+ return null;
83
+ }
84
+ return filePath;
85
+ };
86
+ var getNivelPublicAssetContentType = (filePath) => {
87
+ switch (path.extname(filePath)) {
88
+ case ".css":
89
+ return "text/css; charset=utf-8";
90
+ case ".svg":
91
+ return "image/svg+xml";
92
+ case ".png":
93
+ return "image/png";
94
+ case ".ico":
95
+ return "image/x-icon";
96
+ case ".woff2":
97
+ return "font/woff2";
98
+ default:
99
+ return "application/octet-stream";
100
+ }
101
+ };
102
+ var isNivelAssetRequestUrl = (requestUrl) => {
103
+ return normalizeNivelAssetPathname(getRequestPathname(requestUrl)) !== null;
104
+ };
105
+ var isNivelAssetPath = (filePath) => {
106
+ const normalizedFilePath = toPosix(path.resolve(filePath));
107
+ const assetsRoot = toPosix(getNivelPublicAssetsRoot());
108
+ return normalizedFilePath.startsWith(`${assetsRoot}/`);
109
+ };
110
+
111
+ // src/runtime/node/plugin.ts
112
+ var syncGeneratedPages = async (server, rootDir) => {
113
+ const docsConfig = await loadDocsConfig({
114
+ rootDir,
115
+ loadModule: (modulePath) => server.ssrLoadModule(modulePath)
116
+ });
117
+ syncGeneratedDocsPages({ rootDir, docsConfig });
118
+ };
119
+ var nivelPagesPlugin = () => {
120
+ let shouldEmitBuildAssets = false;
121
+ return {
122
+ name: "nivel-pages-plugin",
123
+ enforce: "pre",
124
+ configResolved(config) {
125
+ shouldEmitBuildAssets = config.command === "build" && !config.build.ssr;
126
+ },
127
+ buildStart() {
128
+ if (!shouldEmitBuildAssets) {
129
+ return;
130
+ }
131
+ for (const asset of getNivelPublicAssets()) {
132
+ this.emitFile({
133
+ fileName: asset.fileName,
134
+ source: fs2.readFileSync(asset.filePath),
135
+ type: "asset"
136
+ });
137
+ }
138
+ },
139
+ configureServer(server) {
140
+ const rootDir = server.config.root;
141
+ const assetsRoot = getNivelPublicAssetsRoot();
142
+ let pendingSync = Promise.resolve();
143
+ server.watcher.add(assetsRoot);
144
+ const queueSync = (filePath) => {
145
+ if (!isDocsSourcePath(filePath, rootDir)) {
146
+ return;
147
+ }
148
+ pendingSync = pendingSync.then(async () => {
149
+ await syncGeneratedPages(server, rootDir);
150
+ server.ws.send({ type: "full-reload" });
151
+ }).catch((error) => {
152
+ console.error(error);
153
+ });
154
+ };
155
+ server.watcher.on("add", queueSync);
156
+ server.watcher.on("unlink", queueSync);
157
+ server.watcher.on("change", (filePath) => {
158
+ if (!isNivelAssetPath(filePath)) {
159
+ return;
160
+ }
161
+ server.ws.send({ type: "full-reload" });
162
+ });
163
+ server.middlewares.use((req, res, next) => {
164
+ const filePath = getNivelPublicAssetFilePath(req.url);
165
+ if (filePath) {
166
+ res.setHeader("Content-Type", getNivelPublicAssetContentType(filePath));
167
+ res.setHeader("Cache-Control", "no-store");
168
+ res.end(fs2.readFileSync(filePath));
169
+ return;
170
+ }
171
+ if (isNivelAssetRequestUrl(req.url)) {
172
+ res.statusCode = 404;
173
+ res.setHeader("Cache-Control", "no-store");
174
+ res.end();
175
+ return;
176
+ }
177
+ next();
178
+ });
179
+ },
180
+ async handleHotUpdate(ctx) {
181
+ if (isNivelAssetPath(ctx.file)) {
182
+ ctx.server.ws.send({ type: "full-reload" });
183
+ return [];
184
+ }
185
+ if (!isDocsSourcePath(ctx.file, ctx.server.config.root)) {
186
+ return;
187
+ }
188
+ await syncGeneratedPages(ctx.server, ctx.server.config.root);
189
+ ctx.server.ws.send({ type: "full-reload" });
190
+ return [];
191
+ }
192
+ };
193
+ };
194
+
195
+ export {
196
+ nivelPagesPlugin
197
+ };
198
+ //# sourceMappingURL=chunk-K5ZYRA3G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/node/plugin.ts","../src/runtime/node/publicAssets.ts"],"sourcesContent":["import fs from 'node:fs'\nimport type { Plugin, ViteDevServer } from 'vite'\nimport { isDocsSourcePath, syncGeneratedDocsPages } from './codegen.js'\nimport {\n getNivelPublicAssetContentType,\n getNivelPublicAssetFilePath,\n getNivelPublicAssets,\n getNivelPublicAssetsRoot,\n isNivelAssetPath,\n isNivelAssetRequestUrl,\n} from './publicAssets.js'\nimport { loadDocsConfig } from './loadDocsConfig.js'\n\nconst syncGeneratedPages = async (server: ViteDevServer, rootDir: string) => {\n const docsConfig = await loadDocsConfig({\n rootDir,\n loadModule: (modulePath) => server.ssrLoadModule(modulePath),\n })\n syncGeneratedDocsPages({ rootDir, docsConfig })\n}\n\nexport const nivelPagesPlugin = (): Plugin => {\n let shouldEmitBuildAssets = false\n\n return {\n name: 'nivel-pages-plugin',\n enforce: 'pre',\n configResolved(config) {\n shouldEmitBuildAssets = config.command === 'build' && !config.build.ssr\n },\n buildStart() {\n if (!shouldEmitBuildAssets) {\n return\n }\n\n for (const asset of getNivelPublicAssets()) {\n this.emitFile({\n fileName: asset.fileName,\n source: fs.readFileSync(asset.filePath),\n type: 'asset',\n })\n }\n },\n configureServer(server) {\n const rootDir = server.config.root\n const assetsRoot = getNivelPublicAssetsRoot()\n let pendingSync = Promise.resolve()\n\n server.watcher.add(assetsRoot)\n\n const queueSync = (filePath: string) => {\n if (!isDocsSourcePath(filePath, rootDir)) {\n return\n }\n\n pendingSync = pendingSync\n .then(async () => {\n await syncGeneratedPages(server, rootDir)\n server.ws.send({ type: 'full-reload' })\n })\n .catch((error: unknown) => {\n console.error(error)\n })\n }\n\n server.watcher.on('add', queueSync)\n server.watcher.on('unlink', queueSync)\n\n server.watcher.on('change', (filePath) => {\n if (!isNivelAssetPath(filePath)) {\n return\n }\n\n server.ws.send({ type: 'full-reload' })\n })\n\n server.middlewares.use((req, res, next) => {\n const filePath = getNivelPublicAssetFilePath(req.url)\n\n if (filePath) {\n res.setHeader('Content-Type', getNivelPublicAssetContentType(filePath))\n res.setHeader('Cache-Control', 'no-store')\n res.end(fs.readFileSync(filePath))\n return\n }\n\n if (isNivelAssetRequestUrl(req.url)) {\n res.statusCode = 404\n res.setHeader('Cache-Control', 'no-store')\n res.end()\n return\n }\n\n next()\n })\n },\n async handleHotUpdate(ctx) {\n if (isNivelAssetPath(ctx.file)) {\n ctx.server.ws.send({ type: 'full-reload' })\n return []\n }\n\n if (!isDocsSourcePath(ctx.file, ctx.server.config.root)) {\n return\n }\n\n await syncGeneratedPages(ctx.server, ctx.server.config.root)\n ctx.server.ws.send({ type: 'full-reload' })\n return []\n },\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { nivelPublicRoute } from '../../shared/assets.js'\n\nconst toPosix = (value: string) => value.split(path.sep).join(path.posix.sep)\n\nconst collectPublicAssetFilePaths = (directoryPath: string): string[] => {\n return fs.readdirSync(directoryPath, { withFileTypes: true }).flatMap((entry) => {\n const entryPath = path.join(directoryPath, entry.name)\n return entry.isDirectory() ? collectPublicAssetFilePaths(entryPath) : [entryPath]\n })\n}\n\nconst getRequestPathname = (requestUrl: string | undefined) => {\n return requestUrl?.split('?')[0]?.split('#')[0] ?? ''\n}\n\nconst normalizeNivelAssetPathname = (pathname: string) => {\n if (pathname === nivelPublicRoute) {\n return pathname\n }\n\n if (!pathname.startsWith(`${nivelPublicRoute}/`)) {\n return null\n }\n\n const trimmedPathname = pathname.replace(/\\/+$/g, '')\n if (trimmedPathname !== pathname && path.extname(trimmedPathname)) {\n return trimmedPathname\n }\n\n return pathname\n}\n\nconst getPublicAssetsRootCandidates = (runtimeDir: string) => {\n let packageRoot: string | null = null\n\n try {\n const nivelConfigUrl = import.meta.resolve('@unterberg/nivel/vike')\n const nivelConfigPath = fileURLToPath(nivelConfigUrl)\n packageRoot = path.resolve(path.dirname(nivelConfigPath), '..')\n } catch {\n packageRoot = null\n }\n\n return [\n ...(packageRoot ? [path.join(packageRoot, 'assets')] : []),\n path.resolve(runtimeDir, '../assets'),\n path.resolve(runtimeDir, '../../assets'),\n ]\n}\n\nexport const getNivelPublicAssetsRoot = () => {\n const runtimeUrl = import.meta.url.startsWith('/') ? pathToFileURL(import.meta.url).href : import.meta.url\n const runtimeDir = path.dirname(fileURLToPath(runtimeUrl))\n\n for (const candidate of getPublicAssetsRootCandidates(runtimeDir)) {\n if (fs.existsSync(candidate) && fs.statSync(candidate).isDirectory()) {\n return candidate\n }\n }\n\n throw new Error(`Unable to locate nivel public assets from ${runtimeDir}.`)\n}\n\nexport const getNivelPublicAssets = () => {\n const assetsRoot = getNivelPublicAssetsRoot()\n\n return collectPublicAssetFilePaths(assetsRoot).map((filePath) => ({\n fileName: toPosix(path.relative(assetsRoot, filePath)),\n filePath,\n }))\n}\n\nexport const getNivelPublicAssetFilePath = (requestUrl: string | undefined) => {\n const pathname = normalizeNivelAssetPathname(getRequestPathname(requestUrl))\n\n if (!pathname) {\n return null\n }\n\n const assetsRoot = getNivelPublicAssetsRoot()\n const relativePath = pathname.replace(/^\\/+/, '')\n const filePath = path.resolve(assetsRoot, relativePath)\n const relativeToRoot = path.relative(assetsRoot, filePath)\n\n if (\n relativeToRoot.startsWith('..') ||\n path.isAbsolute(relativeToRoot) ||\n !fs.existsSync(filePath) ||\n !fs.statSync(filePath).isFile()\n ) {\n return null\n }\n\n return filePath\n}\n\nexport const getNivelPublicAssetContentType = (filePath: string) => {\n switch (path.extname(filePath)) {\n case '.css':\n return 'text/css; charset=utf-8'\n case '.svg':\n return 'image/svg+xml'\n case '.png':\n return 'image/png'\n case '.ico':\n return 'image/x-icon'\n case '.woff2':\n return 'font/woff2'\n default:\n return 'application/octet-stream'\n }\n}\n\nexport const isNivelAssetRequestUrl = (requestUrl: string | undefined) => {\n return normalizeNivelAssetPathname(getRequestPathname(requestUrl)) !== null\n}\n\nexport const isNivelAssetPath = (filePath: string) => {\n const normalizedFilePath = toPosix(path.resolve(filePath))\n const assetsRoot = toPosix(getNivelPublicAssetsRoot())\n return normalizedFilePath.startsWith(`${assetsRoot}/`)\n}\n"],"mappings":";;;;;;;;;;AAAA,OAAOA,SAAQ;;;ACAf,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,eAAe,qBAAqB;AAG7C,IAAM,UAAU,CAAC,UAAkB,MAAM,MAAM,KAAK,GAAG,EAAE,KAAK,KAAK,MAAM,GAAG;AAE5E,IAAM,8BAA8B,CAAC,kBAAoC;AACvE,SAAO,GAAG,YAAY,eAAe,EAAE,eAAe,KAAK,CAAC,EAAE,QAAQ,CAAC,UAAU;AAC/E,UAAM,YAAY,KAAK,KAAK,eAAe,MAAM,IAAI;AACrD,WAAO,MAAM,YAAY,IAAI,4BAA4B,SAAS,IAAI,CAAC,SAAS;AAAA,EAClF,CAAC;AACH;AAEA,IAAM,qBAAqB,CAAC,eAAmC;AAC7D,SAAO,YAAY,MAAM,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK;AACrD;AAEA,IAAM,8BAA8B,CAAC,aAAqB;AACxD,MAAI,aAAa,kBAAkB;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,WAAW,GAAG,gBAAgB,GAAG,GAAG;AAChD,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,SAAS,QAAQ,SAAS,EAAE;AACpD,MAAI,oBAAoB,YAAY,KAAK,QAAQ,eAAe,GAAG;AACjE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,IAAM,gCAAgC,CAAC,eAAuB;AAC5D,MAAI,cAA6B;AAEjC,MAAI;AACF,UAAM,iBAAiB,YAAY,QAAQ,uBAAuB;AAClE,UAAM,kBAAkB,cAAc,cAAc;AACpD,kBAAc,KAAK,QAAQ,KAAK,QAAQ,eAAe,GAAG,IAAI;AAAA,EAChE,QAAQ;AACN,kBAAc;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,GAAI,cAAc,CAAC,KAAK,KAAK,aAAa,QAAQ,CAAC,IAAI,CAAC;AAAA,IACxD,KAAK,QAAQ,YAAY,WAAW;AAAA,IACpC,KAAK,QAAQ,YAAY,cAAc;AAAA,EACzC;AACF;AAEO,IAAM,2BAA2B,MAAM;AAC5C,QAAM,aAAa,YAAY,IAAI,WAAW,GAAG,IAAI,cAAc,YAAY,GAAG,EAAE,OAAO,YAAY;AACvG,QAAM,aAAa,KAAK,QAAQ,cAAc,UAAU,CAAC;AAEzD,aAAW,aAAa,8BAA8B,UAAU,GAAG;AACjE,QAAI,GAAG,WAAW,SAAS,KAAK,GAAG,SAAS,SAAS,EAAE,YAAY,GAAG;AACpE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,6CAA6C,UAAU,GAAG;AAC5E;AAEO,IAAM,uBAAuB,MAAM;AACxC,QAAM,aAAa,yBAAyB;AAE5C,SAAO,4BAA4B,UAAU,EAAE,IAAI,CAAC,cAAc;AAAA,IAChE,UAAU,QAAQ,KAAK,SAAS,YAAY,QAAQ,CAAC;AAAA,IACrD;AAAA,EACF,EAAE;AACJ;AAEO,IAAM,8BAA8B,CAAC,eAAmC;AAC7E,QAAM,WAAW,4BAA4B,mBAAmB,UAAU,CAAC;AAE3E,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,yBAAyB;AAC5C,QAAM,eAAe,SAAS,QAAQ,QAAQ,EAAE;AAChD,QAAM,WAAW,KAAK,QAAQ,YAAY,YAAY;AACtD,QAAM,iBAAiB,KAAK,SAAS,YAAY,QAAQ;AAEzD,MACE,eAAe,WAAW,IAAI,KAC9B,KAAK,WAAW,cAAc,KAC9B,CAAC,GAAG,WAAW,QAAQ,KACvB,CAAC,GAAG,SAAS,QAAQ,EAAE,OAAO,GAC9B;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,IAAM,iCAAiC,CAAC,aAAqB;AAClE,UAAQ,KAAK,QAAQ,QAAQ,GAAG;AAAA,IAC9B,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,yBAAyB,CAAC,eAAmC;AACxE,SAAO,4BAA4B,mBAAmB,UAAU,CAAC,MAAM;AACzE;AAEO,IAAM,mBAAmB,CAAC,aAAqB;AACpD,QAAM,qBAAqB,QAAQ,KAAK,QAAQ,QAAQ,CAAC;AACzD,QAAM,aAAa,QAAQ,yBAAyB,CAAC;AACrD,SAAO,mBAAmB,WAAW,GAAG,UAAU,GAAG;AACvD;;;AD/GA,IAAM,qBAAqB,OAAO,QAAuB,YAAoB;AAC3E,QAAM,aAAa,MAAM,eAAe;AAAA,IACtC;AAAA,IACA,YAAY,CAAC,eAAe,OAAO,cAAc,UAAU;AAAA,EAC7D,CAAC;AACD,yBAAuB,EAAE,SAAS,WAAW,CAAC;AAChD;AAEO,IAAM,mBAAmB,MAAc;AAC5C,MAAI,wBAAwB;AAE5B,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,eAAe,QAAQ;AACrB,8BAAwB,OAAO,YAAY,WAAW,CAAC,OAAO,MAAM;AAAA,IACtE;AAAA,IACA,aAAa;AACX,UAAI,CAAC,uBAAuB;AAC1B;AAAA,MACF;AAEA,iBAAW,SAAS,qBAAqB,GAAG;AAC1C,aAAK,SAAS;AAAA,UACZ,UAAU,MAAM;AAAA,UAChB,QAAQC,IAAG,aAAa,MAAM,QAAQ;AAAA,UACtC,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,gBAAgB,QAAQ;AACtB,YAAM,UAAU,OAAO,OAAO;AAC9B,YAAM,aAAa,yBAAyB;AAC5C,UAAI,cAAc,QAAQ,QAAQ;AAElC,aAAO,QAAQ,IAAI,UAAU;AAE7B,YAAM,YAAY,CAAC,aAAqB;AACtC,YAAI,CAAC,iBAAiB,UAAU,OAAO,GAAG;AACxC;AAAA,QACF;AAEA,sBAAc,YACX,KAAK,YAAY;AAChB,gBAAM,mBAAmB,QAAQ,OAAO;AACxC,iBAAO,GAAG,KAAK,EAAE,MAAM,cAAc,CAAC;AAAA,QACxC,CAAC,EACA,MAAM,CAAC,UAAmB;AACzB,kBAAQ,MAAM,KAAK;AAAA,QACrB,CAAC;AAAA,MACL;AAEA,aAAO,QAAQ,GAAG,OAAO,SAAS;AAClC,aAAO,QAAQ,GAAG,UAAU,SAAS;AAErC,aAAO,QAAQ,GAAG,UAAU,CAAC,aAAa;AACxC,YAAI,CAAC,iBAAiB,QAAQ,GAAG;AAC/B;AAAA,QACF;AAEA,eAAO,GAAG,KAAK,EAAE,MAAM,cAAc,CAAC;AAAA,MACxC,CAAC;AAED,aAAO,YAAY,IAAI,CAAC,KAAK,KAAK,SAAS;AACzC,cAAM,WAAW,4BAA4B,IAAI,GAAG;AAEpD,YAAI,UAAU;AACZ,cAAI,UAAU,gBAAgB,+BAA+B,QAAQ,CAAC;AACtE,cAAI,UAAU,iBAAiB,UAAU;AACzC,cAAI,IAAIA,IAAG,aAAa,QAAQ,CAAC;AACjC;AAAA,QACF;AAEA,YAAI,uBAAuB,IAAI,GAAG,GAAG;AACnC,cAAI,aAAa;AACjB,cAAI,UAAU,iBAAiB,UAAU;AACzC,cAAI,IAAI;AACR;AAAA,QACF;AAEA,aAAK;AAAA,MACP,CAAC;AAAA,IACH;AAAA,IACA,MAAM,gBAAgB,KAAK;AACzB,UAAI,iBAAiB,IAAI,IAAI,GAAG;AAC9B,YAAI,OAAO,GAAG,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,eAAO,CAAC;AAAA,MACV;AAEA,UAAI,CAAC,iBAAiB,IAAI,MAAM,IAAI,OAAO,OAAO,IAAI,GAAG;AACvD;AAAA,MACF;AAEA,YAAM,mBAAmB,IAAI,QAAQ,IAAI,OAAO,OAAO,IAAI;AAC3D,UAAI,OAAO,GAAG,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACF;","names":["fs","fs"]}
@@ -4,29 +4,34 @@ import { transformerNotationDiff, transformerNotationWordHighlight } from "@shik
4
4
  import rehypePrettyCode from "rehype-pretty-code";
5
5
  import remarkDirective from "remark-directive";
6
6
 
7
- // src/mdx/code-blocks/rehypeMetaToProps.ts
8
- import { visit } from "unist-util-visit";
9
-
10
7
  // src/mdx/code-blocks/meta.ts
11
8
  var kebabCase = (value) => {
12
9
  return value.replace(/([a-z])([A-Z])/g, "$1-$2").replaceAll("_", "-").toLowerCase();
13
10
  };
14
- var KEY_VALUE_PAIR_RE = /(?<name>[a-zA-Z_-]+)(?:=([^"'\s]+))?/g;
15
- var RESERVED_CODE_BLOCK_META_NAMES = /* @__PURE__ */ new Set([
16
- "choice",
17
- "file-added",
18
- "file-removed",
19
- "hide-menu",
20
- "max-width",
21
- "ts-only"
22
- ]);
11
+ var CODE_BLOCK_HEADER_ENVIRONMENTS = ["client", "server"];
12
+ var CODE_BLOCK_PRE_PROP_NAMES = ["data-language-label", "file-added", "file-removed", "hide-menu"];
13
+ var KEY_VALUE_PAIR_RE = /(?<name>[a-zA-Z_-]+)(?:=(?:"(?<doubleQuotedValue>[^"]*)"|'(?<singleQuotedValue>[^']*)'|(?<bareValue>[^\s"'=]+)))?/g;
14
+ var CODE_BLOCK_PRE_PROP_NAME_SET = new Set(CODE_BLOCK_PRE_PROP_NAMES);
15
+ var normalizeCodeBlockEnv = (value) => {
16
+ if (typeof value !== "string") {
17
+ return null;
18
+ }
19
+ const normalizedValue = value.trim().toLowerCase();
20
+ return CODE_BLOCK_HEADER_ENVIRONMENTS.includes(normalizedValue) ? normalizedValue : null;
21
+ };
23
22
  var parseMetaString = (meta, propNames) => {
24
23
  if (typeof meta !== "string" || meta.trim() === "") {
25
24
  return { props: {}, rest: "", tokens: [] };
26
25
  }
27
26
  const props = {};
28
27
  const tokens = [];
29
- const rest = meta.replaceAll(KEY_VALUE_PAIR_RE, (match, name, value) => {
28
+ const rest = meta.replaceAll(KEY_VALUE_PAIR_RE, (match, ...args) => {
29
+ const groups = args.at(-1);
30
+ const name = groups?.name;
31
+ if (!name) {
32
+ return match;
33
+ }
34
+ const value = groups?.doubleQuotedValue ?? groups?.singleQuotedValue ?? groups?.bareValue;
30
35
  const normalizedName = kebabCase(name);
31
36
  tokens.push({
32
37
  hasExplicitValue: value !== void 0,
@@ -46,24 +51,25 @@ var parseMetaString = (meta, propNames) => {
46
51
  tokens
47
52
  };
48
53
  };
54
+ var stripMetaProps = (meta, propNames) => {
55
+ return parseMetaString(meta, propNames).rest;
56
+ };
49
57
  var getCodeBlockPropsFromMeta = (meta) => {
50
58
  const parsed = parseMetaString(meta);
51
- const props = { ...parsed.props };
52
- const implicitTitleToken = parsed.tokens.find(
53
- (token) => !token.hasExplicitValue && !RESERVED_CODE_BLOCK_META_NAMES.has(token.name)
59
+ const props = Object.fromEntries(
60
+ Object.entries(parsed.props).filter(([name]) => CODE_BLOCK_PRE_PROP_NAME_SET.has(name))
54
61
  );
55
- const explicitTitle = typeof props.title === "string" && props.title.trim() ? props.title.trim() : null;
56
- delete props.title;
57
- if (implicitTitleToken) {
58
- delete props[implicitTitleToken.name];
59
- }
62
+ const explicitTitle = typeof parsed.props.title === "string" && parsed.props.title.trim() ? parsed.props.title.trim() : null;
63
+ const env = normalizeCodeBlockEnv(parsed.props.env);
60
64
  return {
61
65
  props,
62
- title: explicitTitle ?? implicitTitleToken?.raw.trim() ?? null
66
+ env,
67
+ title: explicitTitle
63
68
  };
64
69
  };
65
70
 
66
71
  // src/mdx/code-blocks/rehypeMetaToProps.ts
72
+ import { visit } from "unist-util-visit";
67
73
  var rehypeMetaToProps = () => {
68
74
  return (tree) => {
69
75
  visit(tree, "element", (node, _index, parent) => {
@@ -75,6 +81,7 @@ var rehypeMetaToProps = () => {
75
81
  parent.properties = {
76
82
  ...parent.properties,
77
83
  ...meta.props,
84
+ ...meta.env ? { "data-code-env": meta.env } : {},
78
85
  ...meta.title ? { "data-code-title": meta.title } : {}
79
86
  };
80
87
  });
@@ -381,6 +388,7 @@ var transformTsToJs = async (node, file) => {
381
388
  const jsCode = {
382
389
  ...codeBlock,
383
390
  lang: String(codeBlock.lang).replace("t", "j"),
391
+ meta: replaceCodeBlockTitleFileExtension(codeBlock.meta, String(codeBlock.lang).replace("t", "j")),
384
392
  value: codeBlockContentJs
385
393
  };
386
394
  const replacement = generateChoiceGroupCode([
@@ -396,6 +404,32 @@ var transformTsToJs = async (node, file) => {
396
404
  parent.children.splice(index, 1, replacement);
397
405
  };
398
406
  var replaceFileNameSuffixes = (value) => value.replaceAll(".ts", ".js");
407
+ var replaceCodeBlockTitleFileExtension = (meta, outputLang) => {
408
+ if (typeof meta !== "string" || meta.trim() === "") {
409
+ return meta;
410
+ }
411
+ const parsedMeta = parseMetaString(meta);
412
+ const titleToken = parsedMeta.tokens.find((token) => token.name === "title" && token.hasExplicitValue);
413
+ const titleValue = typeof parsedMeta.props.title === "string" ? parsedMeta.props.title : null;
414
+ if (!titleToken || !titleValue) {
415
+ return meta;
416
+ }
417
+ const nextTitleValue = replaceTitleFileExtension(titleValue, outputLang);
418
+ if (nextTitleValue === titleValue) {
419
+ return meta;
420
+ }
421
+ const quote = titleToken.raw.includes("title='") ? "'" : '"';
422
+ return meta.replace(titleToken.raw, `title=${quote}${nextTitleValue}${quote}`);
423
+ };
424
+ var replaceTitleFileExtension = (title, outputLang) => {
425
+ if (outputLang === "jsx") {
426
+ return title.replace(/\.tsx$/i, ".jsx").replace(/\.ts$/i, ".js");
427
+ }
428
+ if (outputLang === "js") {
429
+ return title.replace(/\.tsx$/i, ".jsx").replace(/\.ts$/i, ".js");
430
+ }
431
+ return title;
432
+ };
399
433
  var cleanUpCode = (code, isJsCode = false) => {
400
434
  if (isJsCode) {
401
435
  code = correctCodeDiffComments(code);
@@ -627,6 +661,7 @@ var getCodeBlockMdxPlugins = () => {
627
661
  rehypePrettyCode,
628
662
  {
629
663
  keepBackground: false,
664
+ filterMetaString: (meta) => stripMetaProps(meta, ["title"]),
630
665
  theme: {
631
666
  light: "github-light",
632
667
  dark: "one-dark-pro"
@@ -646,6 +681,7 @@ var getCodeBlockMdxPlugins = () => {
646
681
 
647
682
  export {
648
683
  parseMetaString,
684
+ stripMetaProps,
649
685
  getCodeBlockPropsFromMeta,
650
686
  rehypeMetaToProps,
651
687
  remarkChoiceGroup,
@@ -654,4 +690,4 @@ export {
654
690
  shikiTransformerAutoLinks,
655
691
  getCodeBlockMdxPlugins
656
692
  };
657
- //# sourceMappingURL=chunk-UWP3C7JT.js.map
693
+ //# sourceMappingURL=chunk-Q7JU4J6A.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mdx/code-blocks/index.ts","../src/mdx/code-blocks/meta.ts","../src/mdx/code-blocks/rehypeMetaToProps.ts","../src/mdx/code-blocks/remarkChoiceGroup.ts","../src/mdx/code-blocks/generateChoiceGroupCode.ts","../src/mdx/code-blocks/remarkDetype.ts","../src/mdx/code-blocks/remarkPkgManager.ts","../src/mdx/code-blocks/shikiTransformerAutoLinks.ts"],"sourcesContent":["import { transformerNotationHighlight } from '@brillout/shiki-transformers'\nimport { transformerNotationDiff, transformerNotationWordHighlight } from '@shikijs/transformers'\nimport rehypePrettyCode from 'rehype-pretty-code'\nimport remarkDirective from 'remark-directive'\nimport { stripMetaProps } from './meta.js'\nimport { rehypeMetaToProps } from './rehypeMetaToProps.js'\nimport { remarkChoiceGroup } from './remarkChoiceGroup.js'\nimport { remarkDetype } from './remarkDetype.js'\nimport { remarkPkgManager } from './remarkPkgManager.js'\nimport { shikiTransformerAutoLinks } from './shikiTransformerAutoLinks.js'\n\nexport { getCodeBlockPropsFromMeta, parseMetaString, stripMetaProps } from './meta.js'\nexport { rehypeMetaToProps } from './rehypeMetaToProps.js'\nexport { remarkChoiceGroup } from './remarkChoiceGroup.js'\nexport { remarkDetype } from './remarkDetype.js'\nexport { remarkPkgManager } from './remarkPkgManager.js'\nexport { shikiTransformerAutoLinks } from './shikiTransformerAutoLinks.js'\n\nexport const getCodeBlockMdxPlugins = (): {\n remarkPlugins: any[]\n rehypePlugins: any[]\n} => {\n return {\n remarkPlugins: [remarkDirective, remarkDetype, remarkPkgManager, remarkChoiceGroup],\n rehypePlugins: [\n [\n rehypePrettyCode,\n {\n keepBackground: false,\n filterMetaString: (meta: string) => stripMetaProps(meta, ['title']),\n theme: {\n light: 'github-light',\n dark: 'one-dark-pro',\n },\n transformers: [\n transformerNotationDiff(),\n transformerNotationHighlight(),\n transformerNotationWordHighlight(),\n shikiTransformerAutoLinks(),\n ],\n },\n ],\n rehypeMetaToProps,\n ],\n }\n}\n","const kebabCase = (value: string) => {\n return value\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replaceAll('_', '-')\n .toLowerCase()\n}\n\nconst CODE_BLOCK_HEADER_ENVIRONMENTS = ['client', 'server'] as const\nconst CODE_BLOCK_PRE_PROP_NAMES = ['data-language-label', 'file-added', 'file-removed', 'hide-menu'] as const\n\ntype ParsedMeta<Name extends string = string> = {\n props: Partial<Record<Name, string>>\n rest: string\n tokens: ParsedMetaToken[]\n}\n\ntype ParsedMetaToken = {\n hasExplicitValue: boolean\n name: string\n raw: string\n value?: string\n}\n\ntype CodeBlockHeaderEnvironment = (typeof CODE_BLOCK_HEADER_ENVIRONMENTS)[number]\n\nconst KEY_VALUE_PAIR_RE =\n /(?<name>[a-zA-Z_-]+)(?:=(?:\"(?<doubleQuotedValue>[^\"]*)\"|'(?<singleQuotedValue>[^']*)'|(?<bareValue>[^\\s\"'=]+)))?/g\nconst CODE_BLOCK_PRE_PROP_NAME_SET = new Set<string>(CODE_BLOCK_PRE_PROP_NAMES)\n\nconst normalizeCodeBlockEnv = (value: unknown): CodeBlockHeaderEnvironment | null => {\n if (typeof value !== 'string') {\n return null\n }\n\n const normalizedValue = value.trim().toLowerCase()\n return CODE_BLOCK_HEADER_ENVIRONMENTS.includes(normalizedValue as CodeBlockHeaderEnvironment)\n ? (normalizedValue as CodeBlockHeaderEnvironment)\n : null\n}\n\nexport const parseMetaString = <Name extends string = string>(meta: unknown, propNames?: Name[]): ParsedMeta<Name> => {\n if (typeof meta !== 'string' || meta.trim() === '') {\n return { props: {}, rest: '', tokens: [] }\n }\n\n const props: ParsedMeta['props'] = {}\n const tokens: ParsedMetaToken[] = []\n const rest = meta.replaceAll(KEY_VALUE_PAIR_RE, (match, ...args) => {\n const groups = args.at(-1) as\n | {\n bareValue?: string\n doubleQuotedValue?: string\n name?: string\n singleQuotedValue?: string\n }\n | undefined\n const name = groups?.name\n if (!name) {\n return match\n }\n\n const value = groups?.doubleQuotedValue ?? groups?.singleQuotedValue ?? groups?.bareValue\n const normalizedName = kebabCase(name)\n tokens.push({\n hasExplicitValue: value !== undefined,\n name: normalizedName,\n raw: match,\n value,\n })\n\n if (propNames && !propNames.includes(normalizedName as Name)) {\n return match\n }\n\n props[normalizedName] = value || 'true'\n return ''\n })\n\n return {\n props,\n rest: rest.trim(),\n tokens,\n }\n}\n\nexport const stripMetaProps = <Name extends string = string>(meta: unknown, propNames: Name[]) => {\n return parseMetaString(meta, propNames).rest\n}\n\nexport const getCodeBlockPropsFromMeta = (meta: unknown) => {\n const parsed = parseMetaString(meta)\n const props = Object.fromEntries(\n Object.entries(parsed.props).filter(([name]) => CODE_BLOCK_PRE_PROP_NAME_SET.has(name)),\n ) as Record<string, string>\n const explicitTitle =\n typeof parsed.props.title === 'string' && parsed.props.title.trim() ? parsed.props.title.trim() : null\n const env = normalizeCodeBlockEnv(parsed.props.env)\n\n return {\n props,\n env,\n title: explicitTitle,\n }\n}\n","import { visit } from 'unist-util-visit'\nimport { getCodeBlockPropsFromMeta } from './meta.js'\n\nexport const rehypeMetaToProps = () => {\n return (tree: unknown) => {\n visit(tree as any, 'element', (node: any, _index, parent: any) => {\n if (node.tagName !== 'code' || parent?.type !== 'element' || parent.tagName !== 'pre') {\n return\n }\n\n const meta = getCodeBlockPropsFromMeta(node.data?.meta)\n parent.properties ??= {}\n parent.properties = {\n ...parent.properties,\n ...meta.props,\n ...(meta.env ? { 'data-code-env': meta.env } : {}),\n ...(meta.title ? { 'data-code-title': meta.title } : {}),\n }\n })\n }\n}\n","import { visit } from 'unist-util-visit'\nimport { generateChoiceGroupCode } from './generateChoiceGroupCode.js'\nimport { parseMetaString } from './meta.js'\n\nexport const remarkChoiceGroup = () => {\n return (tree: unknown) => {\n visit(tree as any, (node: any) => {\n if (node.type === 'code' && node.meta) {\n const meta = parseMetaString(node.meta, ['choice'])\n const choice = meta.props.choice\n node.meta = meta.rest\n\n if (choice) {\n node.data ??= {}\n node.data.customDataChoice = choice\n node.data.customDataFilter = 'explicitChoice'\n }\n }\n\n if (node.type === 'containerDirective' && node.name === 'Choice') {\n const choice = typeof node.attributes?.id === 'string' ? node.attributes.id : null\n if (!choice) {\n return\n }\n\n node.data ??= {}\n node.data.customDataChoice = choice\n node.data.customDataFilter = node.type\n node.attributes = {}\n }\n })\n\n visit(tree as any, (node: any) => {\n if (!Array.isArray(node.children)) {\n return\n }\n\n let start = -1\n let end = 0\n\n const processRange = () => {\n if (start === -1 || start === end) {\n return\n }\n\n const nodes = node.children.slice(start, end)\n const replacements = filterChoices(nodes).map((choiceNodes) => generateChoiceGroupCode(choiceNodes, node))\n node.children.splice(start, end - start, ...replacements)\n end = start + replacements.length\n start = -1\n }\n\n for (; end < node.children.length; end += 1) {\n const child = node.children[end]\n\n if (!['code', 'mdxJsxFlowElement', 'containerDirective'].includes(child?.type)) {\n processRange()\n continue\n }\n\n if (!child.data?.customDataChoice) {\n processRange()\n continue\n }\n\n if (start === -1) {\n start = end\n }\n }\n\n processRange()\n })\n }\n}\n\nconst filterChoices = (nodes: any[]) => {\n const filteredChoices: Array<Array<{ choiceValue: string; children: any[] }>> = []\n const filters = [...new Set(nodes.map((node) => node.data?.customDataFilter).filter(Boolean))]\n\n for (const filter of filters) {\n const nodesByChoice = new Map<string, any[]>()\n\n for (const node of nodes.filter((candidate) => candidate.data?.customDataFilter === filter)) {\n const choice = node.data?.customDataChoice\n if (!choice) {\n continue\n }\n\n node.data.customDataChoice = undefined\n const choiceNodes = nodesByChoice.get(choice) ?? []\n choiceNodes.push(node)\n nodesByChoice.set(choice, choiceNodes)\n }\n\n filteredChoices.push(\n [...nodesByChoice].map(([choiceValue, children]) => ({\n choiceValue,\n children,\n })),\n )\n }\n\n return filteredChoices\n}\n","import { valueToEstree } from 'estree-util-value-to-estree'\nimport type { MdxJsxAttribute, MdxJsxFlowElement } from 'mdast-util-mdx-jsx'\n\ntype ChoiceNode = {\n choiceValue: string\n children: any[]\n}\n\nconst BUILT_IN_CHOICE_GROUPS = {\n codeLang: {\n choices: ['JavaScript', 'TypeScript'],\n default: 'JavaScript',\n },\n pkgManager: {\n choices: ['npm', 'pnpm', 'Bun', 'Yarn'],\n default: 'npm',\n },\n} as const\n\nconst getChoiceGroup = (choicesRaw: string[]) => {\n const choices = [...new Set(choicesRaw.filter(Boolean))]\n\n for (const [name, group] of Object.entries(BUILT_IN_CHOICE_GROUPS)) {\n if (!choices.every((choice) => group.choices.includes(choice as never))) {\n continue\n }\n\n return {\n name,\n choices: group.choices,\n default: group.default,\n disabled: group.choices.filter((choice) => !choices.includes(choice)),\n }\n }\n\n return {\n name: `custom:${choices.join('|')}`,\n choices,\n default: choices[0] ?? '',\n disabled: [] as string[],\n }\n}\n\nexport const generateChoiceGroupCode = (choiceNodes: ChoiceNode[], parent?: any): MdxJsxFlowElement => {\n const choiceGroup = getChoiceGroup(choiceNodes.map((choiceNode) => choiceNode.choiceValue))\n const mergedChoiceNodes = choiceGroup.choices.map((choice) => {\n const choiceNode = choiceNodes.find((node) => node.choiceValue === choice)\n\n return {\n choiceValue: choice,\n children: choiceNode?.children ?? [],\n }\n })\n\n const attributes: MdxJsxAttribute[] = [\n {\n type: 'mdxJsxAttribute',\n name: 'choiceGroup',\n value: {\n type: 'mdxJsxAttributeValueExpression',\n value: '',\n data: {\n estree: {\n type: 'Program',\n sourceType: 'module',\n comments: [],\n body: [\n {\n type: 'ExpressionStatement',\n expression: valueToEstree(choiceGroup) as any,\n } as any,\n ],\n } as any,\n },\n },\n },\n ]\n\n if (choiceNodes.length === 1) {\n attributes.push({ type: 'mdxJsxAttribute', name: 'hide' })\n }\n\n attributes.push({\n type: 'mdxJsxAttribute',\n name: 'lvl',\n value: `${parent?.type === 'mdxJsxFlowElement' ? 1 : 0}`,\n })\n\n const children: MdxJsxFlowElement[] = mergedChoiceNodes.map((choiceNode) => {\n const choiceChildren =\n choiceNode.children.length > 0 && choiceNode.children.every((node) => node.type === 'containerDirective')\n ? choiceNode.children.flatMap((node) => node.children ?? [])\n : choiceNode.children\n\n for (const child of choiceChildren) {\n increaseLvl(child)\n }\n\n return {\n type: 'mdxJsxFlowElement',\n name: 'div',\n attributes: [\n {\n type: 'mdxJsxAttribute',\n name: 'data-choice-value',\n value: choiceNode.choiceValue,\n },\n { type: 'mdxJsxAttribute', name: 'className', value: 'choice' },\n ],\n children: choiceChildren,\n }\n })\n\n return {\n type: 'mdxJsxFlowElement',\n name: 'ChoiceGroup',\n attributes,\n children,\n }\n}\n\nconst increaseLvl = (node: any) => {\n if (node?.type !== 'mdxJsxFlowElement' || node.name !== 'ChoiceGroup') {\n return\n }\n\n const attribute = node.attributes.find(\n (candidate: any) => candidate.type === 'mdxJsxAttribute' && candidate.name === 'lvl',\n )\n\n if (typeof attribute?.value === 'string') {\n attribute.value = `${Number(attribute.value) + 1}`\n }\n}\n","import { transform as detype } from 'detype'\nimport { visit } from 'unist-util-visit'\nimport { generateChoiceGroupCode } from './generateChoiceGroupCode.js'\nimport { parseMetaString } from './meta.js'\n\nconst prettierOptions = {\n semi: false,\n singleQuote: true,\n trailingComma: 'none',\n} as const\n\nexport const remarkDetype = () => {\n return async (tree: unknown, file: any) => {\n const codeNodes: Array<{ codeBlock: any; index: number; parent: any }> = []\n\n visit(tree as any, 'code', (node: any, index: number | undefined, parent: any) => {\n if (!parent || typeof index !== 'number') {\n return\n }\n\n if (!['ts', 'tsx', 'vue', 'yaml'].includes(node.lang ?? '')) {\n return\n }\n\n if (typeof node.meta === 'string' && node.meta.includes('ts-only')) {\n return\n }\n\n codeNodes.push({ codeBlock: node, index, parent })\n })\n\n for (const node of [...codeNodes].reverse()) {\n if (node.codeBlock.lang === 'yaml') {\n transformYaml(node)\n } else {\n await transformTsToJs(node, file)\n }\n }\n }\n}\n\nconst transformYaml = (node: { codeBlock: any; index: number; parent: any }) => {\n const { codeBlock, index, parent } = node\n const codeBlockContentJs = replaceFileNameSuffixes(codeBlock.value)\n\n if (codeBlockContentJs === codeBlock.value) {\n return\n }\n\n const meta = parseMetaString(codeBlock.meta, ['choice'])\n const choice = meta.props.choice\n codeBlock.meta = meta.rest\n\n const yamlJsCode = {\n ...codeBlock,\n value: codeBlockContentJs,\n }\n\n const replacement = generateChoiceGroupCode([\n { choiceValue: 'JavaScript', children: [yamlJsCode] },\n { choiceValue: 'TypeScript', children: [codeBlock] },\n ])\n\n replacement.attributes.push({ type: 'mdxJsxAttribute', name: 'hide' })\n replacement.data ??= {} as any\n ;(replacement.data as any).customDataChoice = choice\n ;(replacement.data as any).customDataFilter = 'codeLang'\n parent.children.splice(index, 1, replacement)\n}\n\nconst transformTsToJs = async (node: { codeBlock: any; index: number; parent: any }, file: any) => {\n const { codeBlock, index, parent } = node\n const meta = parseMetaString(codeBlock.meta, ['max-width', 'choice'])\n const maxWidth = Number(meta.props['max-width'])\n const choice = meta.props.choice\n codeBlock.meta = meta.rest\n\n codeBlock.data ??= {}\n codeBlock.data.customDataChoice = choice\n codeBlock.data.customDataFilter = 'codeLang'\n\n if (choice === 'TypeScript') {\n return\n }\n\n const codeBlockReplacedJs = replaceFileNameSuffixes(codeBlock.value)\n let codeBlockContentJs = ''\n\n try {\n codeBlockContentJs = await detype(codeBlockReplacedJs, `snippet.${codeBlock.lang}`, {\n customizeBabelConfig(config) {\n if (!config.presets || config.presets.length !== 1) {\n return\n }\n\n config.presets = [[config.presets[0], { onlyRemoveTypeImports: true }]]\n },\n removeTsComments: true,\n prettierOptions: {\n ...prettierOptions,\n printWidth: Number.isFinite(maxWidth) && maxWidth > 0 ? maxWidth : 99,\n },\n })\n } catch (error) {\n console.error(\n [\n `Failed to detype code block in ${file?.path ?? 'an MDX file'}.`,\n error instanceof Error ? error.message : String(error),\n ].join('\\n'),\n )\n return\n }\n\n codeBlockContentJs = cleanUpCode(codeBlockContentJs.trimEnd(), true)\n codeBlock.value = cleanUpCode(codeBlock.value)\n codeBlockContentJs = preserveSourceLineBreaks(codeBlock.value, codeBlockContentJs)\n codeBlockContentJs = preserveSourceBlankLines(codeBlock.value, codeBlockContentJs)\n\n if (codeBlockContentJs === codeBlock.value) {\n return\n }\n\n const tsCode = { ...codeBlock, lang: codeBlock.lang }\n const jsCode = {\n ...codeBlock,\n lang: String(codeBlock.lang).replace('t', 'j'),\n meta: replaceCodeBlockTitleFileExtension(codeBlock.meta, String(codeBlock.lang).replace('t', 'j')),\n value: codeBlockContentJs,\n }\n\n const replacement = generateChoiceGroupCode([\n { choiceValue: 'JavaScript', children: [jsCode] },\n { choiceValue: 'TypeScript', children: [tsCode] },\n ])\n\n if (codeBlockReplacedJs === codeBlockContentJs) {\n replacement.attributes.push({ type: 'mdxJsxAttribute', name: 'hide' })\n }\n\n replacement.data ??= {} as any\n ;(replacement.data as any).customDataChoice = codeBlock.data.customDataChoice\n ;(replacement.data as any).customDataFilter = codeBlock.data.customDataFilter\n parent.children.splice(index, 1, replacement)\n}\n\nconst replaceFileNameSuffixes = (value: string) => value.replaceAll('.ts', '.js')\n\nconst replaceCodeBlockTitleFileExtension = (meta: unknown, outputLang: string) => {\n if (typeof meta !== 'string' || meta.trim() === '') {\n return meta\n }\n\n const parsedMeta = parseMetaString(meta)\n const titleToken = parsedMeta.tokens.find((token) => token.name === 'title' && token.hasExplicitValue)\n const titleValue = typeof parsedMeta.props.title === 'string' ? parsedMeta.props.title : null\n\n if (!titleToken || !titleValue) {\n return meta\n }\n\n const nextTitleValue = replaceTitleFileExtension(titleValue, outputLang)\n if (nextTitleValue === titleValue) {\n return meta\n }\n\n const quote = titleToken.raw.includes(\"title='\") ? \"'\" : '\"'\n return meta.replace(titleToken.raw, `title=${quote}${nextTitleValue}${quote}`)\n}\n\nconst replaceTitleFileExtension = (title: string, outputLang: string) => {\n if (outputLang === 'jsx') {\n return title.replace(/\\.tsx$/i, '.jsx').replace(/\\.ts$/i, '.js')\n }\n\n if (outputLang === 'js') {\n return title.replace(/\\.tsx$/i, '.jsx').replace(/\\.ts$/i, '.js')\n }\n\n return title\n}\n\nconst cleanUpCode = (code: string, isJsCode = false) => {\n if (isJsCode) {\n code = correctCodeDiffComments(code)\n }\n\n return processMagicComments(code)\n}\n\nconst processMagicComments = (code: string) => {\n const renameCommentRe = /^\\s*\\/\\/\\s@docpress-replace\\s([^ ]+) ([^ ]+)\\n/gm\n const matches = Array.from(code.matchAll(renameCommentRe))\n\n for (let index = matches.length - 1; index >= 0; index -= 1) {\n const match = matches[index]\n if (!match) {\n continue\n }\n\n const [fullMatch, renameFrom, renameTo] = match\n code = code.split(fullMatch).join('').replaceAll(renameFrom, renameTo)\n }\n\n return code.replaceAll('// @docpress-uncomment ', '')\n}\n\nconst correctCodeDiffComments = (code: string) => {\n return code.replaceAll(/\\n\\s*\\/\\/\\s\\[!code.+\\]/g, (codeDiff) => codeDiff.trimStart())\n}\n\nconst preserveSourceLineBreaks = (sourceCode: string, outputCode: string) => {\n const multilineSegments = collectMultilineSourceSegments(sourceCode)\n\n if (multilineSegments.length === 0) {\n return outputCode\n }\n\n const outputLines = outputCode.split('\\n')\n\n for (const segmentLines of multilineSegments) {\n const segmentNormalized = normalizeCodeSegment(segmentLines.join('\\n'))\n\n if (!segmentNormalized) {\n continue\n }\n\n for (let start = 0; start < outputLines.length; start += 1) {\n let replaced = false\n\n for (let size = 1; size <= segmentLines.length; size += 1) {\n if (start + size > outputLines.length) {\n break\n }\n\n const outputSegment = outputLines.slice(start, start + size)\n\n if (normalizeCodeSegment(outputSegment.join('\\n')) !== segmentNormalized) {\n continue\n }\n\n if (outputSegment.join('\\n') !== segmentLines.join('\\n')) {\n outputLines.splice(start, size, ...segmentLines)\n }\n\n start += segmentLines.length - 1\n replaced = true\n break\n }\n\n if (replaced) {\n break\n }\n }\n }\n\n return outputLines.join('\\n')\n}\n\nconst collectMultilineSourceSegments = (code: string) => {\n const lines = code.split('\\n')\n const segments: string[][] = []\n let paragraphStart = -1\n\n for (let index = 0; index <= lines.length; index += 1) {\n if (index < lines.length && lines[index]?.trim() !== '') {\n if (paragraphStart === -1) {\n paragraphStart = index\n }\n continue\n }\n\n if (paragraphStart !== -1) {\n const paragraphEnd = index - 1\n\n for (let size = paragraphEnd - paragraphStart + 1; size >= 2; size -= 1) {\n for (let start = paragraphStart; start + size - 1 <= paragraphEnd; start += 1) {\n segments.push(lines.slice(start, start + size).map(replaceFileNameSuffixes))\n }\n }\n }\n\n paragraphStart = -1\n }\n\n return segments\n}\n\nconst preserveSourceBlankLines = (sourceCode: string, outputCode: string) => {\n const blankLineAnchors = collectBlankLineAnchors(sourceCode)\n\n if (blankLineAnchors.length === 0) {\n return outputCode\n }\n\n const outputLines = outputCode.split('\\n')\n let searchFrom = 0\n\n for (const anchor of blankLineAnchors) {\n const lineIndex = outputLines.findIndex((line, index) => index >= searchFrom && normalizeCodeLine(line) === anchor)\n\n if (lineIndex <= 0) {\n continue\n }\n\n if (outputLines[lineIndex - 1]?.trim() !== '') {\n outputLines.splice(lineIndex, 0, '')\n searchFrom = lineIndex + 2\n } else {\n searchFrom = lineIndex + 1\n }\n }\n\n return outputLines.join('\\n')\n}\n\nconst collectBlankLineAnchors = (code: string) => {\n const lines = code.split('\\n')\n const anchors: string[] = []\n\n for (let index = 1; index < lines.length; index += 1) {\n if (lines[index]?.trim() !== '' || lines[index - 1]?.trim() === '') {\n continue\n }\n\n let nextLineIndex = index + 1\n\n while (nextLineIndex < lines.length && lines[nextLineIndex]?.trim() === '') {\n nextLineIndex += 1\n }\n\n const anchor = lines[nextLineIndex]\n\n if (anchor) {\n anchors.push(normalizeCodeLine(anchor))\n }\n }\n\n return anchors\n}\n\nconst normalizeCodeLine = (line: string) => {\n return stripTypeSyntax(replaceFileNameSuffixes(line)).trim().replace(/\\s+/g, ' ')\n}\n\nconst normalizeCodeSegment = (code: string) => {\n return replaceFileNameSuffixes(code).replace(/\\s+/g, '')\n}\n\nconst stripTypeSyntax = (line: string) => {\n return line\n .replace(/\\??:\\s*[A-Za-z_$][\\w$.<>, |&[\\]]*/g, '')\n .replace(/\\s+as\\s+const\\b/g, '')\n .replace(/\\s+as\\s+[A-Za-z_$][\\w$.<>, |&[\\]]*/g, '')\n}\n","import convert_ from 'npm-to-yarn'\nimport { visit } from 'unist-util-visit'\nimport { generateChoiceGroupCode } from './generateChoiceGroupCode.js'\nimport { parseMetaString } from './meta.js'\n\nconst convert: (input: string, target: 'npm' | 'pnpm' | 'bun' | 'yarn') => string = convert_\n\nconst PACKAGE_MANAGERS = ['pnpm', 'Bun', 'Yarn'] as const\n\nexport const remarkPkgManager = () => {\n return (tree: unknown) => {\n visit(tree as any, 'code', (node: any, index: number | undefined, parent: any) => {\n if (!parent || typeof index !== 'number') {\n return\n }\n\n if (!['bash', 'sh', 'shell'].includes(node.lang ?? '')) {\n return\n }\n\n if (node.value.includes('pnpm')) {\n return\n }\n\n if (!node.value.includes('npm ') && !node.value.includes('npx ')) {\n return\n }\n\n let choice: string | undefined\n if (node.meta) {\n const meta = parseMetaString(node.meta, ['choice'])\n choice = meta.props.choice\n node.meta = meta.rest\n }\n\n node.value = node.value.replaceAll('npm i ', 'npm install ')\n\n const nodes = new Map<string, any>()\n nodes.set('npm', node)\n\n for (const packageManager of PACKAGE_MANAGERS) {\n nodes.set(packageManager, {\n ...node,\n value: convert(node.value, packageManager.toLowerCase() as 'pnpm' | 'bun' | 'yarn'),\n })\n }\n\n const replacement = generateChoiceGroupCode(\n [...nodes].map(([choiceValue, childNode]) => ({\n choiceValue,\n children: [childNode],\n })),\n )\n\n replacement.data ??= {} as any\n ;(replacement.data as any).customDataChoice = choice\n ;(replacement.data as any).customDataFilter = replacement.type\n parent.children.splice(index, 1, replacement)\n })\n }\n}\n","import type { ShikiTransformer } from 'shiki'\n\nconst LINK_RE = /https:\\/\\/[^\\s]*[^.,\\s\"'`]/g\n\nexport const shikiTransformerAutoLinks = (): ShikiTransformer => {\n return {\n name: 'solid-docpress-shiki-autolinks',\n span(span) {\n if (span.children.length !== 1) {\n return\n }\n\n let child = span.children[0]\n if (child.type !== 'text') {\n return\n }\n\n const matches = Array.from(child.value.matchAll(LINK_RE)).filter(([href]) => !href.includes('${'))\n if (matches.length === 0) {\n return\n }\n\n const links = matches\n .map((match) => ({ href: match[0], index: match.index ?? 0 }))\n .sort((left, right) => right.index - left.index)\n\n const nextChildren: typeof span.children = []\n\n for (const { href, index } of links) {\n const endIndex = index + href.length\n const trailingText = child.value.slice(endIndex)\n\n if (trailingText) {\n nextChildren.unshift({ type: 'text', value: trailingText })\n }\n\n nextChildren.unshift({\n type: 'element',\n tagName: 'a',\n properties: { href },\n children: [{ type: 'text', value: href }],\n })\n\n child = {\n type: 'text',\n value: child.value.slice(0, index),\n }\n }\n\n if (child.value) {\n nextChildren.unshift(child)\n }\n\n span.children = nextChildren\n },\n }\n}\n"],"mappings":"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","names":["visit","visit","visit","visit","visit","visit"]}