UI: Pass props to replaced components via Slot

This commit is contained in:
fuma-nama
2024-10-22 18:17:03 +08:00
parent 07ceb158f5
commit e094284a84
20 changed files with 252 additions and 186 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'fumadocs-mdx': major
---
**Require Fumadocs v14**
+1 -1
View File
@@ -56,7 +56,7 @@
"@next/bundle-analyzer": "15.0.0",
"@next/eslint-plugin-next": "15.0.0",
"@types/mdx": "^2.0.13",
"@types/node": "22.7.7",
"@types/node": "22.7.8",
"@types/react": "^18.3.11",
"@types/react-dom": "^18.3.1",
"autoprefixer": "^10.4.20",
+1 -1
View File
@@ -43,7 +43,7 @@
},
"devDependencies": {
"@types/cross-spawn": "^6.0.6",
"@types/node": "22.7.7",
"@types/node": "22.7.8",
"@types/react": "^18.3.11",
"eslint-config-custom": "workspace:*",
"fast-glob": "^3.3.1",
+1 -1
View File
@@ -37,7 +37,7 @@
"devDependencies": {
"@content-collections/core": "^0.7.2",
"@content-collections/mdx": "^0.1.6",
"@types/node": "22.7.7",
"@types/node": "22.7.8",
"eslint-config-custom": "workspace:*",
"fumadocs-core": "workspace:*",
"tsconfig": "workspace:*",
+1 -1
View File
@@ -94,7 +94,7 @@
"@types/hast": "^3.0.4",
"@types/mdast": "^4.0.3",
"@types/negotiator": "^0.6.3",
"@types/node": "22.7.7",
"@types/node": "22.7.8",
"@types/react": "^18.3.11",
"@types/react-dom": "^18.3.1",
"algoliasearch": "4.24.0",
+1 -1
View File
@@ -9,7 +9,7 @@
"@content-collections/mdx": "^0.1.6",
"@content-collections/next": "^0.2.3",
"@types/mdx": "^2.0.13",
"@types/node": "22.7.7",
"@types/node": "22.7.8",
"@types/react": "^18.3.11",
"@types/react-dom": "^18.3.1",
"autoprefixer": "^10.4.20",
+1 -1
View File
@@ -33,7 +33,7 @@
},
"devDependencies": {
"@types/cross-spawn": "^6.0.6",
"@types/node": "22.7.7",
"@types/node": "22.7.8",
"eslint-config-custom": "workspace:*",
"fast-glob": "^3.3.1",
"tsconfig": "workspace:*"
+1 -1
View File
@@ -40,7 +40,7 @@
"@types/estree": "^1.0.6",
"@types/hast": "^3.0.4",
"@types/mdast": "^4.0.3",
"@types/node": "22.7.7",
"@types/node": "22.7.8",
"eslint-config-custom": "workspace:*",
"remark": "^15.0.0",
"tsconfig": "workspace:*",
+1 -1
View File
@@ -72,7 +72,7 @@
"devDependencies": {
"@types/mdx": "^2.0.13",
"@types/micromatch": "^4.0.9",
"@types/node": "22.7.7",
"@types/node": "22.7.8",
"@types/react": "^18.3.11",
"@types/ws": "^8.5.12",
"eslint-config-custom": "workspace:*",
+1 -1
View File
@@ -66,7 +66,7 @@
"webpack": "^5.95.0"
},
"peerDependencies": {
"fumadocs-core": "^13.2.1 || ^14.0.0",
"fumadocs-core": "^14.0.0",
"next": "14.x.x || 15.x.x"
},
"publishConfig": {
+1 -1
View File
@@ -57,7 +57,7 @@
},
"devDependencies": {
"@types/js-yaml": "^4.0.9",
"@types/node": "22.7.7",
"@types/node": "22.7.8",
"@types/openapi-sampler": "^1.0.3",
"@types/react": "^18.3.11",
"bunchee": "^5.5.1",
+1 -1
View File
@@ -46,7 +46,7 @@
"devDependencies": {
"@types/hast": "^3.0.4",
"@types/mdast": "^4.0.3",
"@types/node": "22.7.7",
"@types/node": "22.7.8",
"@types/react": "^18.3.11",
"eslint-config-custom": "workspace:*",
"fumadocs-ui": "workspace:*",
+1 -1
View File
@@ -35,7 +35,7 @@
"types:check": "tsc --noEmit"
},
"dependencies": {
"@types/node": "22.7.7",
"@types/node": "22.7.8",
"fast-glob": "^3.3.1",
"hast-util-to-jsx-runtime": "^2.3.2",
"mdast-util-from-markdown": "^2.0.1",
+2 -1
View File
@@ -70,6 +70,7 @@
"@radix-ui/react-navigation-menu": "^1.2.1",
"@radix-ui/react-popover": "^1.1.2",
"@radix-ui/react-scroll-area": "^1.2.0",
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-tabs": "^1.1.1",
"@tailwindcss/typography": "^0.5.15",
"class-variance-authority": "^0.7.0",
@@ -103,7 +104,7 @@
"optionalDependencies": {
"@algolia/client-search": "^4.0.0",
"algoliasearch": "^4.24.0",
"tailwindcss": "3.4.14"
"tailwindcss": "^3.4.14"
},
"publishConfig": {
"access": "public"
@@ -81,7 +81,7 @@ export const Sidebar = memo(
...props
}: SidebarProps & {
aside?: HTMLAttributes<HTMLElement> & Record<string, unknown>;
}): React.ReactElement => {
}) => {
const search = useSearchContext();
const hasSearch = search.enabled && !props.hideSearch;
const context = useMemo<InternalContext>(
+147 -110
View File
@@ -1,5 +1,5 @@
import type { PageTree } from 'fumadocs-core/server';
import { type ReactNode, type HTMLAttributes, Fragment } from 'react';
import { type ReactNode, type HTMLAttributes } from 'react';
import Link from 'next/link';
import { Languages, MoreHorizontal } from 'lucide-react';
import { notFound } from 'next/navigation';
@@ -7,8 +7,8 @@ import dynamic from 'next/dynamic';
import { cn } from '@/utils/cn';
import { buttonVariants } from '@/components/ui/button';
import type { SidebarProps } from '@/components/layout/sidebar';
import { replaceOrDefault } from '@/layouts/shared';
import type { LinkItemType } from '@/layouts/links';
import { replaceOrDefault, type SharedNavProps } from '@/layouts/shared';
import type { LinkItemType, IconItem as IconItemType } from '@/layouts/links';
import { getSidebarTabs, type TabOptions } from '@/utils/get-sidebar-tabs';
import type { Option } from '@/components/layout/root-toggle';
import { type BaseLayoutProps, getLinks } from './shared';
@@ -32,8 +32,6 @@ const DynamicSidebar = dynamic(
() => import('@/components/layout/dynamic-sidebar'),
);
export type { LinkItemType };
interface SidebarOptions extends Omit<SidebarProps, 'children'> {
enabled: boolean;
component: ReactNode;
@@ -54,7 +52,12 @@ export interface DocsLayoutProps extends BaseLayoutProps {
}
export function DocsLayout({
nav: { transparentMode, ...nav } = {},
nav: {
enabled: navEnabled = true,
component: navReplace,
transparentMode,
...nav
} = {},
sidebar: {
enabled: sidebarEnabled = true,
collapsible = true,
@@ -67,127 +70,61 @@ export function DocsLayout({
}: DocsLayoutProps): ReactNode {
const links = getLinks(props.links ?? [], props.githubUrl);
const Aside = collapsible ? DynamicSidebar : Sidebar;
if (props.tree === undefined) notFound();
const header: ReactNode[] = [];
const footer: ReactNode[] = [];
if (nav.title)
header.push(
<Link
key="title"
href={nav.url ?? '/'}
className="inline-flex items-center gap-2.5 py-1 font-medium"
>
{nav.title}
</Link>,
);
if (nav.children)
header.push(<Fragment key="children">{nav.children}</Fragment>);
if (links.length > 0)
header.push(
<LinksMenu
key="links"
items={links.map((item, i) => (
<MenuItem key={i} item={item} />
))}
className={cn(
buttonVariants({
size: 'icon',
color: 'ghost',
className: 'ms-auto',
}),
)}
>
<MoreHorizontal />
</LinksMenu>,
);
const iconLinks = links.filter((v) => v.type === 'icon');
if (iconLinks.length > 0) {
footer.push(
<div key="links" className="flex flex-row items-center md:hidden">
{iconLinks.map((item, i) => (
<IconItem key={i} item={item} className="text-fd-muted-foreground" />
))}
</div>,
);
}
if (!props.disableThemeSwitch) {
footer.push(
<ThemeToggle
key="theme"
className={cn('md:me-auto', !i18n && 'max-md:ms-auto')}
/>,
);
}
if (i18n) {
footer.push(
<LanguageToggle key="i18n" className="max-md:order-first max-md:me-auto">
<Languages className="size-5" />
<LanguageToggleText className="md:hidden" />
</LanguageToggle>,
);
}
if (collapsible) {
footer.push(
<SidebarCollapseTrigger key="sidebar" className="max-md:hidden" />,
);
}
let tabs: Option[] = [];
if (Array.isArray(tabOptions)) tabs = tabOptions;
else if (typeof tabOptions === 'object')
if (Array.isArray(tabOptions)) {
tabs = tabOptions;
} else if (typeof tabOptions === 'object') {
tabs = getSidebarTabs(props.tree, tabOptions);
else if (tabOptions !== false) tabs = getSidebarTabs(props.tree);
} else if (tabOptions !== false) {
tabs = getSidebarTabs(props.tree);
}
const banner = (
<div className="flex flex-col gap-1 px-4 empty:hidden md:px-3 md:pb-2">
<SidebarHeader {...nav} links={links} />
{tabs.length > 0 ? <RootToggle className="-mx-1" options={tabs} /> : null}
{sidebar.banner}
</div>
);
const footer = (
<>
<div className="flex flex-row items-center border-t py-1 empty:hidden max-md:gap-1.5 max-md:px-3 md:mx-3">
<SidebarFooter
sidebarCollapsible={collapsible}
i18n={i18n}
disableThemeSwitch={props.disableThemeSwitch ?? false}
iconItems={links.filter((v) => v.type === 'icon')}
/>
</div>
{sidebar.footer}
</>
);
return (
<TreeContextProvider tree={props.tree}>
<NavProvider transparentMode={transparentMode}>
{replaceOrDefault(nav, <SubNav className="h-14 md:hidden" {...nav} />)}
{replaceOrDefault(
{ enabled: navEnabled, component: navReplace },
<SubNav className="h-14 md:hidden" {...nav} />,
nav,
)}
<main
id="nd-docs-layout"
{...props.containerProps}
className={cn(
'flex flex-1 flex-row',
!nav.component &&
nav.enabled !== false &&
'[--fd-nav-height:3.5rem] md:[--fd-nav-height:0px]',
!navReplace && navEnabled
? '[--fd-nav-height:3.5rem] md:[--fd-nav-height:0px]'
: null,
props.containerProps?.className,
)}
>
{replaceOrDefault(
{ enabled: sidebarEnabled, component: sidebarReplace },
<Aside
{...sidebar}
banner={
<div className="flex flex-col gap-1 px-4 empty:hidden md:px-3 md:pb-2">
{header.length > 0 ? (
<div className="flex flex-row items-center border-b pb-2 max-md:hidden">
{header}
</div>
) : null}
{tabs.length > 0 ? (
<RootToggle className="-mx-1" options={tabs} />
) : null}
{sidebar.banner}
</div>
}
footer={
<>
<div className="flex flex-row items-center border-t py-1 empty:hidden max-md:gap-1.5 max-md:px-3 md:mx-3">
{footer}
</div>
{sidebar.footer}
</>
}
>
<Aside {...sidebar} banner={banner} footer={footer}>
<div className="flex flex-col px-2 pt-4 empty:hidden md:hidden">
{links
.filter((v) => v.type !== 'icon')
@@ -196,6 +133,11 @@ export function DocsLayout({
))}
</div>
</Aside>,
{
...sidebar,
banner,
footer,
},
)}
{props.children}
</main>
@@ -204,4 +146,99 @@ export function DocsLayout({
);
}
export { getSidebarTabs, type TabOptions };
function SidebarHeader({
links,
...props
}: SharedNavProps & { links: LinkItemType[] }): ReactNode {
if (!props.title || !props.children || links.length === 0) return null;
return (
<div className="flex flex-row items-center border-b pb-2 max-md:hidden">
{props.title ? (
<Link
href={props.url ?? '/'}
className="inline-flex items-center gap-2.5 py-1 font-medium"
>
{props.title}
</Link>
) : null}
{props.children}
{links.length > 0 ? (
<LinksMenu
items={links.map((item, i) => (
<MenuItem key={i} item={item} />
))}
className={cn(
buttonVariants({
size: 'icon',
color: 'ghost',
}),
'ms-auto',
)}
>
<MoreHorizontal />
</LinksMenu>
) : null}
</div>
);
}
function SidebarFooter({
iconItems,
...props
}: {
i18n: boolean;
iconItems: IconItemType[];
disableThemeSwitch: boolean;
sidebarCollapsible: boolean;
}): ReactNode {
if (props.i18n) {
return (
<>
{iconItems.length > 0 ? (
<div className="flex flex-row items-center md:hidden">
{iconItems.map((item, i) => (
<IconItem
key={i}
item={item}
className="text-fd-muted-foreground"
/>
))}
</div>
) : null}
{!props.disableThemeSwitch ? <ThemeToggle /> : null}
<LanguageToggle className="max-md:order-first max-md:me-auto md:ms-auto">
<Languages className="size-5" />
<LanguageToggleText className="md:hidden" />
</LanguageToggle>
{props.sidebarCollapsible ? (
<SidebarCollapseTrigger className="max-md:hidden" />
) : null}
</>
);
}
return (
<>
{iconItems.length > 0 ? (
<div className="flex flex-row items-center md:hidden">
{iconItems.map((item, i) => (
<IconItem
key={i}
item={item}
className="text-fd-muted-foreground"
/>
))}
</div>
) : null}
{!props.disableThemeSwitch ? (
<ThemeToggle className="max-md:ms-auto" />
) : null}
{props.sidebarCollapsible ? (
<SidebarCollapseTrigger className="ms-auto max-md:hidden" />
) : null}
</>
);
}
export { getSidebarTabs, type TabOptions, type LinkItemType };
+6
View File
@@ -41,6 +41,12 @@ export function HomeLayout({
disableThemeSwitch={disableThemeSwitch}
{...nav}
/>,
{
items: finalLinks,
i18n,
disableThemeSwitch,
...nav,
},
)}
{props.children}
</main>
+4 -1
View File
@@ -1,6 +1,7 @@
import type { ReactNode } from 'react';
import type { LinkItemType } from '@/layouts/links';
import type { NavProviderProps, TitleProps } from '@/components/layout/nav';
import { Slot } from '@radix-ui/react-slot';
interface NavOptions extends SharedNavProps {
enabled: boolean;
@@ -80,10 +81,12 @@ export function replaceOrDefault(
}
| undefined,
def: ReactNode,
customComponentProps?: object,
disabled?: ReactNode,
): ReactNode {
if (obj?.enabled === false) return disabled;
if (obj?.component !== undefined) return obj.component;
if (obj?.component !== undefined)
return <Slot {...customComponentProps}>{obj.component}</Slot>;
return def;
}
+26 -15
View File
@@ -80,15 +80,19 @@ export function DocsPage({
breadcrumb = {},
full = false,
footer = {},
tableOfContentPopover: {
enabled: tocPopoverEnabled = true,
component: tocPopoverReplace,
...tocPopoverOptions
} = {},
tableOfContent: {
// disable TOC on full mode, you can still enable it with `enabled` option.
enabled: tocEnabled = !full,
component: tocReplace,
...tocOptions
} = {},
...props
}: DocsPageProps): React.ReactElement {
const tocPopoverOptions = props.tableOfContentPopover ?? {};
const tocOptions = {
// disable TOC on full mode, you can still enable it with `enabled` option.
enabled: props.tableOfContent?.enabled ?? !full,
...props.tableOfContent,
};
return (
<AnchorProvider toc={toc} single={tocOptions.single}>
<div
@@ -98,17 +102,16 @@ export function DocsPage({
{
'--fd-page-width':
'calc(min(100vw, var(--fd-layout-width)) - var(--fd-sidebar-width) - var(--fd-toc-width))',
'--fd-toc-width': tocOptions.enabled ? undefined : '0px',
'--fd-toc-width': tocEnabled ? undefined : '0px',
} as object
}
>
{replaceOrDefault(
tocPopoverOptions,
{ enabled: tocPopoverEnabled, component: tocPopoverReplace },
<TocPopover
items={toc}
header={tocPopoverOptions.header}
footer={tocPopoverOptions.footer}
className={cn(tocPopoverOptions.enabled !== true && 'lg:hidden')}
{...tocPopoverOptions}
className={cn(!tocPopoverEnabled && 'lg:hidden')}
>
{tocPopoverOptions.style === 'clerk' ? (
<ClerkTOCItems items={toc} isMenu />
@@ -116,11 +119,15 @@ export function DocsPage({
<TOCItems items={toc} isMenu />
)}
</TocPopover>,
{
items: toc,
...tocPopoverOptions,
},
)}
<article
className={cn(
'mx-auto flex w-full flex-1 flex-col gap-6 px-4 pt-10 md:px-6 md:pt-12',
tocOptions.enabled ? 'max-w-[860px]' : 'max-w-[1120px]',
tocEnabled ? 'max-w-[860px]' : 'max-w-[1120px]',
)}
>
{replaceOrDefault(breadcrumb, <Breadcrumb {...breadcrumb} />)}
@@ -138,14 +145,18 @@ export function DocsPage({
</article>
</div>
{replaceOrDefault(
tocOptions,
<Toc header={tocOptions.header} footer={tocOptions.footer}>
{ enabled: tocEnabled, component: tocReplace },
<Toc {...tocOptions}>
{tocOptions.style === 'clerk' ? (
<ClerkTOCItems items={toc} />
) : (
<TOCItems items={toc} />
)}
</Toc>,
{
items: toc,
...tocOptions,
},
<div role="none" className="flex-1" />,
)}
</AnchorProvider>
+49 -46
View File
@@ -52,7 +52,7 @@ importers:
version: 8.11.0([email protected]([email protected]))([email protected])
vitest:
specifier: ^2.1.3
version: 2.1.3(@types/[email protected].7)([email protected])([email protected])
version: 2.1.3(@types/[email protected].8)([email protected])([email protected])
apps/docs:
dependencies:
@@ -178,8 +178,8 @@ importers:
specifier: ^2.0.13
version: 2.0.13
'@types/node':
specifier: 22.7.7
version: 22.7.7
specifier: 22.7.8
version: 22.7.8
'@types/react':
specifier: ^18.3.11
version: 18.3.11
@@ -457,8 +457,8 @@ importers:
specifier: ^6.0.6
version: 6.0.6
'@types/node':
specifier: 22.7.7
version: 22.7.7
specifier: 22.7.8
version: 22.7.8
'@types/react':
specifier: ^18.3.11
version: 18.3.11
@@ -484,8 +484,8 @@ importers:
specifier: ^0.1.6
version: 0.1.6(@content-collections/[email protected]([email protected]))([email protected])([email protected]([email protected]))([email protected])
'@types/node':
specifier: 22.7.7
version: 22.7.7
specifier: 22.7.8
version: 22.7.8
eslint-config-custom:
specifier: workspace:*
version: link:../eslint-config-custom
@@ -579,8 +579,8 @@ importers:
specifier: ^0.6.3
version: 0.6.3
'@types/node':
specifier: 22.7.7
version: 22.7.7
specifier: 22.7.8
version: 22.7.8
'@types/react':
specifier: ^18.3.11
version: 18.3.11
@@ -625,8 +625,8 @@ importers:
specifier: ^6.0.6
version: 6.0.6
'@types/node':
specifier: 22.7.7
version: 22.7.7
specifier: 22.7.8
version: 22.7.8
eslint-config-custom:
specifier: workspace:*
version: link:../eslint-config-custom
@@ -652,8 +652,8 @@ importers:
specifier: ^2.0.13
version: 2.0.13
'@types/node':
specifier: 22.7.7
version: 22.7.7
specifier: 22.7.8
version: 22.7.8
'@types/react':
specifier: ^18.3.11
version: 18.3.11
@@ -719,8 +719,8 @@ importers:
specifier: ^4.0.3
version: 4.0.4
'@types/node':
specifier: 22.7.7
version: 22.7.7
specifier: 22.7.8
version: 22.7.8
eslint-config-custom:
specifier: workspace:*
version: link:../eslint-config-custom
@@ -846,8 +846,8 @@ importers:
specifier: ^4.0.9
version: 4.0.9
'@types/node':
specifier: 22.7.7
version: 22.7.7
specifier: 22.7.8
version: 22.7.8
'@types/react':
specifier: ^18.3.11
version: 18.3.11
@@ -934,8 +934,8 @@ importers:
specifier: ^4.0.9
version: 4.0.9
'@types/node':
specifier: 22.7.7
version: 22.7.7
specifier: 22.7.8
version: 22.7.8
'@types/openapi-sampler':
specifier: ^1.0.3
version: 1.0.3
@@ -994,8 +994,8 @@ importers:
specifier: ^4.0.3
version: 4.0.4
'@types/node':
specifier: 22.7.7
version: 22.7.7
specifier: 22.7.8
version: 22.7.8
'@types/react':
specifier: ^18.3.11
version: 18.3.11
@@ -1024,8 +1024,8 @@ importers:
packages/typescript:
dependencies:
'@types/node':
specifier: 22.7.7
version: 22.7.7
specifier: 22.7.8
version: 22.7.8
fast-glob:
specifier: ^3.3.1
version: 3.3.2
@@ -1099,6 +1099,9 @@ importers:
'@radix-ui/react-scroll-area':
specifier: ^1.2.0
version: 1.2.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
'@radix-ui/react-slot':
specifier: ^1.1.0
version: 1.1.0(@types/[email protected])([email protected])
'@radix-ui/react-tabs':
specifier: ^1.1.1
version: 1.1.1(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
@@ -1137,7 +1140,7 @@ importers:
specifier: ^4.24.0
version: 4.24.0
tailwindcss:
specifier: 3.4.14
specifier: ^3.4.14
version: 3.4.14
devDependencies:
'@next/eslint-plugin-next':
@@ -3045,11 +3048,11 @@ packages:
'@types/[email protected]':
resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
'@types/[email protected]7':
resolution: {integrity: sha512-I2ioBd/IPrYDMv9UNR5NlPElOZ68QB7yY5V2EsLtSrTO0LM0PnCEFF9biLWHf5k+sIy4ohueCV9t4gk1AEdlVA==}
'@types/[email protected]8':
resolution: {integrity: sha512-2ryJttbOAWCYuZMdk4rmZZ6oqE+GSL5LxbaTVe4PCs0FUrHObZZAQL4ihMw9/cH1Pn8lSQ9TXVhsM4LrnfZ0aA==}
'@types/[email protected].7':
resolution: {integrity: sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==}
'@types/[email protected].8':
resolution: {integrity: sha512-a922jJy31vqR5sk+kAdIENJjHblqcZ4RmERviFsER4WJcEONqxKcjNOlk0q7OUfrF5sddT+vng070cdfMlrPLg==}
'@types/[email protected]':
resolution: {integrity: sha512-SwTm7ZahuDRKirbFSBu30X64mvdwITxS5yeC9JNV20Vp23Ymbl+hVdYxegkLDtYvXIxnUngJb8Ok+m3iEYfZiQ==}
@@ -8218,7 +8221,7 @@ snapshots:
'@types/[email protected]':
dependencies:
'@types/node': 22.7.7
'@types/node': 22.7.8
'@types/[email protected]':
dependencies:
@@ -8265,16 +8268,16 @@ snapshots:
'@types/[email protected]':
dependencies:
'@types/node': 22.7.7
'@types/node': 22.7.8
form-data: 4.0.1
'@types/[email protected]': {}
'@types/[email protected]7':
'@types/[email protected]8':
dependencies:
undici-types: 5.26.5
'@types/[email protected].7':
'@types/[email protected].8':
dependencies:
undici-types: 6.19.8
@@ -8301,7 +8304,7 @@ snapshots:
'@types/[email protected]':
dependencies:
'@types/node': 22.7.7
'@types/node': 22.7.8
'@typescript-eslint/[email protected](@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected])':
dependencies:
@@ -8400,13 +8403,13 @@ snapshots:
chai: 5.1.1
tinyrainbow: 1.2.0
'@vitest/[email protected](@vitest/[email protected])([email protected](@types/[email protected].7)([email protected])([email protected]))':
'@vitest/[email protected](@vitest/[email protected])([email protected](@types/[email protected].8)([email protected])([email protected]))':
dependencies:
'@vitest/spy': 2.1.3
estree-walker: 3.0.3
magic-string: 0.30.12
optionalDependencies:
vite: 5.4.9(@types/[email protected].7)([email protected])([email protected])
vite: 5.4.9(@types/[email protected].8)([email protected])([email protected])
'@vitest/[email protected]':
dependencies:
@@ -10201,7 +10204,7 @@ snapshots:
[email protected]:
dependencies:
'@types/node': 22.7.7
'@types/node': 22.7.8
merge-stream: 2.0.0
supports-color: 8.1.1
@@ -11039,7 +11042,7 @@ snapshots:
[email protected]([email protected]):
dependencies:
'@types/node': 18.19.57
'@types/node': 18.19.58
'@types/node-fetch': 2.6.11
abort-controller: 3.0.0
agentkeepalive: 4.5.0
@@ -12342,12 +12345,12 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.2
[email protected](@types/[email protected].7)([email protected])([email protected]):
[email protected](@types/[email protected].8)([email protected])([email protected]):
dependencies:
cac: 6.7.14
debug: 4.3.7
pathe: 1.1.2
vite: 5.4.9(@types/[email protected].7)([email protected])([email protected])
vite: 5.4.9(@types/[email protected].8)([email protected])([email protected])
transitivePeerDependencies:
- '@types/node'
- less
@@ -12359,21 +12362,21 @@ snapshots:
- supports-color
- terser
[email protected](@types/[email protected].7)([email protected])([email protected]):
[email protected](@types/[email protected].8)([email protected])([email protected]):
dependencies:
esbuild: 0.21.5
postcss: 8.4.47
rollup: 4.24.0
optionalDependencies:
'@types/node': 22.7.7
'@types/node': 22.7.8
fsevents: 2.3.3
lightningcss: 1.27.0
terser: 5.34.1
[email protected](@types/[email protected].7)([email protected])([email protected]):
[email protected](@types/[email protected].8)([email protected])([email protected]):
dependencies:
'@vitest/expect': 2.1.3
'@vitest/mocker': 2.1.3(@vitest/[email protected])([email protected](@types/[email protected].7)([email protected])([email protected]))
'@vitest/mocker': 2.1.3(@vitest/[email protected])([email protected](@types/[email protected].8)([email protected])([email protected]))
'@vitest/pretty-format': 2.1.3
'@vitest/runner': 2.1.3
'@vitest/snapshot': 2.1.3
@@ -12388,11 +12391,11 @@ snapshots:
tinyexec: 0.3.1
tinypool: 1.0.1
tinyrainbow: 1.2.0
vite: 5.4.9(@types/[email protected].7)([email protected])([email protected])
vite-node: 2.1.3(@types/[email protected].7)([email protected])([email protected])
vite: 5.4.9(@types/[email protected].8)([email protected])([email protected])
vite-node: 2.1.3(@types/[email protected].8)([email protected])([email protected])
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 22.7.7
'@types/node': 22.7.8
transitivePeerDependencies:
- less
- lightningcss