@lonik/prestige 0.11.1 → 0.11.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.
package/dist/ui.js CHANGED
@@ -277,7 +277,7 @@ function Header({ customHeaderTitle, algolia, github }) {
277
277
  children: /* @__PURE__ */ jsxs("div", {
278
278
  className: "container mx-auto flex items-center justify-between",
279
279
  children: [/* @__PURE__ */ jsxs("div", {
280
- className: "flex gap-4 items-baseline",
280
+ className: "flex gap-4 items-center",
281
281
  children: [/* @__PURE__ */ jsx(Link, {
282
282
  activeProps: { className: "border-default-800 text-default-800 font-medium" },
283
283
  className: "text-sm rounded hover:bg-default-100 text-default-500",
@@ -464,7 +464,6 @@ function ContentNavigation({ isNext, navigation }) {
464
464
  });
465
465
  }
466
466
  function ContentNavigations({ prev, next }) {
467
- if (!prev && !next) return null;
468
467
  return /* @__PURE__ */ jsxs("div", {
469
468
  className: "flex gap-6",
470
469
  children: [/* @__PURE__ */ jsxs("div", {
@@ -677,22 +676,22 @@ function PrestigeNotFound() {
677
676
 
678
677
  //#endregion
679
678
  //#region src/ui/core/footer/footer.tsx
680
- function License() {
681
- if (!config.license) return null;
679
+ function License({ license }) {
680
+ if (!license) return null;
682
681
  return /* @__PURE__ */ jsxs("a", {
683
682
  target: "_blank",
684
- href: config.license.url,
685
- children: ["Released under: ", config.license.label]
683
+ href: license.url,
684
+ children: ["Released under: ", license.label]
686
685
  });
687
686
  }
688
687
  function Copyright({ copyright }) {
689
688
  if (!copyright) return null;
690
689
  return copyright();
691
690
  }
692
- function Footer({ copyright }) {
691
+ function Footer({ copyright, license }) {
693
692
  return /* @__PURE__ */ jsxs("footer", {
694
- className: "mt-10 flex items-center justify-center flex-col gap-2 px-4 border-t border-t-default-100 pt-10 bg-default-50 text-sm py-10 text-default-700",
695
- children: [/* @__PURE__ */ jsx(License, {}), /* @__PURE__ */ jsx(Copyright, { copyright })]
693
+ className: "flex items-center justify-center flex-col gap-2 px-4 border-t border-t-default-100 pt-10 bg-default-50 text-sm py-10 text-default-700",
694
+ children: [/* @__PURE__ */ jsx(License, { license }), /* @__PURE__ */ jsx(Copyright, { copyright })]
696
695
  });
697
696
  }
698
697
 
package/dist/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","names":["typeMap: Record<AsideType, string>","defaultTitles: Record<AsideType, string>","TabsPrimitive","MANAGERS: PackageManager[]","parts: string[]","currentTheme: ThemeValue","metas: Array<\n | { name?: string; content?: string; title?: string }\n | Record<string, any>\n >"],"sources":["../src/ui/components/aside/aside.tsx","../src/ui/components/code/code.tsx","../src/ui/components/tabs/tabs.tsx","../src/ui/components/package-managers/package-managers.tsx","../src/ui/core/github/github.tsx","../src/ui/core/search/search.tsx","../src/ui/core/theme/theme.tsx","../src/ui/core/header/header.tsx","../src/ui/routes/content/table-of-contents/use-table-of-contents.ts","../src/ui/routes/content/table-of-contents/mobile-table-of-contents.tsx","../src/ui/routes/content/table-of-contents/web-table-of-contents.tsx","../src/ui/core/prestige-page.tsx","../src/ui/routes/content/content-navigations.tsx","../src/ui/utils.ts","../src/ui/routes/collection/sidebar.tsx","../src/ui/routes/collection/mobile-sidebar.tsx","../src/ui/routes/collection/collection.route.tsx","../src/ui/routes/content/content.route.tsx","../src/ui/routes/not-found.tsx","../src/ui/core/footer/footer.tsx","../src/ui/routes/prestige-shell.tsx","../src/ui/components/steps/step-item.tsx","../src/ui/components/steps/steps.tsx"],"sourcesContent":["import React from \"react\";\n\nexport type AsideType = \"note\" | \"tip\" | \"caution\" | \"danger\";\n\nexport interface AsideProps extends Omit<React.HTMLAttributes<HTMLElement>, \"title\"> {\n type?: AsideType;\n title?: React.ReactNode;\n children: React.ReactNode;\n}\n\nconst typeMap: Record<AsideType, string> = {\n note: \"bg-blue-50/50 dark:bg-blue-900/20 border-blue-500 text-blue-900 dark:text-blue-200\",\n tip: \"bg-purple-50/50 dark:bg-purple-900/20 border-purple-500 text-purple-900 dark:text-purple-200\",\n caution:\n \"bg-yellow-50/50 dark:bg-yellow-900/20 border-yellow-500 text-yellow-900 dark:text-yellow-200\",\n danger:\n \"bg-red-50/50 dark:bg-red-900/20 border-red-500 text-red-900 dark:text-red-200\",\n};\n\nconst defaultTitles: Record<AsideType, string> = {\n note: \"Note\",\n tip: \"Tip\",\n caution: \"Caution\",\n danger: \"Danger\",\n};\n\nexport function Aside({\n type = \"note\",\n title,\n children,\n className,\n ...props\n}: AsideProps) {\n const iconProps = {\n className: \"w-5 h-5 flex-shrink-0\",\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: \"2\",\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n };\n\n const Icon = () => {\n switch (type) {\n case \"note\":\n return (\n <svg {...iconProps}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n );\n case \"tip\":\n return (\n <svg {...iconProps}>\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\" />\n <path d=\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\" />\n <path d=\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </svg>\n );\n case \"caution\":\n return (\n <svg {...iconProps}>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n case \"danger\":\n return (\n <svg {...iconProps}>\n <polygon points=\"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\" />\n <path d=\"M12 8v4\" />\n <path d=\"M12 16h.01\" />\n </svg>\n );\n default:\n return null;\n }\n };\n\n return (\n <aside\n aria-label={defaultTitles[type]}\n className={`relative my-6 px-4 py-3 border-l-4 rounded-lg ${typeMap[type]} ${className || \"\"}`}\n {...props}\n >\n <p className=\"flex items-center gap-2 mb-2 mt-0 font-bold text-lg\">\n <span>\n <Icon />\n </span>\n {title || defaultTitles[type]}\n </p>\n <section className=\"[&>p]:mt-0 [&>p]:mb-2 [&>p:last-child]:mb-0\">\n {children}\n </section>\n </aside>\n );\n}\n","import clsx from \"clsx\";\nimport { Highlight } from \"prism-react-renderer\";\n\nexport interface CodeProps {\n code: string;\n language?: string;\n}\n\nexport function Code({ code, language = \"tsx\" }: CodeProps) {\n // Use a fragment or div, but ensure `render` actually exists before injecting\n return (\n <Highlight code={code} language={language}>\n {({ className, tokens, getLineProps, getTokenProps }) => (\n <pre className={clsx(\"not-prose\", className)}>\n <code className={clsx(\"code-highlight\", className)}>\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })} style={undefined}>\n {line.map((token, key) => (\n <span\n key={key}\n {...getTokenProps({ token })}\n style={undefined}\n />\n ))}\n </div>\n ))}\n </code>\n </pre>\n )}\n </Highlight>\n );\n}\n","import { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\";\n\nfunction Tabs({\n orientation = \"horizontal\",\n className,\n ...props\n}: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={`w-full ${className || \"\"}`}\n {...props}\n />\n );\n}\n\nfunction TabsList({ className, ...props }: TabsPrimitive.List.Props) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n className={`flex w-full overflow-x-auto border-b border-default-200 no-scrollbar ${\n className || \"\"\n }`}\n {...props}\n />\n );\n}\n\nfunction TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n data-slot=\"tabs-trigger\"\n className={`\n -mb-px flex items-center justify-center whitespace-nowrap border-b-2 border-transparent \n px-4 py-2.5 text-sm font-medium transition-colors cursor-pointer\n text-default-600 hover:text-default-900 hover:border-default-300\n aria-selected:border-primary-500 aria-selected:text-primary-500 \n focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\n disabled:pointer-events-none disabled:opacity-50\n ${className || \"\"}\n `}\n {...props}\n />\n );\n}\n\nfunction TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n data-slot=\"tabs-content\"\n className={`mt-4 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 ${\n className || \"\"\n }`}\n {...props}\n />\n );\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n","import { Code } from \"../code/code\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../tabs/tabs\"; // Adjust import path\n\ntype PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\ntype CommandType = \"add\" | \"create\" | \"exec\" | \"run\";\n\nexport interface PackageManagersProps {\n /** The name of the package (e.g., \"@lonik/themer\") */\n pkg?: string;\n /** The type of command to generate. Defaults to \"add\" */\n type?: CommandType;\n /** Whether this is a development dependency (-D) */\n dev?: boolean;\n /** Additional arguments to append to the command */\n args?: string;\n className?: string;\n}\n\nconst MANAGERS: PackageManager[] = [\"npm\", \"pnpm\", \"yarn\", \"bun\"];\n\nfunction generateCommand(\n pm: PackageManager,\n type: CommandType,\n pkg?: string,\n dev?: boolean,\n args?: string,\n) {\n const parts: string[] = [];\n\n switch (type) {\n case \"add\":\n parts.push(pm === \"npm\" ? \"npm install\" : `${pm} add`);\n if (dev) parts.push(\"-D\");\n if (pkg) parts.push(pkg);\n break;\n case \"create\":\n parts.push(`${pm} create`);\n if (pkg) parts.push(pkg);\n break;\n case \"exec\":\n if (pm === \"npm\") parts.push(\"npx\");\n else if (pm === \"bun\") parts.push(\"bun x\");\n else parts.push(`${pm} dlx`);\n if (pkg) parts.push(pkg);\n break;\n case \"run\":\n parts.push(pm === \"yarn\" ? \"yarn\" : `${pm} run`);\n if (pkg) parts.push(pkg);\n break;\n }\n\n if (args) {\n // If it's npm and we are passing args to an exec/run script, we often need '--'\n if (pm === \"npm\" && (type === \"exec\" || type === \"run\")) {\n parts.push(\"--\");\n }\n parts.push(args);\n }\n\n return parts.join(\" \");\n}\n\nexport function PackageManagers({\n pkg,\n type = \"add\",\n dev = false,\n args,\n className,\n}: PackageManagersProps) {\n return (\n <Tabs defaultValue=\"npm\" className={`my-6 ${className || \"\"}`}>\n <TabsList>\n {MANAGERS.map((pm) => (\n <TabsTrigger key={pm} value={pm}>\n {pm.toLowerCase()}\n </TabsTrigger>\n ))}\n </TabsList>\n\n {MANAGERS.map((pm) => {\n const command = generateCommand(pm, type, pkg, dev, args);\n\n return (\n <TabsContent keepMounted={true} key={pm} value={pm}>\n <Code code={command} language=\"bash\"></Code>\n </TabsContent>\n );\n })}\n </Tabs>\n );\n}\n","import { Github } from \"lucide-react\";\n\nexport function GitHub({ github }: { github: string | undefined }) {\n if (!github) {\n return null;\n }\n\n return (\n <a\n href={github}\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label=\"GitHub repository\"\n title=\"GitHub repository\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded border border-default-200 bg-default-50 text-default-500 hover:bg-default-100\"\n >\n <Github size={16} />\n </a>\n );\n}\n","import \"@docsearch/css\";\nimport { DocSearch } from \"@docsearch/react\";\nimport { AlgoliaOptions } from \"../../routes/prestige-shell\";\n\nexport function Search({\n algolia,\n}: {\n // 2. Add 'typeof' to extract the type from the value\n algolia: AlgoliaOptions | undefined;\n}) {\n if (!algolia) {\n return null;\n }\n\n return (\n <div className=\"prestige-search\">\n <DocSearch\n appId={algolia.appId}\n apiKey={algolia.apiKey}\n indices={algolia.indices}\n />\n </div>\n );\n}\n","import { useTheme } from \"@lonik/themer\";\nimport { useHydrated } from \"@tanstack/react-router\";\nimport { Moon, Sun, SunMoon } from \"lucide-react\";\n\nconst themeOrder = [\"system\", \"light\", \"dark\"] as const;\ntype ThemeValue = (typeof themeOrder)[number];\n\nexport function Theme() {\n const { theme, setTheme } = useTheme();\n const currentTheme: ThemeValue = (theme as ThemeValue) ?? \"system\";\n const hydrated = useHydrated();\n\n const nextTheme = (value: ThemeValue): ThemeValue => {\n const index = themeOrder.indexOf(value);\n return themeOrder[(index + 1) % themeOrder.length]!;\n };\n\n const icon =\n currentTheme === \"light\" ? (\n <Sun size={16} />\n ) : currentTheme === \"dark\" ? (\n <Moon size={16} />\n ) : (\n <SunMoon size={16} />\n );\n\n return (\n <button\n suppressHydrationWarning\n type=\"button\"\n aria-label={`Theme: ${currentTheme}. Click to switch theme`}\n title={`Theme: ${currentTheme}`}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md border border-default-200 bg-default-50 text-default-500 hover:bg-default-100 cursor-pointer\"\n onClick={() => setTheme(nextTheme(currentTheme))}\n >\n {hydrated && icon}\n </button>\n );\n}\n","import { Link, useLocation } from \"@tanstack/react-router\";\nimport collections from \"virtual:prestige/collection-all\";\nimport config from \"virtual:prestige/config\";\nimport { PrestigeShellProps } from \"../../routes/prestige-shell\";\nimport { GitHub } from \"../github/github\";\nimport { Search } from \"../search/search\";\nimport { Theme } from \"../theme/theme\";\n\nexport type HeaderProps = Pick<\n PrestigeShellProps,\n \"customHeaderTitle\" | \"algolia\" | \"github\"\n>;\n\nexport default function Header({\n customHeaderTitle,\n algolia,\n github,\n}: HeaderProps) {\n const location = useLocation();\n\n return (\n <header className=\"sticky top-0 z-40 flex h-header border-b border-default-200 bg-default-50/80 px-4 backdrop-blur-md\">\n <div className=\"container mx-auto flex items-center justify-between\">\n <div className=\"flex gap-4 items-baseline\">\n <Link\n activeProps={{\n className: \"border-default-800 text-default-800 font-medium\",\n }}\n className=\"text-sm rounded hover:bg-default-100 text-default-500\"\n to={\"/\"}\n >\n {customHeaderTitle ? (\n customHeaderTitle()\n ) : (\n <span>{config.title}</span>\n )}\n </Link>\n {collections.map((collection) => {\n const isActive =\n location.pathname === `/${collection.id}` ||\n location.pathname.startsWith(`/${collection.id}/`);\n\n return (\n <Link\n key={collection.id}\n to={`/${collection.defaultLink}` as any}\n className={`border-b-2 text-sm rounded hover:bg-default-100 active:bg-default-200 capitalize ${\n isActive\n ? \"border-default-800 text-default-800 font-medium\"\n : \"border-b-transparent text-default-500\"\n }`}\n >\n {collection.label}\n </Link>\n );\n })}\n </div>\n <div className=\"flex items-center gap-2\">\n <Search algolia={algolia} />\n <GitHub github={github} />\n <Theme />\n </div>\n </div>\n </header>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\n\nexport function useTableOfContents(toc: TocItem[]) {\n const [activeId, setActiveId] = useState<string>(\"\");\n\n useEffect(() => {\n if (toc.length === 0) return;\n\n const handleScroll = () => {\n const headingElements = toc\n .map((item) => {\n const id = item.href.startsWith(\"#\") ? item.href.slice(1) : item.href;\n return document.getElementById(id);\n })\n .filter((el): el is HTMLElement => el !== null);\n\n // Add a slight offset to account for sticky headers or top padding\n const scrollPosition = window.scrollY + 100;\n\n let currentActiveId = \"\";\n for (let i = headingElements.length - 1; i >= 0; i--) {\n const element = headingElements[i];\n if (element && element.offsetTop <= scrollPosition) {\n currentActiveId = element.id;\n break;\n }\n }\n\n // If we haven't scrolled past the first heading, highlight the first one\n if (!currentActiveId && headingElements.length > 0 && headingElements[0]) {\n currentActiveId = headingElements[0].id;\n }\n\n setActiveId(currentActiveId ? `#${currentActiveId}` : \"\");\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n // setTimeout to ensure DOM is fully rendered when checking initial offsets\n setTimeout(handleScroll, 100);\n\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [toc]);\n\n const handleLinkClick = (e: React.MouseEvent<HTMLAnchorElement>, href: string) => {\n e.preventDefault();\n const id = href.startsWith(\"#\") ? href.slice(1) : href;\n const element = document.getElementById(id);\n if (element) {\n element.scrollIntoView({ behavior: \"smooth\" });\n // Update URL hash without jumping\n window.history.pushState(null, \"\", href.startsWith(\"#\") ? href : `#${href}`);\n }\n };\n\n return { activeId, handleLinkClick };\n}\n","import clsx from \"clsx\";\nimport { ChevronRight } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport { useTableOfContents } from \"./use-table-of-contents\";\n\nexport function MobileTableOfContent({ toc }: { toc: TocItem[] }) {\n const [isOpen, setIsOpen] = useState(false);\n const { activeId, handleLinkClick } = useTableOfContents(toc);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n const activeItem = toc.find((item) => {\n const itemHref = item.href.startsWith(\"#\") ? item.href : `#${item.href}`;\n return itemHref === activeId;\n });\n\n /* pl-12 is needed for mobile sidebar, because sidebar button is fixed position */\n return (\n <div\n ref={containerRef}\n className=\"sticky top-header z-30 bg-default-50/95 backdrop-blur border-b border-default-200 dark:border-default-800 lg:hidden px-6 pl-12\"\n >\n <div className=\"relative\">\n <button\n onClick={() => setIsOpen((prev) => !prev)}\n className=\"flex w-full items-center justify-between gap-4 px-6 py-3 text-sm text-default-500 font-medium cursor-pointer\"\n >\n <div className=\"flex items-center gap-2\">\n <span>On this page</span>\n <ChevronRight\n className={clsx(\n \"w-4 h-4 transition-transform duration-200\",\n isOpen && \"rotate-90\",\n )}\n />\n </div>\n {activeItem && (\n <span className=\"truncate font-normal max-w-[50%] text-right\">\n {activeItem.value}\n </span>\n )}\n </button>\n\n {isOpen && (\n <div className=\"absolute left-6 right-6 top-full mt-2 max-h-[60vh] overflow-y-auto rounded-lg border border-default-200 bg-default-50 shadow-xl\">\n <ul className=\"p-4 space-y-2.5 text-sm\">\n {toc.map((item) => {\n const itemHref = item.href.startsWith(\"#\")\n ? item.href\n : `#${item.href}`;\n const isActive = activeId === itemHref;\n return (\n <li\n key={itemHref}\n style={{ paddingLeft: `${(item.depth - 1) * 0.75}rem` }}\n >\n <a\n href={itemHref}\n className={clsx(\n \"block transition-colors duration-200 line-clamp-2\",\n isActive\n ? \"text-primary-600 font-medium\"\n : \"text-default-600\",\n )}\n onClick={(e) => {\n handleLinkClick(e, item.href);\n setIsOpen(false);\n }}\n >\n {item.value}\n </a>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport { useTableOfContents } from \"./use-table-of-contents\";\n\nexport function WebTableOfContent({ toc }: { toc: TocItem[] }) {\n const { activeId, handleLinkClick } = useTableOfContents(toc);\n\n return (\n <nav className=\"sticky top-header pt-4 overflow-y-auto w-web-table-of-content hidden lg:block\">\n <span className=\"text-xs font-mono tracking-widest\">ON THIS PAGE</span>\n <ul className=\"text-sm my-4\">\n {toc.map((item) => (\n <li key={item.href}>\n <a\n style={{ paddingLeft: `${(item.depth - 1) * 0.75}rem` }}\n href={`${item.href}`}\n className={clsx(\n \"border-l py-1 px-4 block hover:text-default-700 dark:hover:text-slate-100 transition-colors duration-200 line-clamp-2\",\n activeId === item.href\n ? \"text-default-700 border-default-600 font-medium\"\n : \"text-default-500 border-default-200 \",\n )}\n onClick={(e) => handleLinkClick(e, item.href)}\n >\n {item.value}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n","import React from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport { MobileTableOfContent } from \"../routes/content/table-of-contents/mobile-table-of-contents\";\nimport { WebTableOfContent } from \"../routes/content/table-of-contents/web-table-of-contents\";\n\nexport interface PrestigePageProps {\n children: React.ReactNode;\n toc?: TocItem[];\n}\n\nexport function PrestigePage({ children, toc = [] }: PrestigePageProps) {\n return (\n <div className=\"flex lg:gap-6 items-start max-w-[100vw]\">\n <div className=\"flex-1 min-w-0\">\n <MobileTableOfContent toc={toc} />\n <article className=\"prose wrap-break-word py-15 px-6 max-w-none lg:w-web-content\">\n {children}\n </article>\n </div>\n <WebTableOfContent toc={toc} />\n </div>\n );\n}\n","import { Link } from \"@tanstack/react-router\";\nimport clsx from \"clsx\";\nimport { ArrowLeft, ArrowRight } from \"lucide-react\";\nimport { SiblingNavigationType } from \"../../../vite/core/content/content.types\";\n\nfunction ContentNavigation({\n isNext,\n navigation,\n}: {\n isNext?: boolean;\n navigation: SiblingNavigationType;\n}) {\n const label = isNext ? \"Next\" : \"Previous\";\n return (\n <Link\n to={navigation.link}\n className={clsx(\n \" flex-1 h-20 mb-4 border border-default-200 hover:bg-default-50 rounded-md cursor-pointer flex items-center px-4\",\n isNext ? \"justify-end\" : \"justify-start\",\n )}\n >\n <div\n className={clsx(\n \"flex items-center gap-4\",\n isNext && \"flex-row-reverse\",\n )}\n >\n {isNext ? (\n <ArrowRight className=\"text-default-400\" />\n ) : (\n <ArrowLeft className=\"text-default-400\" />\n )}\n <div className={clsx(\"flex flex-col\", isNext && \"items-end\")}>\n <span className=\"text-xs tracking-widest font-mono\">\n {label.toLocaleUpperCase()}\n </span>\n <span className=\"text-2xl font-li text-default-700\">\n {navigation.label}\n </span>\n </div>\n </div>\n </Link>\n );\n}\n\nexport default function ContentNavigations({\n prev,\n next,\n}: {\n prev: SiblingNavigationType | null | undefined;\n next: SiblingNavigationType | null | undefined;\n}) {\n if (!prev && !next) return null;\n // width of content navigation must match with content route content width, so we manually\n // add empty div with table-of-content width and add proper gap to match the size\n return (\n <div className=\"flex gap-6\">\n <div className=\"lg:flex flex-row items-center gap-2 mt-2 lg:mt-8 lg:w-web-content w-full\">\n {prev ? (\n <ContentNavigation navigation={prev} />\n ) : (\n <div className=\"flex-1 hidden lg:block \"></div>\n )}\n {next ? (\n <ContentNavigation navigation={next} isNext />\n ) : (\n <div className=\"flex-1 hidden lg:block\"></div>\n )}\n </div>\n <div className=\"lg:w-web-table-of-content h-1\"></div>\n </div>\n );\n}\n","export function isExternalURL(str: string) {\n try {\n const url = new URL(str);\n // This ensures it starts with http or https, filtering out\n // things like 'javascript:alert(1)' or 'mailto:test@test.com'\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n","import { Link } from \"@tanstack/react-router\";\nimport clsx from \"clsx\";\nimport { BookOpen, ChevronRight, ExternalLink } from \"lucide-react\";\nimport { useState } from \"react\";\nimport {\n ExternalSidebarLinkType,\n InternalSidebarLinkType,\n SidebarGroupType,\n SidebarType,\n} from \"../../../vite/core/content/content.types\";\nimport { isExternalURL } from \"../../utils\";\n\nexport interface SidebarProps {\n sidebar: SidebarType;\n onLinkClick?: (() => void) | undefined;\n}\n\nfunction SidebarGroup({\n group,\n onLinkClick,\n}: {\n group: SidebarGroupType;\n onLinkClick?: (() => void) | undefined;\n}) {\n const [open, setIsOpen] = useState(!group.collapsed);\n return (\n <div className=\"mt-4 flex flex-col gap-1\">\n <button\n className=\"flex items-center w-full gap-2\"\n onClick={() => setIsOpen((prev) => !prev)}\n >\n <ChevronRight\n size={18}\n className={clsx(\n \"transform transition cursor-pointer ml-1\",\n open && \"rotate-90\",\n )}\n />\n <span className=\"font-mono text-xs tracking-widest\">\n {group.label.toUpperCase()}\n </span>\n </button>\n {open && (\n <div className=\"mb-2 pl-5\">\n {group.items.map((item) => {\n if (\"slug\" in item || \"link\" in item) {\n const key = \"slug\" in item ? item.slug : item.link;\n return (\n <SidebarLink\n showIcon={false}\n key={key}\n link={item}\n onLinkClick={onLinkClick}\n />\n );\n }\n return <SidebarGroup key={item.label} group={item} onLinkClick={onLinkClick} />;\n })}\n </div>\n )}\n </div>\n );\n}\n\nfunction SidebarLink({\n link,\n onLinkClick,\n showIcon,\n}: {\n link: InternalSidebarLinkType | ExternalSidebarLinkType;\n onLinkClick?: (() => void) | undefined;\n showIcon: boolean;\n}) {\n if (\"slug\" in link || !isExternalURL(link.link)) {\n const slug = \"slug\" in link ? `/${link.slug}` : link.link;\n return (\n <div className=\"flex items-center \">\n <Link\n onClick={onLinkClick}\n activeProps={{ className: \"text-default-700 font-medium\" }}\n className=\"w-full inline-flex gap-2 py-1 px-2 rounded hover:bg-default-100 text-sm mr-2 items-center text-default-500\"\n to={slug}\n >\n {showIcon && <BookOpen className=\"w-4\" />}\n {link.label}\n </Link>\n </div>\n );\n } else {\n return (\n <div className=\"flex items-center \">\n <a\n className=\"w-full inline-flex gap-2 py-1 px-2 rounded hover:bg-default-100 text-sm mr-2 items-center text-default-500\"\n href={link.link}\n target=\"_blank\"\n onClick={onLinkClick}\n rel=\"noreferrer\"\n >\n {showIcon && <ExternalLink className=\"w-4\" />}\n {link.label}\n </a>\n </div>\n );\n }\n}\n\nexport default function Sidebar({ sidebar, onLinkClick }: SidebarProps) {\n return (\n <div className=\"w-full lg:w-sidebar border-r border-default-200 h-full overflow-auto lg:h-main lg:sticky top-header pt-4 pb-10\">\n {sidebar.items.map((item) => {\n if (\"slug\" in item || \"link\" in item) {\n const key = \"slug\" in item ? item.slug : item.link;\n return (\n <SidebarLink\n showIcon={true}\n onLinkClick={onLinkClick}\n key={key}\n link={item}\n />\n );\n }\n return <SidebarGroup key={item.label} group={item} onLinkClick={onLinkClick} />;\n })}\n </div>\n );\n}\n","import { Menu, X } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { SidebarType } from \"../../../vite/core/content/content.types\";\nimport Sidebar from \"./sidebar\";\n\nfunction SidebarOverlay({ sidebar }: { sidebar: SidebarType }) {\n const [isOpen, setIsOpen] = useState(false);\n return (\n <div className=\"lg:hidden\">\n {/* Mobile sidebar button is placed on the start of mobile of content tab, we have to position is via fixed because table of content lives inside content.route */}\n <button\n className=\"bg-transparent p-3 -mt-[2px] text-default-700 top-header left-0 fixed z-50\"\n onClick={() => setIsOpen((prev) => !prev)}\n >\n {isOpen ? <X /> : <Menu />}\n </button>\n {isOpen && (\n <div className=\"fixed top-[calc(var(--spacing-header)+44 )] shadow-xl left-0 overflow-auto z-10 bg-default-50 w-full h-screen\">\n <Sidebar onLinkClick={() => setIsOpen(false)} sidebar={sidebar} />\n </div>\n )}\n </div>\n );\n}\n\nexport default function MobileSidebar({ sidebar }: { sidebar: SidebarType }) {\n return <SidebarOverlay sidebar={sidebar} />;\n}\n","import { Outlet, useLocation } from \"@tanstack/react-router\";\nimport { SidebarType } from \"../../../vite/core/content/content.types\";\nimport ContentNavigations from \"../content/content-navigations\";\nimport MobileSidebar from \"./mobile-sidebar\";\nimport Sidebar from \"./sidebar\";\n\nexport function CollectionRoute(sidebar: SidebarType, id: string) {\n return {\n component: () => {\n const location = useLocation();\n const navigation = sidebar?.navigation?.[location.pathname] || {\n prev: null,\n next: null,\n };\n const { prev, next } = navigation;\n\n return (\n <div className=\"mx-auto flex container lg:gap-6\">\n <MobileSidebar sidebar={sidebar} />\n <div className=\"hidden lg:block\">\n {sidebar && <Sidebar sidebar={sidebar} />}\n </div>\n <div className=\"flex-1 pb-20\">\n <Outlet />\n <div className=\"mt-8 px-6 lg:px-0\">\n <ContentNavigations prev={prev} next={next} />\n </div>\n </div>\n </div>\n );\n },\n };\n}\n","import { FunctionComponent } from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport config from \"virtual:prestige/config\";\nimport { ContentFrontmatterType } from \"../../../vite/core/content/content.types\";\nimport { PrestigePage } from \"../../core/prestige-page\";\nimport { type AnyRouteMatch } from \"@tanstack/react-router\";\nfunction resolveContentData(inlineData: any) {\n return inlineData as {\n toc: TocItem[];\n default: FunctionComponent;\n frontmatter: ContentFrontmatterType;\n };\n}\n\nexport function ContentRoute(inlineData: any): any {\n const { frontmatter } = resolveContentData(inlineData);\n\n return {\n head: () => {\n const metas: Array<\n | { name?: string; content?: string; title?: string }\n | Record<string, any>\n > = [];\n const description = frontmatter.description;\n const title = frontmatter.title;\n const head = frontmatter.head;\n\n if (title) {\n metas.push({\n title: title + \" | \" + config.title,\n });\n }\n\n if (description) {\n metas.push({\n name: \"description\",\n content: description,\n });\n }\n\n const mergedMeta = head?.meta ? [...metas, ...head.meta] : metas;\n return {\n meta: mergedMeta.length > 0 ? mergedMeta : undefined,\n links: head?.links,\n styles: head?.styles,\n scripts: head?.scripts,\n } as { scripts: AnyRouteMatch[\"scripts\"] };\n },\n };\n}\n\nexport function LazyContentRoute(inlineData: any): any {\n const { toc, default: Component } = resolveContentData(inlineData);\n\n return {\n component: () => {\n return (\n <PrestigePage toc={toc}>\n <Component />\n </PrestigePage>\n );\n },\n };\n}\n","export function PrestigeNotFound() {\n return (\n <div className=\"w-full h-full flex justify-center pt-15 lg:pt-30 \">\n <div className=\"flex flex-col gap-3 items-center\">\n <h1 className=\"text-3xl lg:text-7xl\">404</h1>\n <h2 className=\"text-3xl lg:text-5xl\">Page Not Found</h2>\n </div>\n </div>\n );\n}\n","import config from \"virtual:prestige/config\";\nimport { PrestigeShellProps } from \"../../routes/prestige-shell\";\n\nfunction License() {\n if (!config.license) {\n return null;\n }\n return (\n <a target=\"_blank\" href={config.license.url}>\n Released under: {config.license.label}\n </a>\n );\n}\n\nfunction Copyright({ copyright }: Pick<PrestigeShellProps, \"copyright\">) {\n if (!copyright) {\n return null;\n }\n return copyright();\n}\n\nexport default function Footer({\n copyright,\n}: Pick<PrestigeShellProps, \"copyright\">) {\n return (\n <footer className=\"mt-10 flex items-center justify-center flex-col gap-2 px-4 border-t border-t-default-100 pt-10 bg-default-50 text-sm py-10 text-default-700\">\n <License />\n <Copyright copyright={copyright} />\n </footer>\n );\n}\n","import { ThemeProvider } from \"@lonik/themer\";\nimport { ReactNode } from \"react\";\nimport Footer from \"../core/footer/footer\";\nimport Header from \"../core/header/header\";\n\ntype RenderNode = () => ReactNode;\n\nexport interface AlgoliaOptions {\n appId: string;\n apiKey: string;\n indices: string[];\n}\nexport interface LicenseOptions {\n label: string;\n url: string;\n}\nexport interface PrestigeShellProps {\n customHeaderTitle?: RenderNode | undefined;\n copyright?: RenderNode | undefined;\n github?: string | undefined;\n algolia?: AlgoliaOptions | undefined;\n license?: LicenseOptions | undefined;\n}\nexport function PrestigeShell({\n children,\n options,\n}: {\n children: ReactNode;\n options?: PrestigeShellProps;\n}) {\n return (\n <ThemeProvider attribute=\"data-theme\" defaultTheme=\"system\">\n <Header\n algolia={options?.algolia}\n customHeaderTitle={options?.customHeaderTitle}\n {...options}\n />\n <main className=\"min-h-[calc(100vh-var(--spacing-header))]\">\n {children}\n </main>\n <Footer copyright={options?.copyright} />\n </ThemeProvider>\n );\n}\n","import { PropsWithChildren } from \"react\";\n\nexport type StepItemProps = PropsWithChildren<{\n index: number | string;\n label: string;\n}>;\n\nexport function StepItem({ children, label, index }: StepItemProps) {\n return (\n <li className=\"group list-none\">\n <div className=\"flex items-start gap-2\">\n <div className=\"rounded-full flex justify-center items-center text-base font-medium w-8 h-8 bg-primary-50 text-primary-400 border-2 border-primary-400\">\n {index}\n </div>\n <h3 className=\"text-default-600 mt-1\">{label}</h3>\n </div>\n <div className=\"pb-6 group-last:pb-0 border-l-2 border-l-default-200 pl-6 ml-4 mt-1 mb-4 text-default-600\">\n {children}\n </div>\n </li>\n );\n}\n","import { PropsWithChildren } from \"react\";\n\nexport type StepsProps = PropsWithChildren;\n\nexport function Steps({ children }: StepsProps) {\n return <ul>{children}</ul>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ui.js","names":["typeMap: Record<AsideType, string>","defaultTitles: Record<AsideType, string>","TabsPrimitive","MANAGERS: PackageManager[]","parts: string[]","currentTheme: ThemeValue","metas: Array<\n | { name?: string; content?: string; title?: string }\n | Record<string, any>\n >"],"sources":["../src/ui/components/aside/aside.tsx","../src/ui/components/code/code.tsx","../src/ui/components/tabs/tabs.tsx","../src/ui/components/package-managers/package-managers.tsx","../src/ui/core/github/github.tsx","../src/ui/core/search/search.tsx","../src/ui/core/theme/theme.tsx","../src/ui/core/header/header.tsx","../src/ui/routes/content/table-of-contents/use-table-of-contents.ts","../src/ui/routes/content/table-of-contents/mobile-table-of-contents.tsx","../src/ui/routes/content/table-of-contents/web-table-of-contents.tsx","../src/ui/core/prestige-page.tsx","../src/ui/routes/content/content-navigations.tsx","../src/ui/utils.ts","../src/ui/routes/collection/sidebar.tsx","../src/ui/routes/collection/mobile-sidebar.tsx","../src/ui/routes/collection/collection.route.tsx","../src/ui/routes/content/content.route.tsx","../src/ui/routes/not-found.tsx","../src/ui/core/footer/footer.tsx","../src/ui/routes/prestige-shell.tsx","../src/ui/components/steps/step-item.tsx","../src/ui/components/steps/steps.tsx"],"sourcesContent":["import React from \"react\";\n\nexport type AsideType = \"note\" | \"tip\" | \"caution\" | \"danger\";\n\nexport interface AsideProps extends Omit<React.HTMLAttributes<HTMLElement>, \"title\"> {\n type?: AsideType;\n title?: React.ReactNode;\n children: React.ReactNode;\n}\n\nconst typeMap: Record<AsideType, string> = {\n note: \"bg-blue-50/50 dark:bg-blue-900/20 border-blue-500 text-blue-900 dark:text-blue-200\",\n tip: \"bg-purple-50/50 dark:bg-purple-900/20 border-purple-500 text-purple-900 dark:text-purple-200\",\n caution:\n \"bg-yellow-50/50 dark:bg-yellow-900/20 border-yellow-500 text-yellow-900 dark:text-yellow-200\",\n danger:\n \"bg-red-50/50 dark:bg-red-900/20 border-red-500 text-red-900 dark:text-red-200\",\n};\n\nconst defaultTitles: Record<AsideType, string> = {\n note: \"Note\",\n tip: \"Tip\",\n caution: \"Caution\",\n danger: \"Danger\",\n};\n\nexport function Aside({\n type = \"note\",\n title,\n children,\n className,\n ...props\n}: AsideProps) {\n const iconProps = {\n className: \"w-5 h-5 flex-shrink-0\",\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: \"2\",\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n };\n\n const Icon = () => {\n switch (type) {\n case \"note\":\n return (\n <svg {...iconProps}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n );\n case \"tip\":\n return (\n <svg {...iconProps}>\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\" />\n <path d=\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\" />\n <path d=\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </svg>\n );\n case \"caution\":\n return (\n <svg {...iconProps}>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n case \"danger\":\n return (\n <svg {...iconProps}>\n <polygon points=\"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\" />\n <path d=\"M12 8v4\" />\n <path d=\"M12 16h.01\" />\n </svg>\n );\n default:\n return null;\n }\n };\n\n return (\n <aside\n aria-label={defaultTitles[type]}\n className={`relative my-6 px-4 py-3 border-l-4 rounded-lg ${typeMap[type]} ${className || \"\"}`}\n {...props}\n >\n <p className=\"flex items-center gap-2 mb-2 mt-0 font-bold text-lg\">\n <span>\n <Icon />\n </span>\n {title || defaultTitles[type]}\n </p>\n <section className=\"[&>p]:mt-0 [&>p]:mb-2 [&>p:last-child]:mb-0\">\n {children}\n </section>\n </aside>\n );\n}\n","import clsx from \"clsx\";\nimport { Highlight } from \"prism-react-renderer\";\n\nexport interface CodeProps {\n code: string;\n language?: string;\n}\n\nexport function Code({ code, language = \"tsx\" }: CodeProps) {\n // Use a fragment or div, but ensure `render` actually exists before injecting\n return (\n <Highlight code={code} language={language}>\n {({ className, tokens, getLineProps, getTokenProps }) => (\n <pre className={clsx(\"not-prose\", className)}>\n <code className={clsx(\"code-highlight\", className)}>\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })} style={undefined}>\n {line.map((token, key) => (\n <span\n key={key}\n {...getTokenProps({ token })}\n style={undefined}\n />\n ))}\n </div>\n ))}\n </code>\n </pre>\n )}\n </Highlight>\n );\n}\n","import { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\";\n\nfunction Tabs({\n orientation = \"horizontal\",\n className,\n ...props\n}: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={`w-full ${className || \"\"}`}\n {...props}\n />\n );\n}\n\nfunction TabsList({ className, ...props }: TabsPrimitive.List.Props) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n className={`flex w-full overflow-x-auto border-b border-default-200 no-scrollbar ${\n className || \"\"\n }`}\n {...props}\n />\n );\n}\n\nfunction TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n data-slot=\"tabs-trigger\"\n className={`\n -mb-px flex items-center justify-center whitespace-nowrap border-b-2 border-transparent \n px-4 py-2.5 text-sm font-medium transition-colors cursor-pointer\n text-default-600 hover:text-default-900 hover:border-default-300\n aria-selected:border-primary-500 aria-selected:text-primary-500 \n focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\n disabled:pointer-events-none disabled:opacity-50\n ${className || \"\"}\n `}\n {...props}\n />\n );\n}\n\nfunction TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n data-slot=\"tabs-content\"\n className={`mt-4 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 ${\n className || \"\"\n }`}\n {...props}\n />\n );\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n","import { Code } from \"../code/code\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../tabs/tabs\"; // Adjust import path\n\ntype PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\ntype CommandType = \"add\" | \"create\" | \"exec\" | \"run\";\n\nexport interface PackageManagersProps {\n /** The name of the package (e.g., \"@lonik/themer\") */\n pkg?: string;\n /** The type of command to generate. Defaults to \"add\" */\n type?: CommandType;\n /** Whether this is a development dependency (-D) */\n dev?: boolean;\n /** Additional arguments to append to the command */\n args?: string;\n className?: string;\n}\n\nconst MANAGERS: PackageManager[] = [\"npm\", \"pnpm\", \"yarn\", \"bun\"];\n\nfunction generateCommand(\n pm: PackageManager,\n type: CommandType,\n pkg?: string,\n dev?: boolean,\n args?: string,\n) {\n const parts: string[] = [];\n\n switch (type) {\n case \"add\":\n parts.push(pm === \"npm\" ? \"npm install\" : `${pm} add`);\n if (dev) parts.push(\"-D\");\n if (pkg) parts.push(pkg);\n break;\n case \"create\":\n parts.push(`${pm} create`);\n if (pkg) parts.push(pkg);\n break;\n case \"exec\":\n if (pm === \"npm\") parts.push(\"npx\");\n else if (pm === \"bun\") parts.push(\"bun x\");\n else parts.push(`${pm} dlx`);\n if (pkg) parts.push(pkg);\n break;\n case \"run\":\n parts.push(pm === \"yarn\" ? \"yarn\" : `${pm} run`);\n if (pkg) parts.push(pkg);\n break;\n }\n\n if (args) {\n // If it's npm and we are passing args to an exec/run script, we often need '--'\n if (pm === \"npm\" && (type === \"exec\" || type === \"run\")) {\n parts.push(\"--\");\n }\n parts.push(args);\n }\n\n return parts.join(\" \");\n}\n\nexport function PackageManagers({\n pkg,\n type = \"add\",\n dev = false,\n args,\n className,\n}: PackageManagersProps) {\n return (\n <Tabs defaultValue=\"npm\" className={`my-6 ${className || \"\"}`}>\n <TabsList>\n {MANAGERS.map((pm) => (\n <TabsTrigger key={pm} value={pm}>\n {pm.toLowerCase()}\n </TabsTrigger>\n ))}\n </TabsList>\n\n {MANAGERS.map((pm) => {\n const command = generateCommand(pm, type, pkg, dev, args);\n\n return (\n <TabsContent keepMounted={true} key={pm} value={pm}>\n <Code code={command} language=\"bash\"></Code>\n </TabsContent>\n );\n })}\n </Tabs>\n );\n}\n","import { Github } from \"lucide-react\";\n\nexport function GitHub({ github }: { github: string | undefined }) {\n if (!github) {\n return null;\n }\n\n return (\n <a\n href={github}\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label=\"GitHub repository\"\n title=\"GitHub repository\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded border border-default-200 bg-default-50 text-default-500 hover:bg-default-100\"\n >\n <Github size={16} />\n </a>\n );\n}\n","import \"@docsearch/css\";\nimport { DocSearch } from \"@docsearch/react\";\nimport { AlgoliaOptions } from \"../../routes/prestige-shell\";\n\nexport function Search({\n algolia,\n}: {\n // 2. Add 'typeof' to extract the type from the value\n algolia: AlgoliaOptions | undefined;\n}) {\n if (!algolia) {\n return null;\n }\n\n return (\n <div className=\"prestige-search\">\n <DocSearch\n appId={algolia.appId}\n apiKey={algolia.apiKey}\n indices={algolia.indices}\n />\n </div>\n );\n}\n","import { useTheme } from \"@lonik/themer\";\nimport { useHydrated } from \"@tanstack/react-router\";\nimport { Moon, Sun, SunMoon } from \"lucide-react\";\n\nconst themeOrder = [\"system\", \"light\", \"dark\"] as const;\ntype ThemeValue = (typeof themeOrder)[number];\n\nexport function Theme() {\n const { theme, setTheme } = useTheme();\n const currentTheme: ThemeValue = (theme as ThemeValue) ?? \"system\";\n const hydrated = useHydrated();\n\n const nextTheme = (value: ThemeValue): ThemeValue => {\n const index = themeOrder.indexOf(value);\n return themeOrder[(index + 1) % themeOrder.length]!;\n };\n\n const icon =\n currentTheme === \"light\" ? (\n <Sun size={16} />\n ) : currentTheme === \"dark\" ? (\n <Moon size={16} />\n ) : (\n <SunMoon size={16} />\n );\n\n return (\n <button\n suppressHydrationWarning\n type=\"button\"\n aria-label={`Theme: ${currentTheme}. Click to switch theme`}\n title={`Theme: ${currentTheme}`}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md border border-default-200 bg-default-50 text-default-500 hover:bg-default-100 cursor-pointer\"\n onClick={() => setTheme(nextTheme(currentTheme))}\n >\n {hydrated && icon}\n </button>\n );\n}\n","import { Link, useLocation } from \"@tanstack/react-router\";\nimport collections from \"virtual:prestige/collection-all\";\nimport config from \"virtual:prestige/config\";\nimport { PrestigeShellProps } from \"../../routes/prestige-shell\";\nimport { GitHub } from \"../github/github\";\nimport { Search } from \"../search/search\";\nimport { Theme } from \"../theme/theme\";\n\nexport type HeaderProps = Pick<\n PrestigeShellProps,\n \"customHeaderTitle\" | \"algolia\" | \"github\"\n>;\n\nexport default function Header({\n customHeaderTitle,\n algolia,\n github,\n}: HeaderProps) {\n const location = useLocation();\n\n return (\n <header className=\"sticky top-0 z-40 flex h-header border-b border-default-200 bg-default-50/80 px-4 backdrop-blur-md\">\n <div className=\"container mx-auto flex items-center justify-between\">\n <div className=\"flex gap-4 items-center\">\n <Link\n activeProps={{\n className: \"border-default-800 text-default-800 font-medium\",\n }}\n className=\"text-sm rounded hover:bg-default-100 text-default-500\"\n to={\"/\"}\n >\n {customHeaderTitle ? (\n customHeaderTitle()\n ) : (\n <span>{config.title}</span>\n )}\n </Link>\n {collections.map((collection) => {\n const isActive =\n location.pathname === `/${collection.id}` ||\n location.pathname.startsWith(`/${collection.id}/`);\n\n return (\n <Link\n key={collection.id}\n to={`/${collection.defaultLink}` as any}\n className={`border-b-2 text-sm rounded hover:bg-default-100 active:bg-default-200 capitalize ${\n isActive\n ? \"border-default-800 text-default-800 font-medium\"\n : \"border-b-transparent text-default-500\"\n }`}\n >\n {collection.label}\n </Link>\n );\n })}\n </div>\n <div className=\"flex items-center gap-2\">\n <Search algolia={algolia} />\n <GitHub github={github} />\n <Theme />\n </div>\n </div>\n </header>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\n\nexport function useTableOfContents(toc: TocItem[]) {\n const [activeId, setActiveId] = useState<string>(\"\");\n\n useEffect(() => {\n if (toc.length === 0) return;\n\n const handleScroll = () => {\n const headingElements = toc\n .map((item) => {\n const id = item.href.startsWith(\"#\") ? item.href.slice(1) : item.href;\n return document.getElementById(id);\n })\n .filter((el): el is HTMLElement => el !== null);\n\n // Add a slight offset to account for sticky headers or top padding\n const scrollPosition = window.scrollY + 100;\n\n let currentActiveId = \"\";\n for (let i = headingElements.length - 1; i >= 0; i--) {\n const element = headingElements[i];\n if (element && element.offsetTop <= scrollPosition) {\n currentActiveId = element.id;\n break;\n }\n }\n\n // If we haven't scrolled past the first heading, highlight the first one\n if (!currentActiveId && headingElements.length > 0 && headingElements[0]) {\n currentActiveId = headingElements[0].id;\n }\n\n setActiveId(currentActiveId ? `#${currentActiveId}` : \"\");\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n // setTimeout to ensure DOM is fully rendered when checking initial offsets\n setTimeout(handleScroll, 100);\n\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [toc]);\n\n const handleLinkClick = (e: React.MouseEvent<HTMLAnchorElement>, href: string) => {\n e.preventDefault();\n const id = href.startsWith(\"#\") ? href.slice(1) : href;\n const element = document.getElementById(id);\n if (element) {\n element.scrollIntoView({ behavior: \"smooth\" });\n // Update URL hash without jumping\n window.history.pushState(null, \"\", href.startsWith(\"#\") ? href : `#${href}`);\n }\n };\n\n return { activeId, handleLinkClick };\n}\n","import clsx from \"clsx\";\nimport { ChevronRight } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport { useTableOfContents } from \"./use-table-of-contents\";\n\nexport function MobileTableOfContent({ toc }: { toc: TocItem[] }) {\n const [isOpen, setIsOpen] = useState(false);\n const { activeId, handleLinkClick } = useTableOfContents(toc);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n const activeItem = toc.find((item) => {\n const itemHref = item.href.startsWith(\"#\") ? item.href : `#${item.href}`;\n return itemHref === activeId;\n });\n\n /* pl-12 is needed for mobile sidebar, because sidebar button is fixed position */\n return (\n <div\n ref={containerRef}\n className=\"sticky top-header z-30 bg-default-50/95 backdrop-blur border-b border-default-200 dark:border-default-800 lg:hidden px-6 pl-12\"\n >\n <div className=\"relative\">\n <button\n onClick={() => setIsOpen((prev) => !prev)}\n className=\"flex w-full items-center justify-between gap-4 px-6 py-3 text-sm text-default-500 font-medium cursor-pointer\"\n >\n <div className=\"flex items-center gap-2\">\n <span>On this page</span>\n <ChevronRight\n className={clsx(\n \"w-4 h-4 transition-transform duration-200\",\n isOpen && \"rotate-90\",\n )}\n />\n </div>\n {activeItem && (\n <span className=\"truncate font-normal max-w-[50%] text-right\">\n {activeItem.value}\n </span>\n )}\n </button>\n\n {isOpen && (\n <div className=\"absolute left-6 right-6 top-full mt-2 max-h-[60vh] overflow-y-auto rounded-lg border border-default-200 bg-default-50 shadow-xl\">\n <ul className=\"p-4 space-y-2.5 text-sm\">\n {toc.map((item) => {\n const itemHref = item.href.startsWith(\"#\")\n ? item.href\n : `#${item.href}`;\n const isActive = activeId === itemHref;\n return (\n <li\n key={itemHref}\n style={{ paddingLeft: `${(item.depth - 1) * 0.75}rem` }}\n >\n <a\n href={itemHref}\n className={clsx(\n \"block transition-colors duration-200 line-clamp-2\",\n isActive\n ? \"text-primary-600 font-medium\"\n : \"text-default-600\",\n )}\n onClick={(e) => {\n handleLinkClick(e, item.href);\n setIsOpen(false);\n }}\n >\n {item.value}\n </a>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport { useTableOfContents } from \"./use-table-of-contents\";\n\nexport function WebTableOfContent({ toc }: { toc: TocItem[] }) {\n const { activeId, handleLinkClick } = useTableOfContents(toc);\n\n return (\n <nav className=\"sticky top-header pt-4 overflow-y-auto w-web-table-of-content hidden lg:block\">\n <span className=\"text-xs font-mono tracking-widest\">ON THIS PAGE</span>\n <ul className=\"text-sm my-4\">\n {toc.map((item) => (\n <li key={item.href}>\n <a\n style={{ paddingLeft: `${(item.depth - 1) * 0.75}rem` }}\n href={`${item.href}`}\n className={clsx(\n \"border-l py-1 px-4 block hover:text-default-700 dark:hover:text-slate-100 transition-colors duration-200 line-clamp-2\",\n activeId === item.href\n ? \"text-default-700 border-default-600 font-medium\"\n : \"text-default-500 border-default-200 \",\n )}\n onClick={(e) => handleLinkClick(e, item.href)}\n >\n {item.value}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n","import React from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport { MobileTableOfContent } from \"../routes/content/table-of-contents/mobile-table-of-contents\";\nimport { WebTableOfContent } from \"../routes/content/table-of-contents/web-table-of-contents\";\n\nexport interface PrestigePageProps {\n children: React.ReactNode;\n toc?: TocItem[];\n}\n\nexport function PrestigePage({ children, toc = [] }: PrestigePageProps) {\n return (\n <div className=\"flex lg:gap-6 items-start max-w-[100vw]\">\n <div className=\"flex-1 min-w-0\">\n <MobileTableOfContent toc={toc} />\n <article className=\"prose wrap-break-word py-15 px-6 max-w-none lg:w-web-content\">\n {children}\n </article>\n </div>\n <WebTableOfContent toc={toc} />\n </div>\n );\n}\n","import { Link } from \"@tanstack/react-router\";\nimport clsx from \"clsx\";\nimport { ArrowLeft, ArrowRight } from \"lucide-react\";\nimport { SiblingNavigationType } from \"../../../vite/core/content/content.types\";\n\nfunction ContentNavigation({\n isNext,\n navigation,\n}: {\n isNext?: boolean;\n navigation: SiblingNavigationType;\n}) {\n const label = isNext ? \"Next\" : \"Previous\";\n return (\n <Link\n to={navigation.link}\n className={clsx(\n \" flex-1 h-20 mb-4 border border-default-200 hover:bg-default-50 rounded-md cursor-pointer flex items-center px-4\",\n isNext ? \"justify-end\" : \"justify-start\",\n )}\n >\n <div\n className={clsx(\n \"flex items-center gap-4\",\n isNext && \"flex-row-reverse\",\n )}\n >\n {isNext ? (\n <ArrowRight className=\"text-default-400\" />\n ) : (\n <ArrowLeft className=\"text-default-400\" />\n )}\n <div className={clsx(\"flex flex-col\", isNext && \"items-end\")}>\n <span className=\"text-xs tracking-widest font-mono\">\n {label.toLocaleUpperCase()}\n </span>\n <span className=\"text-2xl font-li text-default-700\">\n {navigation.label}\n </span>\n </div>\n </div>\n </Link>\n );\n}\n\nexport default function ContentNavigations({\n prev,\n next,\n}: {\n prev: SiblingNavigationType | null | undefined;\n next: SiblingNavigationType | null | undefined;\n}) {\n // width of content navigation must match with content route content width, so we manually\n // add empty div with table-of-content width and add proper gap to match the size\n return (\n <div className=\"flex gap-6\">\n <div className=\"lg:flex flex-row items-center gap-2 mt-2 lg:mt-8 lg:w-web-content w-full\">\n {prev ? (\n <ContentNavigation navigation={prev} />\n ) : (\n <div className=\"flex-1 hidden lg:block \"></div>\n )}\n {next ? (\n <ContentNavigation navigation={next} isNext />\n ) : (\n <div className=\"flex-1 hidden lg:block\"></div>\n )}\n </div>\n <div className=\"lg:w-web-table-of-content h-1\"></div>\n </div>\n );\n}\n","export function isExternalURL(str: string) {\n try {\n const url = new URL(str);\n // This ensures it starts with http or https, filtering out\n // things like 'javascript:alert(1)' or 'mailto:test@test.com'\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n","import { Link } from \"@tanstack/react-router\";\nimport clsx from \"clsx\";\nimport { BookOpen, ChevronRight, ExternalLink } from \"lucide-react\";\nimport { useState } from \"react\";\nimport {\n ExternalSidebarLinkType,\n InternalSidebarLinkType,\n SidebarGroupType,\n SidebarType,\n} from \"../../../vite/core/content/content.types\";\nimport { isExternalURL } from \"../../utils\";\n\nexport interface SidebarProps {\n sidebar: SidebarType;\n onLinkClick?: (() => void) | undefined;\n}\n\nfunction SidebarGroup({\n group,\n onLinkClick,\n}: {\n group: SidebarGroupType;\n onLinkClick?: (() => void) | undefined;\n}) {\n const [open, setIsOpen] = useState(!group.collapsed);\n return (\n <div className=\"mt-4 flex flex-col gap-1\">\n <button\n className=\"flex items-center w-full gap-2\"\n onClick={() => setIsOpen((prev) => !prev)}\n >\n <ChevronRight\n size={18}\n className={clsx(\n \"transform transition cursor-pointer ml-1\",\n open && \"rotate-90\",\n )}\n />\n <span className=\"font-mono text-xs tracking-widest\">\n {group.label.toUpperCase()}\n </span>\n </button>\n {open && (\n <div className=\"mb-2 pl-5\">\n {group.items.map((item) => {\n if (\"slug\" in item || \"link\" in item) {\n const key = \"slug\" in item ? item.slug : item.link;\n return (\n <SidebarLink\n showIcon={false}\n key={key}\n link={item}\n onLinkClick={onLinkClick}\n />\n );\n }\n return <SidebarGroup key={item.label} group={item} onLinkClick={onLinkClick} />;\n })}\n </div>\n )}\n </div>\n );\n}\n\nfunction SidebarLink({\n link,\n onLinkClick,\n showIcon,\n}: {\n link: InternalSidebarLinkType | ExternalSidebarLinkType;\n onLinkClick?: (() => void) | undefined;\n showIcon: boolean;\n}) {\n if (\"slug\" in link || !isExternalURL(link.link)) {\n const slug = \"slug\" in link ? `/${link.slug}` : link.link;\n return (\n <div className=\"flex items-center \">\n <Link\n onClick={onLinkClick}\n activeProps={{ className: \"text-default-700 font-medium\" }}\n className=\"w-full inline-flex gap-2 py-1 px-2 rounded hover:bg-default-100 text-sm mr-2 items-center text-default-500\"\n to={slug}\n >\n {showIcon && <BookOpen className=\"w-4\" />}\n {link.label}\n </Link>\n </div>\n );\n } else {\n return (\n <div className=\"flex items-center \">\n <a\n className=\"w-full inline-flex gap-2 py-1 px-2 rounded hover:bg-default-100 text-sm mr-2 items-center text-default-500\"\n href={link.link}\n target=\"_blank\"\n onClick={onLinkClick}\n rel=\"noreferrer\"\n >\n {showIcon && <ExternalLink className=\"w-4\" />}\n {link.label}\n </a>\n </div>\n );\n }\n}\n\nexport default function Sidebar({ sidebar, onLinkClick }: SidebarProps) {\n return (\n <div className=\"w-full lg:w-sidebar border-r border-default-200 h-full overflow-auto lg:h-main lg:sticky top-header pt-4 pb-10\">\n {sidebar.items.map((item) => {\n if (\"slug\" in item || \"link\" in item) {\n const key = \"slug\" in item ? item.slug : item.link;\n return (\n <SidebarLink\n showIcon={true}\n onLinkClick={onLinkClick}\n key={key}\n link={item}\n />\n );\n }\n return <SidebarGroup key={item.label} group={item} onLinkClick={onLinkClick} />;\n })}\n </div>\n );\n}\n","import { Menu, X } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { SidebarType } from \"../../../vite/core/content/content.types\";\nimport Sidebar from \"./sidebar\";\n\nfunction SidebarOverlay({ sidebar }: { sidebar: SidebarType }) {\n const [isOpen, setIsOpen] = useState(false);\n return (\n <div className=\"lg:hidden\">\n {/* Mobile sidebar button is placed on the start of mobile of content tab, we have to position is via fixed because table of content lives inside content.route */}\n <button\n className=\"bg-transparent p-3 -mt-[2px] text-default-700 top-header left-0 fixed z-50\"\n onClick={() => setIsOpen((prev) => !prev)}\n >\n {isOpen ? <X /> : <Menu />}\n </button>\n {isOpen && (\n <div className=\"fixed top-[calc(var(--spacing-header)+44 )] shadow-xl left-0 overflow-auto z-10 bg-default-50 w-full h-screen\">\n <Sidebar onLinkClick={() => setIsOpen(false)} sidebar={sidebar} />\n </div>\n )}\n </div>\n );\n}\n\nexport default function MobileSidebar({ sidebar }: { sidebar: SidebarType }) {\n return <SidebarOverlay sidebar={sidebar} />;\n}\n","import { Outlet, useLocation } from \"@tanstack/react-router\";\nimport { SidebarType } from \"../../../vite/core/content/content.types\";\nimport ContentNavigations from \"../content/content-navigations\";\nimport MobileSidebar from \"./mobile-sidebar\";\nimport Sidebar from \"./sidebar\";\n\nexport function CollectionRoute(sidebar: SidebarType, id: string) {\n return {\n component: () => {\n const location = useLocation();\n const navigation = sidebar?.navigation?.[location.pathname] || {\n prev: null,\n next: null,\n };\n const { prev, next } = navigation;\n\n return (\n <div className=\"mx-auto flex container lg:gap-6\">\n <MobileSidebar sidebar={sidebar} />\n <div className=\"hidden lg:block\">\n {sidebar && <Sidebar sidebar={sidebar} />}\n </div>\n <div className=\"flex-1 pb-20\">\n <Outlet />\n <div className=\"mt-8 px-6 lg:px-0\">\n <ContentNavigations prev={prev} next={next} />\n </div>\n </div>\n </div>\n );\n },\n };\n}\n","import { FunctionComponent } from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport config from \"virtual:prestige/config\";\nimport { ContentFrontmatterType } from \"../../../vite/core/content/content.types\";\nimport { PrestigePage } from \"../../core/prestige-page\";\nimport { type AnyRouteMatch } from \"@tanstack/react-router\";\nfunction resolveContentData(inlineData: any) {\n return inlineData as {\n toc: TocItem[];\n default: FunctionComponent;\n frontmatter: ContentFrontmatterType;\n };\n}\n\nexport function ContentRoute(inlineData: any): any {\n const { frontmatter } = resolveContentData(inlineData);\n\n return {\n head: () => {\n const metas: Array<\n | { name?: string; content?: string; title?: string }\n | Record<string, any>\n > = [];\n const description = frontmatter.description;\n const title = frontmatter.title;\n const head = frontmatter.head;\n\n if (title) {\n metas.push({\n title: title + \" | \" + config.title,\n });\n }\n\n if (description) {\n metas.push({\n name: \"description\",\n content: description,\n });\n }\n\n const mergedMeta = head?.meta ? [...metas, ...head.meta] : metas;\n return {\n meta: mergedMeta.length > 0 ? mergedMeta : undefined,\n links: head?.links,\n styles: head?.styles,\n scripts: head?.scripts,\n } as { scripts: AnyRouteMatch[\"scripts\"] };\n },\n };\n}\n\nexport function LazyContentRoute(inlineData: any): any {\n const { toc, default: Component } = resolveContentData(inlineData);\n\n return {\n component: () => {\n return (\n <PrestigePage toc={toc}>\n <Component />\n </PrestigePage>\n );\n },\n };\n}\n","export function PrestigeNotFound() {\n return (\n <div className=\"w-full h-full flex justify-center pt-15 lg:pt-30 \">\n <div className=\"flex flex-col gap-3 items-center\">\n <h1 className=\"text-3xl lg:text-7xl\">404</h1>\n <h2 className=\"text-3xl lg:text-5xl\">Page Not Found</h2>\n </div>\n </div>\n );\n}\n","import {\n LicenseOptions,\n PrestigeShellProps,\n} from \"../../routes/prestige-shell\";\n\nfunction License({ license }: { license: LicenseOptions | undefined }) {\n if (!license) {\n return null;\n }\n return (\n <a target=\"_blank\" href={license.url}>\n Released under: {license.label}\n </a>\n );\n}\n\nfunction Copyright({ copyright }: Pick<PrestigeShellProps, \"copyright\">) {\n if (!copyright) {\n return null;\n }\n return copyright();\n}\n\nexport default function Footer({\n copyright,\n license,\n}: Pick<PrestigeShellProps, \"copyright\" | \"license\">) {\n return (\n <footer className=\"flex items-center justify-center flex-col gap-2 px-4 border-t border-t-default-100 pt-10 bg-default-50 text-sm py-10 text-default-700\">\n <License license={license} />\n <Copyright copyright={copyright} />\n </footer>\n );\n}\n","import { ThemeProvider } from \"@lonik/themer\";\nimport { ReactNode } from \"react\";\nimport Footer from \"../core/footer/footer\";\nimport Header from \"../core/header/header\";\n\ntype RenderNode = () => ReactNode;\n\nexport interface AlgoliaOptions {\n appId: string;\n apiKey: string;\n indices: string[];\n}\nexport interface LicenseOptions {\n label: string;\n url: string;\n}\nexport interface PrestigeShellProps {\n customHeaderTitle?: RenderNode | undefined;\n copyright?: RenderNode | undefined;\n github?: string | undefined;\n algolia?: AlgoliaOptions | undefined;\n license?: LicenseOptions | undefined;\n}\nexport function PrestigeShell({\n children,\n options,\n}: {\n children: ReactNode;\n options?: PrestigeShellProps;\n}) {\n return (\n <ThemeProvider attribute=\"data-theme\" defaultTheme=\"system\">\n <Header\n algolia={options?.algolia}\n customHeaderTitle={options?.customHeaderTitle}\n {...options}\n />\n <main className=\"min-h-[calc(100vh-var(--spacing-header))]\">\n {children}\n </main>\n <Footer copyright={options?.copyright} />\n </ThemeProvider>\n );\n}\n","import { PropsWithChildren } from \"react\";\n\nexport type StepItemProps = PropsWithChildren<{\n index: number | string;\n label: string;\n}>;\n\nexport function StepItem({ children, label, index }: StepItemProps) {\n return (\n <li className=\"group list-none\">\n <div className=\"flex items-start gap-2\">\n <div className=\"rounded-full flex justify-center items-center text-base font-medium w-8 h-8 bg-primary-50 text-primary-400 border-2 border-primary-400\">\n {index}\n </div>\n <h3 className=\"text-default-600 mt-1\">{label}</h3>\n </div>\n <div className=\"pb-6 group-last:pb-0 border-l-2 border-l-default-200 pl-6 ml-4 mt-1 mb-4 text-default-600\">\n {children}\n </div>\n </li>\n );\n}\n","import { PropsWithChildren } from \"react\";\n\nexport type StepsProps = PropsWithChildren;\n\nexport function Steps({ children }: StepsProps) {\n return <ul>{children}</ul>;\n}\n"],"mappings":"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"}
package/dist/vite.js CHANGED
@@ -17,9 +17,8 @@ import { visit } from "unist-util-visit";
17
17
  import { pathToFileURL } from "node:url";
18
18
  import { glob } from "tinyglobby";
19
19
  import { read } from "to-vfile";
20
- import pc from "picocolors";
21
- import chokidar from "chokidar";
22
20
  import debounce from "debounce";
21
+ import pc from "picocolors";
23
22
 
24
23
  //#region src/vite/utils/errors.ts
25
24
  var PrestigeError = class extends Error {};
@@ -549,6 +548,25 @@ function resolveLink(item) {
549
548
  return "";
550
549
  }
551
550
 
551
+ //#endregion
552
+ //#region src/vite/content/content-watcher.ts
553
+ function initContentWatcher(contentDir, server) {
554
+ const isDocsMatcher = picomatch(join(contentDir, "**/*.{md,mdx}"));
555
+ const schedule = debounce(() => {
556
+ server.restart();
557
+ }, 1e3);
558
+ const onFileChange = (file) => {
559
+ if (!isDocsMatcher(file)) return;
560
+ schedule();
561
+ };
562
+ server.watcher.add(contentDir);
563
+ server.watcher.on("add", onFileChange);
564
+ server.watcher.on("unlink", onFileChange);
565
+ server.httpServer?.on("close", () => {
566
+ schedule.clear();
567
+ });
568
+ }
569
+
552
570
  //#endregion
553
571
  //#region src/vite/content/router-compiler.ts
554
572
  async function compileRoutes(linksMap, routesDir, logger) {
@@ -672,23 +690,6 @@ function createLogger(config) {
672
690
  };
673
691
  }
674
692
 
675
- //#endregion
676
- //#region src/vite/content/content-watcher.ts
677
- function initContentWatcher(contentDir, onUpdate) {
678
- const scheduleUpdate = debounce(onUpdate, 1e3);
679
- const watcher = chokidar.watch(contentDir, {
680
- awaitWriteFinish: true,
681
- ignoreInitial: true
682
- }).on("all", (event) => {
683
- if (event !== "add" && event !== "unlink") return;
684
- scheduleUpdate();
685
- });
686
- return () => {
687
- scheduleUpdate.clear();
688
- return watcher.close();
689
- };
690
- }
691
-
692
693
  //#endregion
693
694
  //#region src/vite/plugin.ts
694
695
  const CONFIG_VIRTUAL_ID = "virtual:prestige/config";
@@ -725,12 +726,7 @@ function prestige(inlineConfig) {
725
726
  await compileRoutes(linksMap, routesDir, logger);
726
727
  },
727
728
  configureServer(server) {
728
- const contentWatcher = initContentWatcher(contentDir, () => {
729
- server.restart();
730
- });
731
- server.httpServer?.on("close", () => {
732
- contentWatcher();
733
- });
729
+ initContentWatcher(contentDir, server);
734
730
  },
735
731
  resolveId(id) {
736
732
  if (id.includes(CONFIG_VIRTUAL_ID)) {
package/dist/vite.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"vite.js","names":["CollectionGroupSchema: z.ZodType<CollectionGroup, CollectionGroup>","CollectionItemSchema: z.ZodType<CollectionItem, CollectionItem>","sidebarLinks: SidebarLinkType[]","processItem","data","typeMap: Record<\"note\" | \"tip\" | \"caution\" | \"danger\", string>","titleChildren: any[]","toc: TocItem[]","prev: SiblingNavigationType | undefined","next: SiblingNavigationType | undefined","join","navigation: Record<string, NavigationLinks>","items: SidebarItemType[]","group: CollectionGroup","join","collections: CollectionNavigation[]","config: PrestigeConfig","contentDir: string","isDocsMatcher: Matcher","collections: Collections","linksMap: Map<string, SidebarLinkType[]>","collectionNavigations: string","sidebarsMap: Map<string, SidebarType>","logger: Logger"],"sources":["../src/vite/utils/errors.ts","../src/vite/core/content/content.types.ts","../src/vite/config/config.types.ts","../src/vite/utils/file-utils.ts","../src/vite/config/config.ts","../src/vite/content/content-links.ts","../src/vite/content/content-compiler.ts","../src/vite/content/content.store.ts","../src/vite/content/content-sidebar.store.ts","../src/vite/content/router-compiler.ts","../src/vite/utils/code-generation.ts","../src/vite/core/content/content-collection.store.ts","../src/vite/utils/logger.ts","../src/vite/content/content-watcher.ts","../src/vite/plugin.ts"],"sourcesContent":["import { type ZodType, input } from \"zod\";\n\nexport class PrestigeError extends Error {}\n\n/**\n * Parse data with zod schema and if fails throw PrestigeError that is friendly error\n * for prestige ecosystem\n */\nexport function parseWithFriendlyErrors<T extends ZodType>(s: T, input: input<T>, message: string) {\n try {\n return s.parse(input);\n } catch (e) {\n if (e instanceof Error) {\n throw new PrestigeError(`Prestige error cause: ${message}, with error: ${e.message} `);\n } else {\n throw new PrestigeError(`Prestige error cause: ${message} `);\n }\n }\n}\n","import { z } from \"zod\";\n\nexport const ContentHeadFrontmatterSchema = z.object({\n meta: z.array(z.record(z.string(), z.any())).optional(),\n links: z.array(z.record(z.string(), z.any())).optional(),\n styles: z.array(z.record(z.string(), z.any())).optional(),\n scripts: z.array(z.record(z.string(), z.any())).optional(),\n});\n\nexport type ContentHeadFrontmatterType = z.infer<\n typeof ContentHeadFrontmatterSchema\n>;\n\nexport const ContentFrontmatterSchema = z.object({\n title: z.string().describe(\"The title of the article\"),\n description: z.string().optional().describe(\"The description of the article\"),\n label: z.string().optional().describe(\"The label of the content\"),\n head: ContentHeadFrontmatterSchema.optional(),\n});\n\nexport type ContentFrontmatterType = z.infer<typeof ContentFrontmatterSchema>;\n\nexport const ContentSchema = z.object({\n matter: ContentFrontmatterSchema,\n html: z.string().describe(\"The html of the content\"),\n});\n\nexport type ContentType = z.infer<typeof ContentSchema>;\n\nconst InternalCollectionLinkSchema = z.union([\n z.object({\n label: z.string(),\n slug: z.string(),\n }),\n z.string(),\n]);\n\nconst ExternalCollectionLinkSchema = z.object({\n label: z.string(),\n link: z.string(),\n});\n\nexport type ExternalCollectionLink = z.infer<\n typeof ExternalCollectionLinkSchema\n>;\n\nexport type InternalCollectionLink = z.infer<\n typeof InternalCollectionLinkSchema\n>;\n\nexport type CollectionGroup = {\n label: string;\n items?: CollectionItem[] | undefined;\n collapsed?: boolean | undefined;\n autogenerate?: { directory: string } | undefined;\n};\n\nexport type CollectionItem =\n | InternalCollectionLink\n | CollectionGroup\n | ExternalCollectionLink;\n\nconst CollectionGroupSchema: z.ZodType<CollectionGroup, CollectionGroup> =\n z.object({\n label: z.string(),\n items: z.lazy(() => z.array(CollectionItemSchema)).optional(),\n collapsed: z.boolean().optional(),\n autogenerate: z\n .object({\n directory: z.string(),\n })\n .optional(),\n });\n\nconst CollectionItemSchema: z.ZodType<CollectionItem, CollectionItem> = z.union(\n [\n ExternalCollectionLinkSchema,\n InternalCollectionLinkSchema,\n z.lazy(() => CollectionGroupSchema),\n ],\n);\n\nexport const CollectionSchema = z.object({\n id: z\n .string()\n .min(1, { message: \"Folder name cannot be empty\" })\n .max(50, { message: \"Folder name too long\" })\n // Allows alphanumeric, hyphens, and underscores\n .regex(/^[a-zA-Z0-9-_]+$/, {\n message: \"Only alphanumeric, hyphens, and underscores allowed\",\n })\n .describe(\"The id of the collection, must match the folder name\"),\n items: z.array(CollectionItemSchema),\n label: z.string().optional().describe(\"The label of the collection\"),\n defaultLink: z\n .string()\n .optional()\n .describe(\"The default link of the collection\"),\n});\n\nexport type Collection = z.infer<typeof CollectionSchema>;\n\nexport type CollectionNavigation = {\n id: string;\n label: string;\n defaultLink?: string;\n};\n\nexport type CollectionInput = z.input<typeof CollectionSchema>;\n\nexport const CollectionsSchema = z.array(CollectionSchema);\n\nexport type Collections = z.infer<typeof CollectionsSchema>;\n\nexport interface InternalSidebarLinkType {\n slug: string;\n label: string;\n}\n\nexport interface ExternalSidebarLinkType {\n label: string;\n link: string;\n}\n\nexport type SidebarLinkType = InternalSidebarLinkType | ExternalSidebarLinkType;\n\nexport interface SidebarGroupType {\n label: string;\n items: SidebarItemType[];\n collapsed?: boolean | undefined;\n}\n\nexport type SidebarItemType =\n | InternalSidebarLinkType\n | SidebarGroupType\n | ExternalSidebarLinkType;\n\nexport interface SidebarType {\n items: SidebarItemType[];\n defaultLink: string;\n navigation: Record<string, NavigationLinks>;\n}\n\nexport interface SiblingNavigationType {\n label: string;\n link: string;\n}\n\nexport interface NavigationLinks {\n prev: SiblingNavigationType | null | undefined;\n next: SiblingNavigationType | null | undefined;\n}\n","import { FlexibleTocOptions } from \"remark-flexible-toc\";\nimport type { Options as RemarkGfmOptions } from \"remark-gfm\";\nimport { PluggableList } from \"unified\";\nimport { z } from \"zod\";\nimport { CollectionsSchema } from \"../core/content/content.types\";\n\nexport const PrestigeConfigSchema = z.object({\n title: z.string().describe(\"Title of the website\"),\n disableLog: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Disable logger, default is false\"),\n enableDebugLog: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Enable debug log, default is false\"),\n collections: CollectionsSchema,\n markdown: z\n .object({\n gfmOptions: z\n .custom<RemarkGfmOptions>()\n .optional()\n .describe(\"Options for remark-gfm\"),\n rehypePlugins: z\n .custom<PluggableList>()\n .optional()\n .describe(\"Additional rehype plugins\"),\n remarkPlugins: z\n .custom<PluggableList>()\n .optional()\n .describe(\"Additional remark plugins\"),\n remarkFlexibleToc: z\n .custom<FlexibleTocOptions>()\n .optional()\n .describe(\"Options for remark-flexible-toc\"),\n rehypeSlug: z\n .custom<{\n prefix?: string;\n }>()\n .optional()\n .describe(\"Options for rehype-slug\"),\n })\n .optional()\n .describe(\"Markdown options, configure how markdown is parsed\"),\n});\n\nexport type PrestigeConfigInput = z.input<typeof PrestigeConfigSchema>;\nexport type PrestigeConfig = z.infer<typeof PrestigeConfigSchema>;\n","import { mkdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"pathe\";\n\nexport async function pathExists(path: string) {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(dirPath: string) {\n await mkdir(dirPath, { recursive: true });\n}\n\nexport async function outputFile(\n filePath: string,\n data: string | NodeJS.ArrayBufferView,\n) {\n const dir = dirname(filePath);\n\n // recursive: true won't throw if the dir already exists\n await mkdir(dir, { recursive: true });\n await writeFile(filePath, data);\n}\n\nexport async function rmSafe(path: string) {\n try {\n await rm(path, { recursive: true, force: true });\n return true;\n } catch {\n return false;\n }\n}\n\n// Helper function to extract the virtual ID from a messy path\nexport function extractVirtualId(fullId: string, virtualPrefix: string) {\n const startIndex = fullId.indexOf(virtualPrefix);\n if (startIndex !== -1) {\n // Slice from the start of the virtual prefix to the end of the string\n return \"\\0\" + fullId.slice(startIndex);\n }\n return null;\n}\n","import { parseWithFriendlyErrors, PrestigeError } from \"../utils/errors\";\nimport { PrestigeConfigInput, PrestigeConfigSchema } from \"./config.types\";\nimport { join } from \"pathe\";\nimport { pathExists } from \"../utils/file-utils\";\n\nexport function validateConfig(config: PrestigeConfigInput) {\n return parseWithFriendlyErrors(PrestigeConfigSchema, config, \"Invalid schema\");\n}\n\nexport async function resolvePrestigeConfig(\n configInput: PrestigeConfigInput | undefined,\n root: string,\n) {\n if (!configInput) {\n throw new PrestigeError(\"Prestige config is required\");\n }\n\n const validatedConfig = validateConfig(configInput);\n const docsDirPath = join(root, \"src/content\");\n\n if (!(await pathExists(docsDirPath))) {\n throw new PrestigeError(`Docs! directory not found: ${docsDirPath}`);\n }\n\n return { config: validatedConfig, fullDocsDir: docsDirPath };\n}\n","import { SidebarLinkType, SidebarItemType, SidebarType } from \"../core/content/content.types\";\n\nexport function resolveContentLinks(sidebars: Map<string, SidebarType>) {\n const links = new Map<string, SidebarLinkType[]>();\n for (const [key, sidebar] of sidebars) {\n const sidebarLinks: SidebarLinkType[] = [];\n for (const item of sidebar.items) {\n processItem(item, sidebarLinks);\n }\n links.set(key, sidebarLinks);\n }\n return links;\n}\n\nfunction processItem(item: SidebarItemType, links: SidebarLinkType[] = []) {\n if (\"slug\" in item || \"link\" in item) {\n links.push(item);\n } else if (\"items\" in item) {\n for (const childItem of item.items) {\n processItem(childItem, links);\n }\n }\n return links;\n}\n","import { compile } from \"@mdx-js/mdx\";\nimport rehypePrism from \"rehype-prism-plus\";\nimport rehypeSlug from \"rehype-slug\";\nimport remarkDirective from \"remark-directive\";\nimport remarkFlexibleToc, { TocItem } from \"remark-flexible-toc\";\nimport remarkFrontmatter from \"remark-frontmatter\";\nimport remarkGfm from \"remark-gfm\";\nimport { PluggableList } from \"unified\";\nimport { Compatible, VFile } from \"vfile\";\nimport matter from \"gray-matter\";\nimport { PrestigeConfig } from \"../config/config.types\";\n\nimport { h } from \"hastscript\";\nimport type { Node } from \"unist\";\nimport { visit } from \"unist-util-visit\";\n\nexport default function remarkAdmonitions() {\n return (tree: Node) => {\n visit(tree, (node: any) => {\n if (\n node.type === \"textDirective\" ||\n node.type === \"leafDirective\" ||\n node.type === \"containerDirective\"\n ) {\n if (node.type !== \"containerDirective\") {\n const data = node.data || (node.data = {});\n const hast = h(node.type === \"textDirective\" ? \"span\" : \"aside\", {\n className: [\"admonition\", `admonition-${node.name}`],\n ...node.attributes,\n });\n data.hName = hast.tagName;\n data.hProperties = hast.properties;\n return;\n }\n\n const type = [\"note\", \"tip\", \"caution\", \"danger\"].includes(node.name)\n ? node.name\n : \"note\";\n\n const typeMap: Record<\"note\" | \"tip\" | \"caution\" | \"danger\", string> = {\n note: \"bg-blue-50/50 dark:bg-blue-900/20 border-blue-500 text-blue-900 dark:text-blue-200\",\n tip: \"bg-purple-50/50 dark:bg-purple-900/20 border-purple-500 text-purple-900 dark:text-purple-200\",\n caution:\n \"bg-yellow-50/50 dark:bg-yellow-900/20 border-yellow-500 text-yellow-900 dark:text-yellow-200\",\n danger:\n \"bg-red-50/50 dark:bg-red-900/20 border-red-500 text-red-900 dark:text-red-200\",\n };\n\n const data = node.data || (node.data = {});\n data.hName = \"aside\";\n data.hProperties = {\n \"aria-label\": type.charAt(0).toUpperCase() + type.slice(1),\n className: [\n \"relative\",\n \"my-6\",\n \"px-4\",\n \"py-3\",\n \"border-l-4\",\n \"rounded-lg\",\n ...(typeMap[type as keyof typeof typeMap] || typeMap[\"note\"]).split(\n \" \",\n ),\n ],\n ...node.attributes,\n };\n\n let titleNodeIndex = node.children.findIndex(\n (c: any) => c.data?.directiveLabel,\n );\n let titleChildren: any[];\n\n if (titleNodeIndex !== -1) {\n titleChildren = node.children[titleNodeIndex].children;\n node.children.splice(titleNodeIndex, 1);\n } else {\n titleChildren = [\n {\n type: \"text\",\n value: type.charAt(0).toUpperCase() + type.slice(1),\n },\n ];\n }\n\n const getIconHast = (t: string) => {\n const props = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: \"2\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n className: [\"w-5\", \"h-5\", \"flex-shrink-0\"],\n };\n if (t === \"note\")\n return h(\"svg\", props, [\n h(\"circle\", { cx: \"12\", cy: \"12\", r: \"10\" }),\n h(\"path\", { d: \"M12 16v-4\" }),\n h(\"path\", { d: \"M12 8h.01\" }),\n ]);\n if (t === \"tip\")\n return h(\"svg\", props, [\n h(\"path\", {\n d: \"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\",\n }),\n h(\"path\", {\n d: \"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\",\n }),\n h(\"path\", { d: \"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\" }),\n h(\"path\", { d: \"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" }),\n ]);\n if (t === \"caution\")\n return h(\"svg\", props, [\n h(\"path\", {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\",\n }),\n h(\"path\", { d: \"M12 9v4\" }),\n h(\"path\", { d: \"M12 17h.01\" }),\n ]);\n if (t === \"danger\")\n return h(\"svg\", props, [\n h(\"polygon\", {\n points:\n \"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\",\n }),\n h(\"path\", { d: \"M12 8v4\" }),\n h(\"path\", { d: \"M12 16h.01\" }),\n ]);\n return null;\n };\n\n const titleBlock = {\n type: \"paragraph\",\n data: {\n hName: \"p\",\n hProperties: {\n className: [\n \"flex\",\n \"items-center\",\n \"gap-2\",\n \"mb-2\",\n \"mt-0\",\n \"font-bold\",\n \"text-lg\",\n ],\n },\n },\n children: [\n {\n type: \"text\",\n value: \"\",\n data: { hName: \"span\", hChildren: [getIconHast(type)] },\n },\n ...titleChildren,\n ],\n };\n\n const contentBlock = {\n type: \"paragraph\",\n data: {\n hName: \"section\",\n hProperties: {\n className: [\n \"[&>p]:mt-0\",\n \"[&>p]:mb-2\",\n \"[&>p:last-child]:mb-0\",\n ],\n },\n },\n children: node.children,\n };\n\n node.children = [titleBlock, contentBlock];\n }\n });\n };\n}\n\nexport function rehypeAddNotProseToPre() {\n return (tree: Node) => {\n visit(tree, (node: any) => {\n // Look specifically for HTML elements that are <pre> tags\n if (node.type === \"element\" && node.tagName === \"pre\") {\n node.properties = node.properties || {};\n\n // HAST classNames are generally arrays of strings\n const currentClass = node.properties.className || [];\n node.properties.className = Array.isArray(currentClass)\n ? [...currentClass, \"not-prose\"]\n : [currentClass, \"not-prose\"];\n }\n });\n };\n}\n\nexport async function compileMarkdown(\n content: Readonly<Compatible>,\n baseUrl: string,\n options?: PrestigeConfig[\"markdown\"],\n) {\n const toc: TocItem[] = [];\n\n const rehypePlugins: PluggableList = [\n ...(options?.rehypePlugins ?? []),\n rehypeSlug,\n [rehypePrism, { options: { showLineNumbers: false } }],\n rehypeAddNotProseToPre,\n ];\n\n const remarkPlugins: PluggableList = [\n ...(options?.remarkPlugins ?? []),\n remarkFrontmatter,\n [remarkGfm, options?.gfmOptions || {}],\n remarkDirective,\n remarkAdmonitions,\n [remarkFlexibleToc, { tocRef: toc }],\n ];\n\n const code = await compile(content, {\n outputFormat: \"program\",\n rehypePlugins,\n remarkPlugins,\n baseUrl: baseUrl,\n });\n return { code: String(code), toc };\n}\n\nexport async function compileFrontmatter(vFile: VFile) {\n const result = matter(String(vFile.value));\n return result.data || {};\n}\n\nexport function warmupCompiler(options?: PrestigeConfig[\"markdown\"]) {\n compileMarkdown(\"```js\\n```\", \"http://localhost\", options).catch(() => {});\n}\n","import { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { parse, relative } from \"pathe\";\nimport { glob } from \"tinyglobby\";\nimport { read } from \"to-vfile\";\nimport {\n SiblingNavigationType,\n SidebarLinkType,\n} from \"../core/content/content.types\";\nimport { compileMarkdown } from \"./content-compiler\";\n\nimport { PrestigeError } from \"../utils/errors\";\nimport { compileFrontmatter } from \"./content-compiler\";\n\nexport const CONTENT_VIRTUAL_ID = \"virtual:prestige/content/\";\n\nfunction getSiblingLink(\n link: SidebarLinkType | undefined,\n): SiblingNavigationType | undefined {\n if (!link) {\n return undefined;\n }\n return {\n label: link.label,\n link: \"slug\" in link ? link.slug : link.link,\n };\n}\n\nexport function resolveSiblings(\n base: string,\n slug: string,\n linksMap: Map<string, SidebarLinkType[]>,\n) {\n const links = linksMap.get(base);\n if (!links?.length) {\n return { prev: undefined, next: undefined };\n }\n\n const validLinks = links.filter((l) => {\n if (\"slug\" in l) return true;\n if (\"link\" in l) {\n return !l.link.startsWith(\"http://\") && !l.link.startsWith(\"https://\");\n }\n return false;\n });\n\n const linkIndex = validLinks.findIndex((link) => {\n return (\n (\"slug\" in link && link.slug === slug) ||\n (\"link\" in link && link.link === slug)\n );\n });\n\n let prev: SiblingNavigationType | undefined;\n let next: SiblingNavigationType | undefined;\n\n if (linkIndex !== -1) {\n if (linkIndex > 0) {\n prev = getSiblingLink(validLinks[linkIndex - 1]);\n }\n if (linkIndex < validLinks.length - 1) {\n next = getSiblingLink(validLinks[linkIndex + 1]);\n }\n }\n\n return { prev, next };\n}\n\nexport async function resolveMarkdown(slug: string, contentDir: string) {\n const filePath = await getPathBySlug(slug, contentDir);\n const baseUrl = pathToFileURL(filePath).href;\n const file = await read(filePath);\n const frontmatter = await compileFrontmatter(file);\n const { code, toc } = await compileMarkdown(file, baseUrl);\n return { code, toc, frontmatter };\n}\n\nexport async function resolveContent(\n id: string,\n linksMap: Map<string, SidebarLinkType[]>,\n contentDir: string,\n) {\n const slug = id.replace(CONTENT_VIRTUAL_ID, \"\").replace(\"\\0\", \"\");\n const base = slug.split(\"/\")[0] as string;\n\n const { prev, next } = resolveSiblings(base, slug, linksMap);\n const { toc, code, frontmatter } = await resolveMarkdown(slug, contentDir);\n let resolvedCode = code;\n\n resolvedCode += `\\n export const toc = ${JSON.stringify(toc)}\\n`;\n resolvedCode += `\\n export const prev = ${JSON.stringify(prev)}\\n`;\n resolvedCode += `\\n export const next = ${JSON.stringify(next)}\\n`;\n resolvedCode += `\\n export const frontmatter = ${JSON.stringify(\n frontmatter,\n )}\\n`;\n return resolvedCode;\n}\n\nexport async function getPathBySlug(slug: string, contentDir: string) {\n const pathMatch = join(contentDir, slug);\n const matches = await glob(`${pathMatch}.{md,mdx}`);\n if (matches.length === 0) {\n throw new PrestigeError(\n `[Prestige] Could not find markdown file for slug: \"${slug}\". Searched at: ${pathMatch}.{md,mdx}. If you want to link to a custom page, use 'link: \"${slug}\"' instead of 'slug: \"${slug}\"' in your collection config.`,\n );\n }\n return matches[0] as string;\n}\n\nexport async function getFileBySlug(slug: string, contentDir: string) {\n return await read(await getPathBySlug(slug, contentDir));\n}\n\nexport function getVirtualModuleIdsForFile(path: string, contentDir: string) {\n const slug = getSlugByPath(path, contentDir);\n return [\"\\0\" + CONTENT_VIRTUAL_ID + slug];\n}\n\nexport function getSlugByPath(path: string, contentDir: string) {\n // 1. Get the relative path: \"zz/zz/myFile.json\"\n const relativePath = relative(contentDir, path);\n\n // 2. Parse the path to separate the extension\n const pathInfo = parse(relativePath);\n\n const result = join(pathInfo.dir, pathInfo.name);\n\n return result;\n}\n","import { readdir } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { join } from \"pathe\";\nimport {\n Collection,\n CollectionGroup,\n CollectionItem,\n Collections,\n ExternalSidebarLinkType,\n InternalCollectionLink,\n InternalSidebarLinkType,\n NavigationLinks,\n SiblingNavigationType,\n SidebarGroupType,\n SidebarItemType,\n SidebarType,\n} from \"../core/content/content.types\";\nimport { PrestigeError } from \"../utils/errors\";\nimport { pathExists } from \"../utils/file-utils\";\nimport { compileFrontmatter } from \"./content-compiler\";\nimport { getFileBySlug } from \"./content.store\";\nimport { Logger } from \"../utils/logger\";\n\nexport const SIDEBAR_VIRTUAL_ID = \"virtual:prestige/sidebar/\";\n\nfunction flattenSidebar(items: SidebarItemType[]): SiblingNavigationType[] {\n return items.flatMap((item) => {\n if (\"slug\" in item) {\n return [{ label: item.label, link: `/${item.slug}` }];\n }\n if (\"link\" in item) {\n // Ignore external links\n if (item.link.startsWith(\"http://\") || item.link.startsWith(\"https://\")) {\n return [];\n }\n return [{ label: item.label, link: item.link }];\n }\n if (\"items\" in item) {\n return flattenSidebar(item.items);\n }\n return [];\n });\n}\n\nfunction computeNavigation(\n items: SidebarItemType[],\n): Record<string, NavigationLinks> {\n const flattenedLinks = flattenSidebar(items);\n const navigation: Record<string, NavigationLinks> = {};\n\n for (let i = 0; i < flattenedLinks.length; i++) {\n const link = flattenedLinks[i];\n if (link) {\n navigation[link.link] = {\n prev: i > 0 ? flattenedLinks[i - 1] : null,\n next: i < flattenedLinks.length - 1 ? flattenedLinks[i + 1] : null,\n };\n }\n }\n\n return navigation;\n}\n\nfunction resolveDefaultLink(\n items: SidebarItemType[],\n defaultLink?: string,\n): string | undefined {\n if (defaultLink) {\n return defaultLink;\n }\n for (const item of items) {\n if (\"slug\" in item) {\n return item.slug;\n } else if (\"link\" in item) {\n return item.link;\n } else if (\"items\" in item && item.items.length > 0) {\n const link = resolveDefaultLink(item.items);\n if (link) return link;\n }\n }\n return undefined;\n}\n\nexport async function resolveSidebars(\n collections: Collections,\n contentDir: string,\n logger: Logger,\n) {\n const store = new Map<string, SidebarType>();\n\n for (const collection of collections) {\n const sidebar = await processCollection(collection, contentDir, logger);\n store.set(collection.id, sidebar);\n }\n return store;\n}\n\n/** @visibleForTesting */\nasync function processCollection(\n collection: Collection,\n contentDir: string,\n logger: Logger,\n): Promise<SidebarType> {\n const items: SidebarItemType[] = [];\n for (const item of collection.items) {\n items.push(await processItem(item, contentDir, logger));\n }\n const defaultLink = resolveDefaultLink(items, collection.defaultLink);\n if (!defaultLink) {\n throw new PrestigeError(\n `No default link found in collection, it means there are no links in the collection. Please define one in ${collection.id}`,\n );\n }\n return {\n items,\n defaultLink: defaultLink,\n navigation: computeNavigation(items),\n };\n}\n\n/** @visibleForTesting */\nasync function processItem(\n item: CollectionItem,\n contentDir: string,\n logger: Logger,\n): Promise<SidebarItemType> {\n if (typeof item === \"string\" || \"slug\" in item) {\n return resolveInternalSidebarLink(\n item as InternalCollectionLink,\n contentDir,\n );\n } else if (\"link\" in item) {\n return resolveSidebarLink(item, contentDir);\n } else {\n return resolveSidebarGroup(item as CollectionGroup, contentDir, logger);\n }\n}\n\n/** @visibleForTesting */\nasync function resolveSidebarGroup(\n group: CollectionGroup,\n contentDir: string,\n logger: Logger,\n): Promise<SidebarGroupType> {\n const label = await resolveLabel(group, contentDir);\n const items: SidebarItemType[] = [];\n\n if (group.items?.length && group.autogenerate) {\n logger.warn(\n `${group.label} has both items and autogenerate. Only items will be used.`,\n );\n }\n\n if (group.items) {\n for (const childItem of group.items) {\n items.push(await processItem(childItem, contentDir, logger));\n }\n } else if (group.autogenerate?.directory) {\n const generatedItems = await autogenerateSidebar(\n group.autogenerate.directory,\n contentDir,\n logger,\n );\n items.push(...generatedItems);\n }\n\n return {\n label,\n collapsed: group.collapsed,\n items,\n };\n}\n\n/** @visibleForTesting */\nasync function resolveInternalSidebarLink(\n item: InternalCollectionLink,\n contentDir: string,\n): Promise<InternalSidebarLinkType> {\n const label = await resolveLabel(item, contentDir);\n const slug = resolveSlug(item);\n\n if (slug.startsWith(\"/\") || slug.endsWith(\"/\")) {\n throw new PrestigeError(\n `The slug ${slug} cannot start or end with a slash. Remove it and try again.`,\n );\n }\n\n if (!slug) {\n throw new PrestigeError(\n `The slug cannot be empty. Remove it and try again. link label is ${label}`,\n );\n }\n\n return {\n label,\n slug,\n };\n}\n\n/** @visibleForTesting */\nasync function resolveSidebarLink(\n item: ExternalSidebarLinkType,\n contentDir: string,\n): Promise<ExternalSidebarLinkType> {\n const label = await resolveLabel(item, contentDir);\n const link = resolveLink(item);\n\n if (!link) {\n throw new PrestigeError(\n `The link cannot be empty. Remove it and try again. link label is ${label}`,\n );\n }\n\n return {\n label,\n link,\n };\n}\n\n/** @visibleForTesting */\nasync function autogenerateSidebar(\n directory: string,\n contentDir: string,\n logger: Logger,\n): Promise<SidebarItemType[]> {\n const fileExtRegex = /\\.mdx?$/i;\n\n const items: SidebarItemType[] = [];\n const dirPath = join(contentDir, directory);\n if (!(await pathExists(dirPath))) {\n logger.warn(`Directory doesn't exist: ${directory}`);\n return [];\n }\n\n const dirents = await readdir(dirPath, { withFileTypes: true });\n dirents.sort((a, b) => a.name.localeCompare(b.name));\n for (const dirent of dirents) {\n if (dirent.isDirectory()) {\n const subDir = join(directory, dirent.name);\n const group: CollectionGroup = {\n label: dirent.name,\n autogenerate: { directory: subDir },\n };\n items.push(await resolveSidebarGroup(group, contentDir, logger));\n } else if (dirent.isFile() && fileExtRegex.test(dirent.name)) {\n const fullPath = join(directory, dirent.name);\n const slug = fullPath.replace(fileExtRegex, \"\");\n items.push(await resolveInternalSidebarLink(slug, contentDir));\n }\n }\n return items;\n}\n\n/** @visibleForTesting */\nasync function resolveLabel(\n item: CollectionItem,\n contentDir: string,\n): Promise<string> {\n if (typeof item !== \"string\" && \"label\" in item && item.label) {\n return item.label;\n }\n\n if (typeof item === \"string\" || \"slug\" in item) {\n const slug = resolveSlug(item);\n\n const file = await getFileBySlug(slug, contentDir);\n if (!file) {\n throw new PrestigeError(\n `markdown file not found with slug: ${slug} add one in content folder or update config`,\n );\n }\n const data = (await compileFrontmatter(file)) as any;\n if (data?.label) {\n return data?.label;\n }\n\n return basename(slug);\n }\n\n // is a group\n if (typeof item !== \"string\" && (\"items\" in item || \"autogenerate\" in item)) {\n return item.label;\n }\n\n return \"\";\n}\n\n/** @visibleForTesting */\nexport function resolveSlug(item: CollectionItem) {\n if (typeof item === \"string\") {\n return item;\n } else {\n if (\"slug\" in item) {\n return item.slug;\n }\n return \"\";\n }\n}\n\n/** @visibleForTesting */\nexport function resolveLink(item: CollectionItem) {\n if (typeof item === \"object\" && \"link\" in item) {\n return item.link;\n }\n return \"\";\n}\n","import { mkdir, readdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { SidebarLinkType } from \"../core/content/content.types\";\nimport { Logger } from \"../utils/logger\";\n\nexport async function compileRoutes(\n linksMap: Map<string, SidebarLinkType[]>,\n routesDir: string,\n logger: Logger,\n) {\n const prestigePath = \"(prestige)\";\n const prestigeFullPath = join(routesDir, prestigePath);\n\n try {\n await mkdir(prestigeFullPath, { recursive: true });\n\n const generatedFiles = new Map<string, string>();\n\n for (const [key, links] of linksMap) {\n const onlyInternalLinks = links.filter((l) => \"slug\" in l);\n \n const sidebarPath = key;\n const sidebarFile = sidebarPath + \".lazy.tsx\";\n generatedFiles.set(sidebarFile, createLayoutRoute(key));\n\n for (const l of onlyInternalLinks) {\n const pathified = l.slug.replaceAll(\"/\", \".\");\n generatedFiles.set(pathified + \".tsx\", createContentHeadRoute(l.slug));\n generatedFiles.set(pathified + \".lazy.tsx\", createContentRoute(l.slug));\n }\n }\n\n // Write files only if they have changed or do not exist\n await Promise.all(\n [...generatedFiles.entries()].map(async ([fileName, contents]) => {\n const filePath = join(prestigeFullPath, fileName);\n try {\n const existingContent = await readFile(filePath, \"utf-8\");\n if (existingContent === contents) {\n return; // Skip writing if identical\n }\n } catch (e) {\n // File doesn't exist yet, proceed to write\n }\n logger.info(`Writing route file: ${fileName}`);\n return writeFile(filePath, contents);\n }),\n );\n\n const existingFiles = await readdir(prestigeFullPath);\n const staleLazyFiles = existingFiles.filter(\n (fileName) =>\n fileName.endsWith(\".lazy.tsx\") && !generatedFiles.has(fileName),\n );\n const staleHeadFiles = staleLazyFiles\n .map((fileName) => fileName.replace(\".lazy.tsx\", \".tsx\"))\n .filter(\n (fileName) =>\n existingFiles.includes(fileName) && !generatedFiles.has(fileName),\n );\n const staleFiles = [...new Set([...staleLazyFiles, ...staleHeadFiles])];\n\n await Promise.all(\n staleFiles.map((fileName) => {\n logger.debug(`Removing stale route file: ${fileName}`);\n return unlink(join(prestigeFullPath, fileName));\n }),\n );\n } catch (error) {\n logger.error(\n `[Prestige Router Compiler] Failed to compile routes: ${error}`,\n );\n console.error(\n \"[Prestige Router Compiler] Failed to compile routes:\",\n error,\n );\n }\n}\n\nfunction createLayoutRoute(id: string) {\n return (\n `\nimport { createLazyFileRoute } from '@tanstack/react-router';\nimport sidebar from \"virtual:prestige/sidebar/${id}\";\nimport { CollectionRoute } from \"@lonik/prestige/ui\";\n\nexport const Route = createLazyFileRoute('/(prestige)/${id}')(CollectionRoute(sidebar, \"${id}\"));\n`.trim() + \"\\n\"\n );\n}\n\nfunction createContentHeadRoute(slug: string) {\n return (\n `\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport * as contentData from \"virtual:prestige/content/${slug}\";\nimport { ContentRoute } from \"@lonik/prestige/ui\";\n\nexport const Route = createFileRoute('/(prestige)/${slug}')(ContentRoute(contentData));\n`.trim() + \"\\n\"\n );\n}\n\nfunction createContentRoute(slug: string) {\n return (\n `\nimport { createLazyFileRoute } from \"@tanstack/react-router\";\nimport * as contentData from \"virtual:prestige/content/${slug}\";\nimport { LazyContentRoute } from \"@lonik/prestige/ui\";\n\nexport const Route = createLazyFileRoute('/(prestige)/${slug}')(LazyContentRoute(contentData));\n`.trim() + \"\\n\"\n );\n}\n","import { genDynamicImport } from \"knitwork\";\n\nexport function genExportDefault(specifier: string) {\n return `export default ${specifier};`;\n}\n\n/** exports default undefined */\nexport function genExportUndefined() {\n return genExportDefault(\"undefined\");\n}\n\nexport function genDynamicImportWithDefault(specifier: string) {\n return `${genDynamicImport(specifier)}.then(m => m.default)`;\n}\n","import { genArrayFromRaw, genObjectFromValues } from \"knitwork\";\nimport { genExportDefault } from \"../../utils/code-generation\";\nimport { PrestigeError } from \"../../utils/errors\";\nimport {\n CollectionNavigation,\n Collections,\n SidebarLinkType,\n} from \"./content.types\";\n\nexport const COLLECTION_VIRTUAL_ID = \"virtual:prestige/collection-all\";\n\nexport function resolveCollectionNavigations(\n inlineCollections: Collections,\n linksMap: Map<string, SidebarLinkType[]>,\n) {\n const collections: CollectionNavigation[] = inlineCollections.map((c) => ({\n id: c.id,\n label: c.label ?? c.id,\n defaultLink: c.defaultLink ?? \"\",\n }));\n if (collections.length === 0) {\n throw new PrestigeError(\n `No collections found, add one in prestige plugin config`,\n );\n }\n\n for (const coll of collections) {\n const links = linksMap.get(coll.id);\n const firstInternalLink = links?.find(l => \"slug\" in l);\n if (coll.defaultLink || !firstInternalLink) {\n continue;\n }\n coll.defaultLink = firstInternalLink.slug;\n }\n\n for (const coll of collections) {\n if (!coll.defaultLink) {\n console.warn(\n `No default link found for collection ${coll.id}, it won't be displayed in the header navigation`,\n );\n }\n }\n\n const validCollections = collections.filter((c) => c.defaultLink);\n\n return genExportDefault(\n genArrayFromRaw(validCollections.map((c) => genObjectFromValues(c))),\n );\n}\n","import pc from \"picocolors\";\nexport interface Logger {\n debug: (message: string) => void;\n info: (message: string) => void;\n warn: (message: string) => void;\n error: (message: string) => void;\n}\n\nexport function createLogger(config: {\n disabled: boolean;\n debug: boolean;\n}): Logger {\n function formatLogArgs(message: string) {\n const now = new Date();\n\n // Format: 11:14:22 PM\n const timestamp = now.toLocaleTimeString(\"en-US\", {\n hour12: true,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n\n // Vite's signature: Gray timestamp + Bold Cyan tag\n const fullMessage = `${pc.dim(timestamp)} ${pc.bold(pc.cyan(\"[prestige]\"))} ${message}`;\n return fullMessage;\n }\n\n return {\n debug: (message: string) => {\n if (!config.disabled && config.debug)\n console.debug(formatLogArgs(pc.gray(message)));\n },\n info: (message: string) => {\n if (!config.disabled) console.info(formatLogArgs(pc.reset(message)));\n },\n warn: (message: string) => {\n if (!config.disabled) console.warn(formatLogArgs(pc.yellow(message)));\n },\n error: (message: string) => {\n if (!config.disabled) console.error(formatLogArgs(pc.red(message)));\n },\n };\n}\n\nexport default createLogger;\n","import chokidar from \"chokidar\";\nimport debounce from \"debounce\";\n\nexport function initContentWatcher(contentDir: string, onUpdate: () => void) {\n const UPDATE_INTERVAL = 1000;\n const scheduleUpdate = debounce(onUpdate, UPDATE_INTERVAL);\n\n const watcher = chokidar\n .watch(contentDir, {\n awaitWriteFinish: true,\n ignoreInitial: true,\n })\n .on(\"all\", (event) => {\n if (event !== \"add\" && event !== \"unlink\") {\n return;\n }\n\n // Coalesce bursts of filesystem events into one update run per interval.\n scheduleUpdate();\n });\n\n return () => {\n scheduleUpdate.clear();\n return watcher.close();\n };\n}\n","import { join } from \"pathe\";\nimport picomatch, { type Matcher } from \"picomatch\";\nimport { EnvironmentModuleNode, type Plugin } from \"vite\";\nimport { resolvePrestigeConfig } from \"./config/config\";\nimport { PrestigeConfig, PrestigeConfigInput } from \"./config/config.types\";\n\nimport { genObjectFromValues } from \"knitwork\";\nimport { resolveContentLinks } from \"./content/content-links\";\nimport {\n resolveSidebars,\n SIDEBAR_VIRTUAL_ID,\n} from \"./content/content-sidebar.store\";\nimport {\n CONTENT_VIRTUAL_ID,\n getSlugByPath,\n resolveContent,\n} from \"./content/content.store\";\nimport { compileRoutes } from \"./content/router-compiler\";\nimport {\n COLLECTION_VIRTUAL_ID,\n resolveCollectionNavigations,\n} from \"./core/content/content-collection.store\";\nimport {\n Collections,\n SidebarLinkType,\n SidebarType,\n} from \"./core/content/content.types\";\nimport { genExportDefault, genExportUndefined } from \"./utils/code-generation\";\nimport { extractVirtualId } from \"./utils/file-utils\";\nimport { createLogger, Logger } from \"./utils/logger\";\nimport { initContentWatcher } from \"./content/content-watcher\";\n\nexport const CONFIG_VIRTUAL_ID = \"virtual:prestige/config\";\n\nexport default function prestige(inlineConfig?: PrestigeConfigInput): Plugin {\n let config: PrestigeConfig;\n let contentDir: string;\n let isDocsMatcher: Matcher;\n let collections: Collections = [];\n let linksMap: Map<string, SidebarLinkType[]>;\n let collectionNavigations: string;\n let sidebarsMap: Map<string, SidebarType>;\n let logger: Logger;\n\n return {\n name: \"vite-plugin-prestige\",\n enforce: \"pre\",\n async configResolved(resolvedConfig) {\n const { config: loadedConfig } = await resolvePrestigeConfig(\n inlineConfig,\n resolvedConfig.root,\n );\n\n config = loadedConfig;\n logger = createLogger({\n disabled: config.disableLog,\n debug: config.enableDebugLog,\n });\n\n contentDir = join(resolvedConfig.root, \"src/content\");\n isDocsMatcher = picomatch(join(contentDir, \"**/*.{md,mdx}\"));\n collections = config.collections ?? [];\n\n logger.debug(\"Resolving sidebars...\");\n sidebarsMap = await resolveSidebars(collections, contentDir, logger);\n\n logger.debug(\"Resolving content links...\");\n linksMap = resolveContentLinks(sidebarsMap);\n\n logger.debug(\"Resolving collection navigations....\");\n collectionNavigations = resolveCollectionNavigations(\n collections,\n linksMap,\n );\n const routesDir = join(resolvedConfig.root, \"src\", \"routes\");\n\n logger.debug(\"Compiling routes...\");\n await compileRoutes(linksMap, routesDir, logger);\n },\n configureServer(server) {\n const contentWatcher = initContentWatcher(contentDir, () => {\n server.restart();\n });\n server.httpServer?.on(\"close\", () => {\n contentWatcher();\n });\n },\n resolveId(id) {\n // even though the import will be import * from \"virtual:prestige/docs/introduction\"\n // it is not guaranteed that some other plugin doesn't modify this import and attach full path\n // we call extractVirtualId to trim the import\n\n if (id.includes(CONFIG_VIRTUAL_ID)) {\n logger.debug(`Resolving config virtual ID: ${id}`);\n return extractVirtualId(id, CONFIG_VIRTUAL_ID);\n }\n\n if (id.includes(CONTENT_VIRTUAL_ID)) {\n logger.debug(`Resolving content virtual ID: ${id}`);\n return extractVirtualId(id, CONTENT_VIRTUAL_ID);\n }\n\n if (id.includes(COLLECTION_VIRTUAL_ID)) {\n logger.debug(`Resolving collection virtual ID: ${id}`);\n return extractVirtualId(id, COLLECTION_VIRTUAL_ID);\n }\n\n if (id.includes(SIDEBAR_VIRTUAL_ID)) {\n logger.debug(`Resolving sidebar virtual ID: ${id}`);\n return extractVirtualId(id, SIDEBAR_VIRTUAL_ID);\n }\n\n return null;\n },\n async load(id) {\n if (id === `\\0${CONFIG_VIRTUAL_ID}`) {\n logger.debug(`Loading config virtual module: ${id}`);\n return genExportDefault(JSON.stringify(config));\n }\n if (id.includes(CONTENT_VIRTUAL_ID)) {\n logger.debug(`Loading content virtual module: ${id}`);\n return await resolveContent(id, linksMap, contentDir);\n }\n if (id.includes(COLLECTION_VIRTUAL_ID)) {\n logger.debug(`Loading collection virtual module: ${id}`);\n return collectionNavigations;\n }\n\n if (id.includes(SIDEBAR_VIRTUAL_ID)) {\n logger.debug(`Loading sidebar virtual module: ${id}`);\n const sidebarId = id.replace(SIDEBAR_VIRTUAL_ID, \"\").replace(\"\\0\", \"\");\n const sidebar = sidebarsMap.get(sidebarId);\n if (!sidebar) {\n return genExportUndefined();\n }\n return genExportDefault(genObjectFromValues(sidebar));\n }\n\n return null;\n },\n\n async hotUpdate({ file, timestamp, type }) {\n if (type !== \"update\" || !isDocsMatcher(file)) {\n return;\n }\n logger.debug(`Invalidating module ${file}...`);\n const invalidatedModules = new Set<EnvironmentModuleNode>();\n const slug = getSlugByPath(file, contentDir);\n const virtualModuleId = `\\0${CONTENT_VIRTUAL_ID}${slug}`;\n const module =\n this.environment.moduleGraph.getModuleById(virtualModuleId);\n if (module) {\n this.environment.moduleGraph.invalidateModule(\n module,\n invalidatedModules,\n timestamp,\n true,\n );\n logger.debug(`Reloading application...`);\n this.environment.hot.send({ type: \"full-reload\" });\n }\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"vite.js","names":["CollectionGroupSchema: z.ZodType<CollectionGroup, CollectionGroup>","CollectionItemSchema: z.ZodType<CollectionItem, CollectionItem>","sidebarLinks: SidebarLinkType[]","processItem","data","typeMap: Record<\"note\" | \"tip\" | \"caution\" | \"danger\", string>","titleChildren: any[]","toc: TocItem[]","prev: SiblingNavigationType | undefined","next: SiblingNavigationType | undefined","join","navigation: Record<string, NavigationLinks>","items: SidebarItemType[]","group: CollectionGroup","join","collections: CollectionNavigation[]","config: PrestigeConfig","contentDir: string","isDocsMatcher: Matcher","collections: Collections","linksMap: Map<string, SidebarLinkType[]>","collectionNavigations: string","sidebarsMap: Map<string, SidebarType>","logger: Logger"],"sources":["../src/vite/utils/errors.ts","../src/vite/core/content/content.types.ts","../src/vite/config/config.types.ts","../src/vite/utils/file-utils.ts","../src/vite/config/config.ts","../src/vite/content/content-links.ts","../src/vite/content/content-compiler.ts","../src/vite/content/content.store.ts","../src/vite/content/content-sidebar.store.ts","../src/vite/content/content-watcher.ts","../src/vite/content/router-compiler.ts","../src/vite/utils/code-generation.ts","../src/vite/core/content/content-collection.store.ts","../src/vite/utils/logger.ts","../src/vite/plugin.ts"],"sourcesContent":["import { type ZodType, input } from \"zod\";\n\nexport class PrestigeError extends Error {}\n\n/**\n * Parse data with zod schema and if fails throw PrestigeError that is friendly error\n * for prestige ecosystem\n */\nexport function parseWithFriendlyErrors<T extends ZodType>(s: T, input: input<T>, message: string) {\n try {\n return s.parse(input);\n } catch (e) {\n if (e instanceof Error) {\n throw new PrestigeError(`Prestige error cause: ${message}, with error: ${e.message} `);\n } else {\n throw new PrestigeError(`Prestige error cause: ${message} `);\n }\n }\n}\n","import { z } from \"zod\";\n\nexport const ContentHeadFrontmatterSchema = z.object({\n meta: z.array(z.record(z.string(), z.any())).optional(),\n links: z.array(z.record(z.string(), z.any())).optional(),\n styles: z.array(z.record(z.string(), z.any())).optional(),\n scripts: z.array(z.record(z.string(), z.any())).optional(),\n});\n\nexport type ContentHeadFrontmatterType = z.infer<\n typeof ContentHeadFrontmatterSchema\n>;\n\nexport const ContentFrontmatterSchema = z.object({\n title: z.string().describe(\"The title of the article\"),\n description: z.string().optional().describe(\"The description of the article\"),\n label: z.string().optional().describe(\"The label of the content\"),\n head: ContentHeadFrontmatterSchema.optional(),\n});\n\nexport type ContentFrontmatterType = z.infer<typeof ContentFrontmatterSchema>;\n\nexport const ContentSchema = z.object({\n matter: ContentFrontmatterSchema,\n html: z.string().describe(\"The html of the content\"),\n});\n\nexport type ContentType = z.infer<typeof ContentSchema>;\n\nconst InternalCollectionLinkSchema = z.union([\n z.object({\n label: z.string(),\n slug: z.string(),\n }),\n z.string(),\n]);\n\nconst ExternalCollectionLinkSchema = z.object({\n label: z.string(),\n link: z.string(),\n});\n\nexport type ExternalCollectionLink = z.infer<\n typeof ExternalCollectionLinkSchema\n>;\n\nexport type InternalCollectionLink = z.infer<\n typeof InternalCollectionLinkSchema\n>;\n\nexport type CollectionGroup = {\n label: string;\n items?: CollectionItem[] | undefined;\n collapsed?: boolean | undefined;\n autogenerate?: { directory: string } | undefined;\n};\n\nexport type CollectionItem =\n | InternalCollectionLink\n | CollectionGroup\n | ExternalCollectionLink;\n\nconst CollectionGroupSchema: z.ZodType<CollectionGroup, CollectionGroup> =\n z.object({\n label: z.string(),\n items: z.lazy(() => z.array(CollectionItemSchema)).optional(),\n collapsed: z.boolean().optional(),\n autogenerate: z\n .object({\n directory: z.string(),\n })\n .optional(),\n });\n\nconst CollectionItemSchema: z.ZodType<CollectionItem, CollectionItem> = z.union(\n [\n ExternalCollectionLinkSchema,\n InternalCollectionLinkSchema,\n z.lazy(() => CollectionGroupSchema),\n ],\n);\n\nexport const CollectionSchema = z.object({\n id: z\n .string()\n .min(1, { message: \"Folder name cannot be empty\" })\n .max(50, { message: \"Folder name too long\" })\n // Allows alphanumeric, hyphens, and underscores\n .regex(/^[a-zA-Z0-9-_]+$/, {\n message: \"Only alphanumeric, hyphens, and underscores allowed\",\n })\n .describe(\"The id of the collection, must match the folder name\"),\n items: z.array(CollectionItemSchema),\n label: z.string().optional().describe(\"The label of the collection\"),\n defaultLink: z\n .string()\n .optional()\n .describe(\"The default link of the collection\"),\n});\n\nexport type Collection = z.infer<typeof CollectionSchema>;\n\nexport type CollectionNavigation = {\n id: string;\n label: string;\n defaultLink?: string;\n};\n\nexport type CollectionInput = z.input<typeof CollectionSchema>;\n\nexport const CollectionsSchema = z.array(CollectionSchema);\n\nexport type Collections = z.infer<typeof CollectionsSchema>;\n\nexport interface InternalSidebarLinkType {\n slug: string;\n label: string;\n}\n\nexport interface ExternalSidebarLinkType {\n label: string;\n link: string;\n}\n\nexport type SidebarLinkType = InternalSidebarLinkType | ExternalSidebarLinkType;\n\nexport interface SidebarGroupType {\n label: string;\n items: SidebarItemType[];\n collapsed?: boolean | undefined;\n}\n\nexport type SidebarItemType =\n | InternalSidebarLinkType\n | SidebarGroupType\n | ExternalSidebarLinkType;\n\nexport interface SidebarType {\n items: SidebarItemType[];\n defaultLink: string;\n navigation: Record<string, NavigationLinks>;\n}\n\nexport interface SiblingNavigationType {\n label: string;\n link: string;\n}\n\nexport interface NavigationLinks {\n prev: SiblingNavigationType | null | undefined;\n next: SiblingNavigationType | null | undefined;\n}\n","import { FlexibleTocOptions } from \"remark-flexible-toc\";\nimport type { Options as RemarkGfmOptions } from \"remark-gfm\";\nimport { PluggableList } from \"unified\";\nimport { z } from \"zod\";\nimport { CollectionsSchema } from \"../core/content/content.types\";\n\nexport const PrestigeConfigSchema = z.object({\n title: z.string().describe(\"Title of the website\"),\n disableLog: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Disable logger, default is false\"),\n enableDebugLog: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Enable debug log, default is false\"),\n collections: CollectionsSchema,\n markdown: z\n .object({\n gfmOptions: z\n .custom<RemarkGfmOptions>()\n .optional()\n .describe(\"Options for remark-gfm\"),\n rehypePlugins: z\n .custom<PluggableList>()\n .optional()\n .describe(\"Additional rehype plugins\"),\n remarkPlugins: z\n .custom<PluggableList>()\n .optional()\n .describe(\"Additional remark plugins\"),\n remarkFlexibleToc: z\n .custom<FlexibleTocOptions>()\n .optional()\n .describe(\"Options for remark-flexible-toc\"),\n rehypeSlug: z\n .custom<{\n prefix?: string;\n }>()\n .optional()\n .describe(\"Options for rehype-slug\"),\n })\n .optional()\n .describe(\"Markdown options, configure how markdown is parsed\"),\n});\n\nexport type PrestigeConfigInput = z.input<typeof PrestigeConfigSchema>;\nexport type PrestigeConfig = z.infer<typeof PrestigeConfigSchema>;\n","import { mkdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"pathe\";\n\nexport async function pathExists(path: string) {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(dirPath: string) {\n await mkdir(dirPath, { recursive: true });\n}\n\nexport async function outputFile(\n filePath: string,\n data: string | NodeJS.ArrayBufferView,\n) {\n const dir = dirname(filePath);\n\n // recursive: true won't throw if the dir already exists\n await mkdir(dir, { recursive: true });\n await writeFile(filePath, data);\n}\n\nexport async function rmSafe(path: string) {\n try {\n await rm(path, { recursive: true, force: true });\n return true;\n } catch {\n return false;\n }\n}\n\n// Helper function to extract the virtual ID from a messy path\nexport function extractVirtualId(fullId: string, virtualPrefix: string) {\n const startIndex = fullId.indexOf(virtualPrefix);\n if (startIndex !== -1) {\n // Slice from the start of the virtual prefix to the end of the string\n return \"\\0\" + fullId.slice(startIndex);\n }\n return null;\n}\n","import { parseWithFriendlyErrors, PrestigeError } from \"../utils/errors\";\nimport { PrestigeConfigInput, PrestigeConfigSchema } from \"./config.types\";\nimport { join } from \"pathe\";\nimport { pathExists } from \"../utils/file-utils\";\n\nexport function validateConfig(config: PrestigeConfigInput) {\n return parseWithFriendlyErrors(PrestigeConfigSchema, config, \"Invalid schema\");\n}\n\nexport async function resolvePrestigeConfig(\n configInput: PrestigeConfigInput | undefined,\n root: string,\n) {\n if (!configInput) {\n throw new PrestigeError(\"Prestige config is required\");\n }\n\n const validatedConfig = validateConfig(configInput);\n const docsDirPath = join(root, \"src/content\");\n\n if (!(await pathExists(docsDirPath))) {\n throw new PrestigeError(`Docs! directory not found: ${docsDirPath}`);\n }\n\n return { config: validatedConfig, fullDocsDir: docsDirPath };\n}\n","import { SidebarLinkType, SidebarItemType, SidebarType } from \"../core/content/content.types\";\n\nexport function resolveContentLinks(sidebars: Map<string, SidebarType>) {\n const links = new Map<string, SidebarLinkType[]>();\n for (const [key, sidebar] of sidebars) {\n const sidebarLinks: SidebarLinkType[] = [];\n for (const item of sidebar.items) {\n processItem(item, sidebarLinks);\n }\n links.set(key, sidebarLinks);\n }\n return links;\n}\n\nfunction processItem(item: SidebarItemType, links: SidebarLinkType[] = []) {\n if (\"slug\" in item || \"link\" in item) {\n links.push(item);\n } else if (\"items\" in item) {\n for (const childItem of item.items) {\n processItem(childItem, links);\n }\n }\n return links;\n}\n","import { compile } from \"@mdx-js/mdx\";\nimport rehypePrism from \"rehype-prism-plus\";\nimport rehypeSlug from \"rehype-slug\";\nimport remarkDirective from \"remark-directive\";\nimport remarkFlexibleToc, { TocItem } from \"remark-flexible-toc\";\nimport remarkFrontmatter from \"remark-frontmatter\";\nimport remarkGfm from \"remark-gfm\";\nimport { PluggableList } from \"unified\";\nimport { Compatible, VFile } from \"vfile\";\nimport matter from \"gray-matter\";\nimport { PrestigeConfig } from \"../config/config.types\";\n\nimport { h } from \"hastscript\";\nimport type { Node } from \"unist\";\nimport { visit } from \"unist-util-visit\";\n\nexport default function remarkAdmonitions() {\n return (tree: Node) => {\n visit(tree, (node: any) => {\n if (\n node.type === \"textDirective\" ||\n node.type === \"leafDirective\" ||\n node.type === \"containerDirective\"\n ) {\n if (node.type !== \"containerDirective\") {\n const data = node.data || (node.data = {});\n const hast = h(node.type === \"textDirective\" ? \"span\" : \"aside\", {\n className: [\"admonition\", `admonition-${node.name}`],\n ...node.attributes,\n });\n data.hName = hast.tagName;\n data.hProperties = hast.properties;\n return;\n }\n\n const type = [\"note\", \"tip\", \"caution\", \"danger\"].includes(node.name)\n ? node.name\n : \"note\";\n\n const typeMap: Record<\"note\" | \"tip\" | \"caution\" | \"danger\", string> = {\n note: \"bg-blue-50/50 dark:bg-blue-900/20 border-blue-500 text-blue-900 dark:text-blue-200\",\n tip: \"bg-purple-50/50 dark:bg-purple-900/20 border-purple-500 text-purple-900 dark:text-purple-200\",\n caution:\n \"bg-yellow-50/50 dark:bg-yellow-900/20 border-yellow-500 text-yellow-900 dark:text-yellow-200\",\n danger:\n \"bg-red-50/50 dark:bg-red-900/20 border-red-500 text-red-900 dark:text-red-200\",\n };\n\n const data = node.data || (node.data = {});\n data.hName = \"aside\";\n data.hProperties = {\n \"aria-label\": type.charAt(0).toUpperCase() + type.slice(1),\n className: [\n \"relative\",\n \"my-6\",\n \"px-4\",\n \"py-3\",\n \"border-l-4\",\n \"rounded-lg\",\n ...(typeMap[type as keyof typeof typeMap] || typeMap[\"note\"]).split(\n \" \",\n ),\n ],\n ...node.attributes,\n };\n\n let titleNodeIndex = node.children.findIndex(\n (c: any) => c.data?.directiveLabel,\n );\n let titleChildren: any[];\n\n if (titleNodeIndex !== -1) {\n titleChildren = node.children[titleNodeIndex].children;\n node.children.splice(titleNodeIndex, 1);\n } else {\n titleChildren = [\n {\n type: \"text\",\n value: type.charAt(0).toUpperCase() + type.slice(1),\n },\n ];\n }\n\n const getIconHast = (t: string) => {\n const props = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: \"2\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n className: [\"w-5\", \"h-5\", \"flex-shrink-0\"],\n };\n if (t === \"note\")\n return h(\"svg\", props, [\n h(\"circle\", { cx: \"12\", cy: \"12\", r: \"10\" }),\n h(\"path\", { d: \"M12 16v-4\" }),\n h(\"path\", { d: \"M12 8h.01\" }),\n ]);\n if (t === \"tip\")\n return h(\"svg\", props, [\n h(\"path\", {\n d: \"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\",\n }),\n h(\"path\", {\n d: \"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\",\n }),\n h(\"path\", { d: \"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\" }),\n h(\"path\", { d: \"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" }),\n ]);\n if (t === \"caution\")\n return h(\"svg\", props, [\n h(\"path\", {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\",\n }),\n h(\"path\", { d: \"M12 9v4\" }),\n h(\"path\", { d: \"M12 17h.01\" }),\n ]);\n if (t === \"danger\")\n return h(\"svg\", props, [\n h(\"polygon\", {\n points:\n \"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\",\n }),\n h(\"path\", { d: \"M12 8v4\" }),\n h(\"path\", { d: \"M12 16h.01\" }),\n ]);\n return null;\n };\n\n const titleBlock = {\n type: \"paragraph\",\n data: {\n hName: \"p\",\n hProperties: {\n className: [\n \"flex\",\n \"items-center\",\n \"gap-2\",\n \"mb-2\",\n \"mt-0\",\n \"font-bold\",\n \"text-lg\",\n ],\n },\n },\n children: [\n {\n type: \"text\",\n value: \"\",\n data: { hName: \"span\", hChildren: [getIconHast(type)] },\n },\n ...titleChildren,\n ],\n };\n\n const contentBlock = {\n type: \"paragraph\",\n data: {\n hName: \"section\",\n hProperties: {\n className: [\n \"[&>p]:mt-0\",\n \"[&>p]:mb-2\",\n \"[&>p:last-child]:mb-0\",\n ],\n },\n },\n children: node.children,\n };\n\n node.children = [titleBlock, contentBlock];\n }\n });\n };\n}\n\nexport function rehypeAddNotProseToPre() {\n return (tree: Node) => {\n visit(tree, (node: any) => {\n // Look specifically for HTML elements that are <pre> tags\n if (node.type === \"element\" && node.tagName === \"pre\") {\n node.properties = node.properties || {};\n\n // HAST classNames are generally arrays of strings\n const currentClass = node.properties.className || [];\n node.properties.className = Array.isArray(currentClass)\n ? [...currentClass, \"not-prose\"]\n : [currentClass, \"not-prose\"];\n }\n });\n };\n}\n\nexport async function compileMarkdown(\n content: Readonly<Compatible>,\n baseUrl: string,\n options?: PrestigeConfig[\"markdown\"],\n) {\n const toc: TocItem[] = [];\n\n const rehypePlugins: PluggableList = [\n ...(options?.rehypePlugins ?? []),\n rehypeSlug,\n [rehypePrism, { options: { showLineNumbers: false } }],\n rehypeAddNotProseToPre,\n ];\n\n const remarkPlugins: PluggableList = [\n ...(options?.remarkPlugins ?? []),\n remarkFrontmatter,\n [remarkGfm, options?.gfmOptions || {}],\n remarkDirective,\n remarkAdmonitions,\n [remarkFlexibleToc, { tocRef: toc }],\n ];\n\n const code = await compile(content, {\n outputFormat: \"program\",\n rehypePlugins,\n remarkPlugins,\n baseUrl: baseUrl,\n });\n return { code: String(code), toc };\n}\n\nexport async function compileFrontmatter(vFile: VFile) {\n const result = matter(String(vFile.value));\n return result.data || {};\n}\n\nexport function warmupCompiler(options?: PrestigeConfig[\"markdown\"]) {\n compileMarkdown(\"```js\\n```\", \"http://localhost\", options).catch(() => {});\n}\n","import { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { parse, relative } from \"pathe\";\nimport { glob } from \"tinyglobby\";\nimport { read } from \"to-vfile\";\nimport {\n SiblingNavigationType,\n SidebarLinkType,\n} from \"../core/content/content.types\";\nimport { compileMarkdown } from \"./content-compiler\";\n\nimport { PrestigeError } from \"../utils/errors\";\nimport { compileFrontmatter } from \"./content-compiler\";\n\nexport const CONTENT_VIRTUAL_ID = \"virtual:prestige/content/\";\n\nfunction getSiblingLink(\n link: SidebarLinkType | undefined,\n): SiblingNavigationType | undefined {\n if (!link) {\n return undefined;\n }\n return {\n label: link.label,\n link: \"slug\" in link ? link.slug : link.link,\n };\n}\n\nexport function resolveSiblings(\n base: string,\n slug: string,\n linksMap: Map<string, SidebarLinkType[]>,\n) {\n const links = linksMap.get(base);\n if (!links?.length) {\n return { prev: undefined, next: undefined };\n }\n\n const validLinks = links.filter((l) => {\n if (\"slug\" in l) return true;\n if (\"link\" in l) {\n return !l.link.startsWith(\"http://\") && !l.link.startsWith(\"https://\");\n }\n return false;\n });\n\n const linkIndex = validLinks.findIndex((link) => {\n return (\n (\"slug\" in link && link.slug === slug) ||\n (\"link\" in link && link.link === slug)\n );\n });\n\n let prev: SiblingNavigationType | undefined;\n let next: SiblingNavigationType | undefined;\n\n if (linkIndex !== -1) {\n if (linkIndex > 0) {\n prev = getSiblingLink(validLinks[linkIndex - 1]);\n }\n if (linkIndex < validLinks.length - 1) {\n next = getSiblingLink(validLinks[linkIndex + 1]);\n }\n }\n\n return { prev, next };\n}\n\nexport async function resolveMarkdown(slug: string, contentDir: string) {\n const filePath = await getPathBySlug(slug, contentDir);\n const baseUrl = pathToFileURL(filePath).href;\n const file = await read(filePath);\n const frontmatter = await compileFrontmatter(file);\n const { code, toc } = await compileMarkdown(file, baseUrl);\n return { code, toc, frontmatter };\n}\n\nexport async function resolveContent(\n id: string,\n linksMap: Map<string, SidebarLinkType[]>,\n contentDir: string,\n) {\n const slug = id.replace(CONTENT_VIRTUAL_ID, \"\").replace(\"\\0\", \"\");\n const base = slug.split(\"/\")[0] as string;\n\n const { prev, next } = resolveSiblings(base, slug, linksMap);\n const { toc, code, frontmatter } = await resolveMarkdown(slug, contentDir);\n let resolvedCode = code;\n\n resolvedCode += `\\n export const toc = ${JSON.stringify(toc)}\\n`;\n resolvedCode += `\\n export const prev = ${JSON.stringify(prev)}\\n`;\n resolvedCode += `\\n export const next = ${JSON.stringify(next)}\\n`;\n resolvedCode += `\\n export const frontmatter = ${JSON.stringify(\n frontmatter,\n )}\\n`;\n return resolvedCode;\n}\n\nexport async function getPathBySlug(slug: string, contentDir: string) {\n const pathMatch = join(contentDir, slug);\n const matches = await glob(`${pathMatch}.{md,mdx}`);\n if (matches.length === 0) {\n throw new PrestigeError(\n `[Prestige] Could not find markdown file for slug: \"${slug}\". Searched at: ${pathMatch}.{md,mdx}. If you want to link to a custom page, use 'link: \"${slug}\"' instead of 'slug: \"${slug}\"' in your collection config.`,\n );\n }\n return matches[0] as string;\n}\n\nexport async function getFileBySlug(slug: string, contentDir: string) {\n return await read(await getPathBySlug(slug, contentDir));\n}\n\nexport function getVirtualModuleIdsForFile(path: string, contentDir: string) {\n const slug = getSlugByPath(path, contentDir);\n return [\"\\0\" + CONTENT_VIRTUAL_ID + slug];\n}\n\nexport function getSlugByPath(path: string, contentDir: string) {\n // 1. Get the relative path: \"zz/zz/myFile.json\"\n const relativePath = relative(contentDir, path);\n\n // 2. Parse the path to separate the extension\n const pathInfo = parse(relativePath);\n\n const result = join(pathInfo.dir, pathInfo.name);\n\n return result;\n}\n","import { readdir } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { join } from \"pathe\";\nimport {\n Collection,\n CollectionGroup,\n CollectionItem,\n Collections,\n ExternalSidebarLinkType,\n InternalCollectionLink,\n InternalSidebarLinkType,\n NavigationLinks,\n SiblingNavigationType,\n SidebarGroupType,\n SidebarItemType,\n SidebarType,\n} from \"../core/content/content.types\";\nimport { PrestigeError } from \"../utils/errors\";\nimport { pathExists } from \"../utils/file-utils\";\nimport { compileFrontmatter } from \"./content-compiler\";\nimport { getFileBySlug } from \"./content.store\";\nimport { Logger } from \"../utils/logger\";\n\nexport const SIDEBAR_VIRTUAL_ID = \"virtual:prestige/sidebar/\";\n\nfunction flattenSidebar(items: SidebarItemType[]): SiblingNavigationType[] {\n return items.flatMap((item) => {\n if (\"slug\" in item) {\n return [{ label: item.label, link: `/${item.slug}` }];\n }\n if (\"link\" in item) {\n // Ignore external links\n if (item.link.startsWith(\"http://\") || item.link.startsWith(\"https://\")) {\n return [];\n }\n return [{ label: item.label, link: item.link }];\n }\n if (\"items\" in item) {\n return flattenSidebar(item.items);\n }\n return [];\n });\n}\n\nfunction computeNavigation(\n items: SidebarItemType[],\n): Record<string, NavigationLinks> {\n const flattenedLinks = flattenSidebar(items);\n const navigation: Record<string, NavigationLinks> = {};\n\n for (let i = 0; i < flattenedLinks.length; i++) {\n const link = flattenedLinks[i];\n if (link) {\n navigation[link.link] = {\n prev: i > 0 ? flattenedLinks[i - 1] : null,\n next: i < flattenedLinks.length - 1 ? flattenedLinks[i + 1] : null,\n };\n }\n }\n\n return navigation;\n}\n\nfunction resolveDefaultLink(\n items: SidebarItemType[],\n defaultLink?: string,\n): string | undefined {\n if (defaultLink) {\n return defaultLink;\n }\n for (const item of items) {\n if (\"slug\" in item) {\n return item.slug;\n } else if (\"link\" in item) {\n return item.link;\n } else if (\"items\" in item && item.items.length > 0) {\n const link = resolveDefaultLink(item.items);\n if (link) return link;\n }\n }\n return undefined;\n}\n\nexport async function resolveSidebars(\n collections: Collections,\n contentDir: string,\n logger: Logger,\n) {\n const store = new Map<string, SidebarType>();\n\n for (const collection of collections) {\n const sidebar = await processCollection(collection, contentDir, logger);\n store.set(collection.id, sidebar);\n }\n return store;\n}\n\n/** @visibleForTesting */\nasync function processCollection(\n collection: Collection,\n contentDir: string,\n logger: Logger,\n): Promise<SidebarType> {\n const items: SidebarItemType[] = [];\n for (const item of collection.items) {\n items.push(await processItem(item, contentDir, logger));\n }\n const defaultLink = resolveDefaultLink(items, collection.defaultLink);\n if (!defaultLink) {\n throw new PrestigeError(\n `No default link found in collection, it means there are no links in the collection. Please define one in ${collection.id}`,\n );\n }\n return {\n items,\n defaultLink: defaultLink,\n navigation: computeNavigation(items),\n };\n}\n\n/** @visibleForTesting */\nasync function processItem(\n item: CollectionItem,\n contentDir: string,\n logger: Logger,\n): Promise<SidebarItemType> {\n if (typeof item === \"string\" || \"slug\" in item) {\n return resolveInternalSidebarLink(\n item as InternalCollectionLink,\n contentDir,\n );\n } else if (\"link\" in item) {\n return resolveSidebarLink(item, contentDir);\n } else {\n return resolveSidebarGroup(item as CollectionGroup, contentDir, logger);\n }\n}\n\n/** @visibleForTesting */\nasync function resolveSidebarGroup(\n group: CollectionGroup,\n contentDir: string,\n logger: Logger,\n): Promise<SidebarGroupType> {\n const label = await resolveLabel(group, contentDir);\n const items: SidebarItemType[] = [];\n\n if (group.items?.length && group.autogenerate) {\n logger.warn(\n `${group.label} has both items and autogenerate. Only items will be used.`,\n );\n }\n\n if (group.items) {\n for (const childItem of group.items) {\n items.push(await processItem(childItem, contentDir, logger));\n }\n } else if (group.autogenerate?.directory) {\n const generatedItems = await autogenerateSidebar(\n group.autogenerate.directory,\n contentDir,\n logger,\n );\n items.push(...generatedItems);\n }\n\n return {\n label,\n collapsed: group.collapsed,\n items,\n };\n}\n\n/** @visibleForTesting */\nasync function resolveInternalSidebarLink(\n item: InternalCollectionLink,\n contentDir: string,\n): Promise<InternalSidebarLinkType> {\n const label = await resolveLabel(item, contentDir);\n const slug = resolveSlug(item);\n\n if (slug.startsWith(\"/\") || slug.endsWith(\"/\")) {\n throw new PrestigeError(\n `The slug ${slug} cannot start or end with a slash. Remove it and try again.`,\n );\n }\n\n if (!slug) {\n throw new PrestigeError(\n `The slug cannot be empty. Remove it and try again. link label is ${label}`,\n );\n }\n\n return {\n label,\n slug,\n };\n}\n\n/** @visibleForTesting */\nasync function resolveSidebarLink(\n item: ExternalSidebarLinkType,\n contentDir: string,\n): Promise<ExternalSidebarLinkType> {\n const label = await resolveLabel(item, contentDir);\n const link = resolveLink(item);\n\n if (!link) {\n throw new PrestigeError(\n `The link cannot be empty. Remove it and try again. link label is ${label}`,\n );\n }\n\n return {\n label,\n link,\n };\n}\n\n/** @visibleForTesting */\nasync function autogenerateSidebar(\n directory: string,\n contentDir: string,\n logger: Logger,\n): Promise<SidebarItemType[]> {\n const fileExtRegex = /\\.mdx?$/i;\n\n const items: SidebarItemType[] = [];\n const dirPath = join(contentDir, directory);\n if (!(await pathExists(dirPath))) {\n logger.warn(`Directory doesn't exist: ${directory}`);\n return [];\n }\n\n const dirents = await readdir(dirPath, { withFileTypes: true });\n dirents.sort((a, b) => a.name.localeCompare(b.name));\n for (const dirent of dirents) {\n if (dirent.isDirectory()) {\n const subDir = join(directory, dirent.name);\n const group: CollectionGroup = {\n label: dirent.name,\n autogenerate: { directory: subDir },\n };\n items.push(await resolveSidebarGroup(group, contentDir, logger));\n } else if (dirent.isFile() && fileExtRegex.test(dirent.name)) {\n const fullPath = join(directory, dirent.name);\n const slug = fullPath.replace(fileExtRegex, \"\");\n items.push(await resolveInternalSidebarLink(slug, contentDir));\n }\n }\n return items;\n}\n\n/** @visibleForTesting */\nasync function resolveLabel(\n item: CollectionItem,\n contentDir: string,\n): Promise<string> {\n if (typeof item !== \"string\" && \"label\" in item && item.label) {\n return item.label;\n }\n\n if (typeof item === \"string\" || \"slug\" in item) {\n const slug = resolveSlug(item);\n\n const file = await getFileBySlug(slug, contentDir);\n if (!file) {\n throw new PrestigeError(\n `markdown file not found with slug: ${slug} add one in content folder or update config`,\n );\n }\n const data = (await compileFrontmatter(file)) as any;\n if (data?.label) {\n return data?.label;\n }\n\n return basename(slug);\n }\n\n // is a group\n if (typeof item !== \"string\" && (\"items\" in item || \"autogenerate\" in item)) {\n return item.label;\n }\n\n return \"\";\n}\n\n/** @visibleForTesting */\nexport function resolveSlug(item: CollectionItem) {\n if (typeof item === \"string\") {\n return item;\n } else {\n if (\"slug\" in item) {\n return item.slug;\n }\n return \"\";\n }\n}\n\n/** @visibleForTesting */\nexport function resolveLink(item: CollectionItem) {\n if (typeof item === \"object\" && \"link\" in item) {\n return item.link;\n }\n return \"\";\n}\n","import debounce from \"debounce\";\nimport { join } from \"pathe\";\nimport picomatch from \"picomatch\";\nimport { ViteDevServer } from \"vite\";\n\nexport function initContentWatcher(contentDir: string, server: ViteDevServer) {\n const isDocsMatcher = picomatch(join(contentDir, \"**/*.{md,mdx}\"));\n\n const UPDATE_INTERVAL = 1000;\n const schedule = debounce(() => {\n server.restart();\n }, UPDATE_INTERVAL);\n const onFileChange = (file: string) => {\n if (!isDocsMatcher(file)) {\n return;\n }\n schedule();\n };\n server.watcher.add(contentDir);\n server.watcher.on(\"add\", onFileChange);\n server.watcher.on(\"unlink\", onFileChange);\n\n server.httpServer?.on(\"close\", () => {\n schedule.clear();\n });\n}\n","import { mkdir, readdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { SidebarLinkType } from \"../core/content/content.types\";\nimport { Logger } from \"../utils/logger\";\n\nexport async function compileRoutes(\n linksMap: Map<string, SidebarLinkType[]>,\n routesDir: string,\n logger: Logger,\n) {\n const prestigePath = \"(prestige)\";\n const prestigeFullPath = join(routesDir, prestigePath);\n\n try {\n await mkdir(prestigeFullPath, { recursive: true });\n\n const generatedFiles = new Map<string, string>();\n\n for (const [key, links] of linksMap) {\n const onlyInternalLinks = links.filter((l) => \"slug\" in l);\n \n const sidebarPath = key;\n const sidebarFile = sidebarPath + \".lazy.tsx\";\n generatedFiles.set(sidebarFile, createLayoutRoute(key));\n\n for (const l of onlyInternalLinks) {\n const pathified = l.slug.replaceAll(\"/\", \".\");\n generatedFiles.set(pathified + \".tsx\", createContentHeadRoute(l.slug));\n generatedFiles.set(pathified + \".lazy.tsx\", createContentRoute(l.slug));\n }\n }\n\n // Write files only if they have changed or do not exist\n await Promise.all(\n [...generatedFiles.entries()].map(async ([fileName, contents]) => {\n const filePath = join(prestigeFullPath, fileName);\n try {\n const existingContent = await readFile(filePath, \"utf-8\");\n if (existingContent === contents) {\n return; // Skip writing if identical\n }\n } catch (e) {\n // File doesn't exist yet, proceed to write\n }\n logger.info(`Writing route file: ${fileName}`);\n return writeFile(filePath, contents);\n }),\n );\n\n const existingFiles = await readdir(prestigeFullPath);\n const staleLazyFiles = existingFiles.filter(\n (fileName) =>\n fileName.endsWith(\".lazy.tsx\") && !generatedFiles.has(fileName),\n );\n const staleHeadFiles = staleLazyFiles\n .map((fileName) => fileName.replace(\".lazy.tsx\", \".tsx\"))\n .filter(\n (fileName) =>\n existingFiles.includes(fileName) && !generatedFiles.has(fileName),\n );\n const staleFiles = [...new Set([...staleLazyFiles, ...staleHeadFiles])];\n\n await Promise.all(\n staleFiles.map((fileName) => {\n logger.debug(`Removing stale route file: ${fileName}`);\n return unlink(join(prestigeFullPath, fileName));\n }),\n );\n } catch (error) {\n logger.error(\n `[Prestige Router Compiler] Failed to compile routes: ${error}`,\n );\n console.error(\n \"[Prestige Router Compiler] Failed to compile routes:\",\n error,\n );\n }\n}\n\nfunction createLayoutRoute(id: string) {\n return (\n `\nimport { createLazyFileRoute } from '@tanstack/react-router';\nimport sidebar from \"virtual:prestige/sidebar/${id}\";\nimport { CollectionRoute } from \"@lonik/prestige/ui\";\n\nexport const Route = createLazyFileRoute('/(prestige)/${id}')(CollectionRoute(sidebar, \"${id}\"));\n`.trim() + \"\\n\"\n );\n}\n\nfunction createContentHeadRoute(slug: string) {\n return (\n `\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport * as contentData from \"virtual:prestige/content/${slug}\";\nimport { ContentRoute } from \"@lonik/prestige/ui\";\n\nexport const Route = createFileRoute('/(prestige)/${slug}')(ContentRoute(contentData));\n`.trim() + \"\\n\"\n );\n}\n\nfunction createContentRoute(slug: string) {\n return (\n `\nimport { createLazyFileRoute } from \"@tanstack/react-router\";\nimport * as contentData from \"virtual:prestige/content/${slug}\";\nimport { LazyContentRoute } from \"@lonik/prestige/ui\";\n\nexport const Route = createLazyFileRoute('/(prestige)/${slug}')(LazyContentRoute(contentData));\n`.trim() + \"\\n\"\n );\n}\n","import { genDynamicImport } from \"knitwork\";\n\nexport function genExportDefault(specifier: string) {\n return `export default ${specifier};`;\n}\n\n/** exports default undefined */\nexport function genExportUndefined() {\n return genExportDefault(\"undefined\");\n}\n\nexport function genDynamicImportWithDefault(specifier: string) {\n return `${genDynamicImport(specifier)}.then(m => m.default)`;\n}\n","import { genArrayFromRaw, genObjectFromValues } from \"knitwork\";\nimport { genExportDefault } from \"../../utils/code-generation\";\nimport { PrestigeError } from \"../../utils/errors\";\nimport {\n CollectionNavigation,\n Collections,\n SidebarLinkType,\n} from \"./content.types\";\n\nexport const COLLECTION_VIRTUAL_ID = \"virtual:prestige/collection-all\";\n\nexport function resolveCollectionNavigations(\n inlineCollections: Collections,\n linksMap: Map<string, SidebarLinkType[]>,\n) {\n const collections: CollectionNavigation[] = inlineCollections.map((c) => ({\n id: c.id,\n label: c.label ?? c.id,\n defaultLink: c.defaultLink ?? \"\",\n }));\n if (collections.length === 0) {\n throw new PrestigeError(\n `No collections found, add one in prestige plugin config`,\n );\n }\n\n for (const coll of collections) {\n const links = linksMap.get(coll.id);\n const firstInternalLink = links?.find(l => \"slug\" in l);\n if (coll.defaultLink || !firstInternalLink) {\n continue;\n }\n coll.defaultLink = firstInternalLink.slug;\n }\n\n for (const coll of collections) {\n if (!coll.defaultLink) {\n console.warn(\n `No default link found for collection ${coll.id}, it won't be displayed in the header navigation`,\n );\n }\n }\n\n const validCollections = collections.filter((c) => c.defaultLink);\n\n return genExportDefault(\n genArrayFromRaw(validCollections.map((c) => genObjectFromValues(c))),\n );\n}\n","import pc from \"picocolors\";\nexport interface Logger {\n debug: (message: string) => void;\n info: (message: string) => void;\n warn: (message: string) => void;\n error: (message: string) => void;\n}\n\nexport function createLogger(config: {\n disabled: boolean;\n debug: boolean;\n}): Logger {\n function formatLogArgs(message: string) {\n const now = new Date();\n\n // Format: 11:14:22 PM\n const timestamp = now.toLocaleTimeString(\"en-US\", {\n hour12: true,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n\n // Vite's signature: Gray timestamp + Bold Cyan tag\n const fullMessage = `${pc.dim(timestamp)} ${pc.bold(pc.cyan(\"[prestige]\"))} ${message}`;\n return fullMessage;\n }\n\n return {\n debug: (message: string) => {\n if (!config.disabled && config.debug)\n console.debug(formatLogArgs(pc.gray(message)));\n },\n info: (message: string) => {\n if (!config.disabled) console.info(formatLogArgs(pc.reset(message)));\n },\n warn: (message: string) => {\n if (!config.disabled) console.warn(formatLogArgs(pc.yellow(message)));\n },\n error: (message: string) => {\n if (!config.disabled) console.error(formatLogArgs(pc.red(message)));\n },\n };\n}\n\nexport default createLogger;\n","import { join } from \"pathe\";\nimport picomatch, { type Matcher } from \"picomatch\";\nimport { EnvironmentModuleNode, type Plugin } from \"vite\";\nimport { resolvePrestigeConfig } from \"./config/config\";\nimport { PrestigeConfig, PrestigeConfigInput } from \"./config/config.types\";\n\nimport { genObjectFromValues } from \"knitwork\";\nimport { resolveContentLinks } from \"./content/content-links\";\nimport {\n resolveSidebars,\n SIDEBAR_VIRTUAL_ID,\n} from \"./content/content-sidebar.store\";\nimport { initContentWatcher } from \"./content/content-watcher\";\nimport {\n CONTENT_VIRTUAL_ID,\n getSlugByPath,\n resolveContent,\n} from \"./content/content.store\";\nimport { compileRoutes } from \"./content/router-compiler\";\nimport {\n COLLECTION_VIRTUAL_ID,\n resolveCollectionNavigations,\n} from \"./core/content/content-collection.store\";\nimport {\n Collections,\n SidebarLinkType,\n SidebarType,\n} from \"./core/content/content.types\";\nimport { genExportDefault, genExportUndefined } from \"./utils/code-generation\";\nimport { extractVirtualId } from \"./utils/file-utils\";\nimport { createLogger, Logger } from \"./utils/logger\";\n\nexport const CONFIG_VIRTUAL_ID = \"virtual:prestige/config\";\n\nexport default function prestige(inlineConfig?: PrestigeConfigInput): Plugin {\n let config: PrestigeConfig;\n let contentDir: string;\n let isDocsMatcher: Matcher;\n let collections: Collections = [];\n let linksMap: Map<string, SidebarLinkType[]>;\n let collectionNavigations: string;\n let sidebarsMap: Map<string, SidebarType>;\n let logger: Logger;\n\n return {\n name: \"vite-plugin-prestige\",\n enforce: \"pre\",\n async configResolved(resolvedConfig) {\n const { config: loadedConfig } = await resolvePrestigeConfig(\n inlineConfig,\n resolvedConfig.root,\n );\n\n config = loadedConfig;\n logger = createLogger({\n disabled: config.disableLog,\n debug: config.enableDebugLog,\n });\n\n contentDir = join(resolvedConfig.root, \"src/content\");\n isDocsMatcher = picomatch(join(contentDir, \"**/*.{md,mdx}\"));\n collections = config.collections ?? [];\n\n logger.debug(\"Resolving sidebars...\");\n sidebarsMap = await resolveSidebars(collections, contentDir, logger);\n\n logger.debug(\"Resolving content links...\");\n linksMap = resolveContentLinks(sidebarsMap);\n\n logger.debug(\"Resolving collection navigations....\");\n collectionNavigations = resolveCollectionNavigations(\n collections,\n linksMap,\n );\n const routesDir = join(resolvedConfig.root, \"src\", \"routes\");\n\n logger.debug(\"Compiling routes...\");\n await compileRoutes(linksMap, routesDir, logger);\n },\n configureServer(server) {\n initContentWatcher(contentDir, server);\n },\n resolveId(id) {\n // even though the import will be import * from \"virtual:prestige/docs/introduction\"\n // it is not guaranteed that some other plugin doesn't modify this import and attach full path\n // we call extractVirtualId to trim the import\n\n if (id.includes(CONFIG_VIRTUAL_ID)) {\n logger.debug(`Resolving config virtual ID: ${id}`);\n return extractVirtualId(id, CONFIG_VIRTUAL_ID);\n }\n\n if (id.includes(CONTENT_VIRTUAL_ID)) {\n logger.debug(`Resolving content virtual ID: ${id}`);\n return extractVirtualId(id, CONTENT_VIRTUAL_ID);\n }\n\n if (id.includes(COLLECTION_VIRTUAL_ID)) {\n logger.debug(`Resolving collection virtual ID: ${id}`);\n return extractVirtualId(id, COLLECTION_VIRTUAL_ID);\n }\n\n if (id.includes(SIDEBAR_VIRTUAL_ID)) {\n logger.debug(`Resolving sidebar virtual ID: ${id}`);\n return extractVirtualId(id, SIDEBAR_VIRTUAL_ID);\n }\n\n return null;\n },\n async load(id) {\n if (id === `\\0${CONFIG_VIRTUAL_ID}`) {\n logger.debug(`Loading config virtual module: ${id}`);\n return genExportDefault(JSON.stringify(config));\n }\n if (id.includes(CONTENT_VIRTUAL_ID)) {\n logger.debug(`Loading content virtual module: ${id}`);\n return await resolveContent(id, linksMap, contentDir);\n }\n if (id.includes(COLLECTION_VIRTUAL_ID)) {\n logger.debug(`Loading collection virtual module: ${id}`);\n return collectionNavigations;\n }\n\n if (id.includes(SIDEBAR_VIRTUAL_ID)) {\n logger.debug(`Loading sidebar virtual module: ${id}`);\n const sidebarId = id.replace(SIDEBAR_VIRTUAL_ID, \"\").replace(\"\\0\", \"\");\n const sidebar = sidebarsMap.get(sidebarId);\n if (!sidebar) {\n return genExportUndefined();\n }\n return genExportDefault(genObjectFromValues(sidebar));\n }\n\n return null;\n },\n\n async hotUpdate({ file, timestamp, type }) {\n if (type !== \"update\" || !isDocsMatcher(file)) {\n return;\n }\n logger.debug(`Invalidating module ${file}...`);\n const invalidatedModules = new Set<EnvironmentModuleNode>();\n const slug = getSlugByPath(file, contentDir);\n const virtualModuleId = `\\0${CONTENT_VIRTUAL_ID}${slug}`;\n const module =\n this.environment.moduleGraph.getModuleById(virtualModuleId);\n if (module) {\n this.environment.moduleGraph.invalidateModule(\n module,\n invalidatedModules,\n timestamp,\n true,\n );\n logger.debug(`Reloading application...`);\n this.environment.hot.send({ type: \"full-reload\" });\n }\n },\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lonik/prestige",
3
- "version": "0.11.1",
3
+ "version": "0.11.3",
4
4
  "description": "Static Site Generator for Tanstack Start",
5
5
  "homepage": "https://github.com/lukonik/prestige#readme",
6
6
  "bugs": {