Core: Migrate to shiki

This commit is contained in:
Fuma Nama
2024-01-27 17:46:12 +08:00
parent 374c115a21
commit eb028b4be9
20 changed files with 437 additions and 88 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'fumadocs-core': minor
---
Migrate to shiki
+165
View File
@@ -44,3 +44,168 @@ body {
-moz-osx-font-smoothing: grayscale;
font-synthesis-weight: none;
}
/* ===== Basic ===== */
:root {
--twoslash-error-color: #d45656;
--twoslash-error-bg: #d4565620;
--twoslash-tag-color: #3772cf;
--twoslash-tag-bg: #3772cf20;
--twoslash-tag-warn-color: #c37d0d;
--twoslash-tag-warn-bg: #c37d0d20;
--twoslash-tag-annotate-color: #1ba673;
--twoslash-tag-annotate-bg: #1ba67320;
}
.twoslash-query-presisted .twoslash-popup-container,
.twoslash-completion-list {
user-select: none;
position: absolute;
top: 0;
left: 0;
@apply flex translate-y-4 w-80 flex-col whitespace-normal shadow-md border rounded-md p-2 gap-2 bg-popover text-popover-foreground z-40;
}
.twoslash-query-presisted .twoslash-popup-container:hover,
.twoslash-completion-list:hover {
user-select: auto;
}
.twoslash-popup-arrow {
position: absolute;
top: -4px;
left: 1em;
transform: rotate(-45deg);
pointer-events: none;
@apply size-1.5 border-t border-r bg-popover;
}
.twoslash-popup-docs-tags {
display: flex;
flex-direction: column;
gap: 0.5em;
}
.twoslash-popup-docs-tag-name {
font-weight: 600;
}
.twoslash-popup-code .line {
padding: 0;
font-size: 13px;
}
.twoslash-popup-docs {
@apply text-sm font-sans mt-2 text-muted-foreground;
}
/* ===== Hover Info ===== */
.twoslash:hover .twoslash-hover {
border-color: currentColor;
}
.twoslash .twoslash-hover {
@apply relative transition-colors duration-300 border-b border-dotted border-transparent;
}
/* ===== Error Line ===== */
.twoslash .twoslash-error-line {
position: relative;
background-color: var(--twoslash-error-bg);
border-left: 3px solid var(--twoslash-error-color);
color: var(--twoslash-error-color);
padding: 6px 12px;
margin: 0.2em 0;
}
.twoslash .twoslash-error {
text-decoration: wavy underline var(--twoslash-error-color);
padding-bottom: 2px;
}
/* ===== Completeions ===== */
.twoslash .twoslash-completion-cursor {
position: relative;
}
.twoslash-completion-list::before {
width: 1px;
position: absolute;
top: -1.2em;
height: 1em;
left: -1px;
content: ' ';
@apply bg-foreground;
}
.twoslash-completion-list li {
font-size: 13px;
@apply inline-flex items-center truncate gap-2;
}
.twoslash-completion-list li span.twoslash-completions-unmatched {
@apply text-muted-foreground;
}
.twoslash-completion-list .deprecated {
text-decoration: line-through;
opacity: 0.5;
}
/* Highlights */
.twoslash-highlighted {
padding: 1px 2px;
margin: -1px -3px;
@apply bg-primary/10 border border-primary/50 rounded-sm;
}
/* Icons */
.twoslash-completion-list .twoslash-completions-icon {
width: 1em;
flex: none;
@apply text-muted-foreground;
}
/* Custom Tags */
.twoslash .twoslash-tag-line {
position: relative;
background-color: var(--twoslash-tag-bg);
border-left: 3px solid var(--twoslash-tag-color);
color: var(--twoslash-tag-color);
padding: 6px 10px;
margin: 0.2em 0;
display: flex;
align-items: center;
gap: 0.3em;
}
.twoslash .twoslash-tag-line .twoslash-tag-icon {
width: 1.1em;
color: inherit;
}
.twoslash .twoslash-tag-line.twoslash-tag-error-line {
background-color: var(--twoslash-error-bg);
border-left: 3px solid var(--twoslash-error-color);
color: var(--twoslash-error-color);
}
.twoslash .twoslash-tag-line.twoslash-tag-warn-line {
background-color: var(--twoslash-tag-warn-bg);
border-left: 3px solid var(--twoslash-tag-warn-color);
color: var(--twoslash-tag-warn-color);
}
.twoslash .twoslash-tag-line.twoslash-tag-annotate-line {
background-color: var(--twoslash-tag-annotate-bg);
border-left: 3px solid var(--twoslash-tag-annotate-color);
color: var(--twoslash-tag-annotate-color);
}
/* Respect people's wishes to not have animations */
@media (prefers-reduced-motion: reduce) {
.twoslash * {
transition: none !important;
}
}
+1 -1
View File
@@ -1,7 +1,7 @@
import * as Base from 'fumadocs-ui/components/codeblock';
import type { HTMLAttributes } from 'react';
import { useMemo } from 'react';
import { getHighlighter } from 'shikiji';
import { getHighlighter } from 'shiki';
const highlighter = await getHighlighter({
langs: ['bash', 'ts', 'tsx'],
+30
View File
@@ -0,0 +1,30 @@
'use client';
import * as React from 'react';
import * as HoverCardPrimitive from '@radix-ui/react-hover-card';
import { cn } from '@/utils/cn';
const HoverCard = HoverCardPrimitive.Root;
const HoverCardTrigger = HoverCardPrimitive.Trigger;
const HoverCardContent = React.forwardRef<
React.ElementRef<typeof HoverCardPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>
>(({ className, align = 'start', ...props }, ref) => (
<HoverCardPrimitive.Portal>
<HoverCardPrimitive.Content
ref={ref}
align={align}
className={cn(
'z-50 w-80 rounded-md border bg-popover p-2 text-popover-foreground shadow-md outline-none data-[state=closed]:animate-popover-out data-[state=open]:animate-popover-in',
className,
)}
{...props}
/>
</HoverCardPrimitive.Portal>
));
HoverCardContent.displayName = HoverCardPrimitive.Content.displayName;
export { HoverCard, HoverCardTrigger, HoverCardContent };
@@ -12,18 +12,20 @@ a page based on the given page tree.
it exports a `useBreadcrumb` hook:
```ts
import { useBreadcrumb } from 'fumadocs-core/breadcrumb'
```ts twoslash
/**
* @author hel
*/
declare const tree: any;
// ---cut---
import { usePathname } from 'next/navigation';
import { useBreadcrumb } from 'fumadocs-core/breadcrumb';
const tree: PageTree = ...
const pathname = usePathname()
const items = useBreadcrumb(pathname, tree)
const pathname = usePathname();
const items = useBreadcrumb(pathname, tree);
// ^?
```
### Breadcrumb Item
| Prop | Type | Description |
| ------ | ---------------- | ------------ |
| `name` | `string` | Name of item |
| `url` | `string \| null` | Href link |
<AutoTypeTable path="headless" name="BreadcrumbItem" />
@@ -21,18 +21,13 @@ return (
### Sidebar Provider
| Prop | Type | Description |
| -------------- | ---------------------- | ----------- |
| `open` | `boolean?` | - |
| `onOpenChange` | `(v: boolean) => void` | - |
<AutoTypeTable path="headless" name="SidebarProviderProps" />
### Sidebar Trigger
Opens the sidebar on click.
| Prop | Type | Description |
| ---- | ------------- | ----------- |
| `as` | `ElementType` | - |
<AutoTypeTable path="headless" name="SidebarTriggerProps" />
### Sidebar List
@@ -22,18 +22,13 @@ return (
Contains all anchor items. By default, it automatically scrolls to the active
anchor.
| Prop | Type | Description |
| ---------- | ----------------- | ----------------- |
| `toc` | `TableOfContents` | Table of contents |
| `children` | `ReactNode` | - |
<AutoTypeTable path="headless" name="TOCProviderProps" />
### TOC Item
The anchor element.
| Prop | Type | Description |
| ------ | -------- | ------------------- |
| `href` | `string` | The url of TOC item |
<AutoTypeTable path="headless" name="TOCItemProps" />
| Data Attribute | Values | Description |
| -------------- | ------------- | ---------------- |
+1 -7
View File
@@ -22,10 +22,4 @@ If your heading doesn't have an id, it will add one automatically.
An array of `TOCItemType`.
### TOCItemType
| Prop | Type | Description |
| ------- | -------- | ---------------- |
| `title` | `string` | Title of heading |
| `url` | `string` | Href url |
| `depth` | `number` | From 1 to 6 |
<AutoTypeTable path="headless" name="TOCItemType" />
@@ -0,0 +1,36 @@
---
title: Twoslash
description: Use Typescript Twoslash in your docs
---
> For showcase purpose only, this is not a available API.
```ts twoslash
// @noErrors
console.;
// ^|
```
```ts twoslash
// @errors: 2588
const a = '123';
console.log(a);
// ^^^
```
```ts twoslash
// @errors: 2588
const a = '123';
a = 132;
// @log: Custom log message
const b = 1;
// @error: Custom error message
const c = 1;
// @warn: Custom warning message
const d = 1;
// @annotate: Custom annotation message
```
+22
View File
@@ -1,3 +1,25 @@
import type * as Breadcrumb from 'fumadocs-core/breadcrumb';
import type * as TOC from 'fumadocs-core/toc';
import type * as Server from 'fumadocs-core/server';
import type * as Sidebar from 'fumadocs-core/sidebar';
import type { SortedResult as OriginalSortedResult } from 'fumadocs-core/search/shared';
import type { ComponentPropsWithoutRef, ElementType } from 'react';
export type SortedResult = OriginalSortedResult;
export type BreadcrumbItem = Breadcrumb.BreadcrumbItem;
export type SidebarProviderProps = Sidebar.SidebarProviderProps;
export type SidebarTriggerProps = Sidebar.SidebarTriggerProps<ElementType>;
export type TOCProviderProps = Omit<
ComponentPropsWithoutRef<typeof TOC.TOCProvider>,
keyof ComponentPropsWithoutRef<'div'>
>;
export type TOCItemProps = Omit<
ComponentPropsWithoutRef<typeof TOC.TOCItem>,
keyof ComponentPropsWithoutRef<'a'>
>;
export type TOCItemType = Server.TOCItemType;
@@ -36,4 +36,4 @@ const toc = await getTableOfContentsFromPortableText(posts[0].body);
### Output
An array of [TOCItemType](/docs/headless/mdx/toc#tocitemtype) is returned.
An array of [TOCItemType](/docs/headless/mdx/toc#output) is returned.
@@ -7,9 +7,9 @@ description: Adding code blocks to your docs
<div className="bg-background rounded-lg prose-no-margin">
```js title="Demo File"
import createNextDocsMDX from 'fumadocs-mdx/config';
import createMDX from 'fumadocs-mdx/config';
const withMDX = createNextDocsMDX();
const withMDX = createMDX();
// [!code word:config]
/** @type {import('next').NextConfig} */
@@ -25,7 +25,7 @@ export default withMDX(config);
Display code blocks, required by default.
- Syntax highlighting powered by Shikiji
- Syntax highlighting powered by Shiki
- Copy button
- Custom Titles
+8
View File
@@ -9,10 +9,18 @@ import type { ReactNode } from 'react';
import { Wrapper } from '@/components/preview/wrapper';
import { AutoTypeTable } from './components/auto-type-table';
import { cn } from './utils/cn';
import {
HoverCard,
HoverCardContent,
HoverCardTrigger,
} from './components/ui/popover';
export function useMDXComponents(components: MDXComponents): MDXComponents {
return {
...defaultComponents,
Popover: HoverCard,
PopoverTrigger: HoverCardTrigger,
PopoverContent: HoverCardContent,
pre: ({ ref: _ref, title, className, ...props }) => (
<CodeBlock title={title}>
<Pre className={cn('max-h-[400px]', className)} {...props} />
+33 -4
View File
@@ -1,10 +1,11 @@
import createBundleAnalyzer from '@next/bundle-analyzer';
import createNextDocs from 'fumadocs-mdx/config';
import createMDX from 'fumadocs-mdx/config';
import {
remarkDynamicContent,
remarkInstall,
rehypeCodeDefaultOptions,
} from 'fumadocs-core/mdx-plugins';
import { transformerTwoslash } from '@shikijs/twoslash';
import rehypeKatex from 'rehype-katex';
import remarkMath from 'remark-math';
@@ -21,13 +22,41 @@ const config = {
},
};
const withNextDocs = createNextDocs({
const withMDX = createMDX({
mdxOptions: {
rehypeCodeOptions: {
transformers: [
...rehypeCodeDefaultOptions.transformers,
transformerTwoslash({
explicitTrigger: true,
rendererRich: {
hast: {
hoverCompose: ({ popup, token }) => [
{
type: 'element',
tagName: 'Popover',
children: [
popup,
{
type: 'element',
tagName: 'PopoverTrigger',
children: [token],
},
],
},
],
popupTypes: {
class: 'nd-codeblock twoslash-popup-code',
},
hoverPopup: {
tagName: 'PopoverContent',
children: (v) => v,
},
},
},
}),
{
name: 'shikiji:remove-escape',
name: 'fumadocs:remove-escape',
code(element) {
element.children.forEach((line) => {
if (line.type !== 'element') return;
@@ -56,4 +85,4 @@ const withNextDocs = createNextDocs({
},
});
export default withAnalyzer(withNextDocs(config));
export default withAnalyzer(withMDX(config));
+3 -1
View File
@@ -13,6 +13,8 @@
},
"dependencies": {
"@next/env": "^14.0.0",
"@radix-ui/react-hover-card": "^1.0.7",
"@shikijs/twoslash": "1.0.0-beta.0",
"algoliasearch": "^4.20.0",
"class-variance-authority": "^0.7.0",
"clsx": "^2.0.0",
@@ -29,7 +31,7 @@
"react-dom": "18.2.0",
"rehype-katex": "^7.0.0",
"remark-math": "^6.0.0",
"shikiji": "^0.10.0",
"shiki": "^1.0.0-beta.0",
"tailwind-merge": "^2.0.0",
"zod": "^3.22.4"
},
+3 -3
View File
@@ -117,17 +117,17 @@
},
"dependencies": {
"@formatjs/intl-localematcher": "^0.5.0",
"@shikijs/rehype": "^1.0.0-beta.0",
"@shikijs/transformers": "^1.0.0-beta.0",
"flexsearch": "0.7.21",
"github-slugger": "^2.0.0",
"negotiator": "^0.6.3",
"react-remove-scroll": "^2.5.6",
"rehype-shikiji": "^0.10.0",
"remark": "^15.0.0",
"remark-gfm": "^4.0.0",
"remark-mdx": "^3.0.0",
"scroll-into-view-if-needed": "^3.1.0",
"shikiji": "^0.10.0",
"shikiji-transformers": "^0.10.0",
"shiki": "^1.0.0-beta.0",
"swr": "^2.2.2",
"unist-util-visit": "^5.0.0"
},
+4 -4
View File
@@ -1,9 +1,9 @@
import type { Root } from 'hast';
import rehypeShikiji, { type RehypeShikijiOptions } from 'rehype-shikiji';
import rehypeShiki, { type RehypeShikiOptions } from '@shikijs/rehype';
import {
transformerNotationHighlight,
transformerNotationWordHighlight,
} from 'shikiji-transformers';
} from '@shikijs/transformers';
import type { Processor, Transformer } from 'unified';
import { visit } from './hast-utils';
@@ -60,7 +60,7 @@ export const rehypeCodeDefaultOptions: RehypeCodeOptions = {
},
};
export type RehypeCodeOptions = RehypeShikijiOptions & {
export type RehypeCodeOptions = RehypeShikiOptions & {
/**
* Filter meta string before processing
*/
@@ -103,7 +103,7 @@ export function rehypeCode(
];
const prefix = 'language-';
const transformer = rehypeShikiji.call(this, codeOptions);
const transformer = rehypeShiki.call(this, codeOptions);
return async (root, vfile) => {
visit(root, ['pre'], (element) => {
+2 -2
View File
@@ -67,7 +67,7 @@ function pluginOption(
return list;
}
const createNextDocs =
const createMDX =
({
mdxOptions = {},
cwd = process.cwd(),
@@ -160,4 +160,4 @@ const createNextDocs =
};
};
export { createNextDocs as default };
export { createMDX as default };
+4 -1
View File
@@ -46,7 +46,10 @@ export const typography = {
'0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows)',
},
ul: {
paddingLeft: '0.7rem',
'list-style-position': 'inside',
},
li: {
'padding-left': '0',
},
// Disabled styles, handled by Fumadocs UI
'pre code': false,
+100 -37
View File
@@ -55,6 +55,12 @@ importers:
'@next/env':
specifier: ^14.0.0
version: 14.0.0
'@radix-ui/react-hover-card':
specifier: ^1.0.7
version: 1.0.7(@types/[email protected])(@types/[email protected])([email protected])([email protected])
'@shikijs/twoslash':
specifier: 1.0.0-beta.0
version: 1.0.0-beta.0([email protected])
algoliasearch:
specifier: ^4.20.0
version: 4.20.0
@@ -103,9 +109,9 @@ importers:
remark-math:
specifier: ^6.0.0
version: 6.0.0
shikiji:
specifier: ^0.10.0
version: 0.10.0
shiki:
specifier: ^1.0.0-beta.0
version: 1.0.0-beta.0
tailwind-merge:
specifier: ^2.0.0
version: 2.0.0
@@ -272,6 +278,12 @@ importers:
'@formatjs/intl-localematcher':
specifier: ^0.5.0
version: 0.5.0
'@shikijs/rehype':
specifier: ^1.0.0-beta.0
version: 1.0.0-beta.0
'@shikijs/transformers':
specifier: ^1.0.0-beta.0
version: 1.0.0-beta.0
flexsearch:
specifier: 0.7.21
version: 0.7.21
@@ -290,9 +302,6 @@ importers:
react-remove-scroll:
specifier: ^2.5.6
version: 2.5.6(@types/[email protected])([email protected])
rehype-shikiji:
specifier: ^0.10.0
version: 0.10.0
remark:
specifier: ^15.0.0
version: 15.0.1
@@ -305,12 +314,9 @@ importers:
scroll-into-view-if-needed:
specifier: ^3.1.0
version: 3.1.0
shikiji:
specifier: ^0.10.0
version: 0.10.0
shikiji-transformers:
specifier: ^0.10.0
version: 0.10.0
shiki:
specifier: ^1.0.0-beta.0
version: 1.0.0-beta.0
swr:
specifier: ^2.2.2
version: 2.2.2([email protected])
@@ -2797,6 +2803,35 @@ packages:
react-dom: 18.2.0([email protected])
dev: false
/@radix-ui/[email protected](@types/[email protected])(@types/[email protected])([email protected])([email protected]):
resolution: {integrity: sha512-OcUN2FU0YpmajD/qkph3XzMcK/NmSk9hGWnjV68p6QiZMgILugusgQwnLSDs3oFSJYGKf3Y49zgFedhGh04k9A==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
react: ^16.8 || ^17.0 || ^18.0
react-dom: ^16.8 || ^17.0 || ^18.0
peerDependenciesMeta:
'@types/react':
optional: true
'@types/react-dom':
optional: true
dependencies:
'@babel/runtime': 7.23.2
'@radix-ui/primitive': 1.0.1
'@radix-ui/react-compose-refs': 1.0.1(@types/[email protected])([email protected])
'@radix-ui/react-context': 1.0.1(@types/[email protected])([email protected])
'@radix-ui/react-dismissable-layer': 1.0.5(@types/[email protected])(@types/[email protected])([email protected])([email protected])
'@radix-ui/react-popper': 1.1.3(@types/[email protected])(@types/[email protected])([email protected])([email protected])
'@radix-ui/react-portal': 1.0.4(@types/[email protected])(@types/[email protected])([email protected])([email protected])
'@radix-ui/react-presence': 1.0.1(@types/[email protected])(@types/[email protected])([email protected])([email protected])
'@radix-ui/react-primitive': 1.0.3(@types/[email protected])(@types/[email protected])([email protected])([email protected])
'@radix-ui/react-use-controllable-state': 1.0.1(@types/[email protected])([email protected])
'@types/react': 18.2.0
'@types/react-dom': 18.2.1
react: 18.2.0
react-dom: 18.2.0([email protected])
dev: false
/@radix-ui/[email protected]([email protected]):
resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==}
peerDependencies:
@@ -3458,6 +3493,37 @@ packages:
resolution: {integrity: sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA==}
dev: true
/@shikijs/[email protected]:
resolution: {integrity: sha512-uicyrkx379Q5sxQuGV3kduHPWIAkjxmeA5A4J6syscx8wiEyIV06i/Q6s9GeKLCb857Hi90H8e/FoFSbcjnZsw==}
dev: false
/@shikijs/[email protected]:
resolution: {integrity: sha512-b2jjH1HJfQ4zxvUJaxMnubxINngvvOXpZZBlW50aYUaMgVFu5vbIJbkXRF4lYCYOtbCxeLf7FCxDLcUqScH8pA==}
dependencies:
'@shikijs/transformers': 1.0.0-beta.0
'@types/hast': 3.0.3
hast-util-to-string: 3.0.0
shiki: 1.0.0-beta.0
unified: 11.0.4
unist-util-visit: 5.0.0
dev: false
/@shikijs/[email protected]:
resolution: {integrity: sha512-OvIO6RxQ7YaQhp34uXVKUPZDRdTcGwBgX3zn26haSvqPwrTQcxdPgT47sr4u3sz1+RwN3RO9AGxCJFRKNpB+Qw==}
dependencies:
shiki: 1.0.0-beta.0
dev: false
/@shikijs/[email protected]([email protected]):
resolution: {integrity: sha512-zil9WA4aCs2yJ+1vwt1El8+xp8up9ikh48ksTl7Un8/+dHDAVKjkRD20W+G071cl7NOEEWEynnIMkqqVITNlfA==}
dependencies:
'@shikijs/core': 1.0.0-beta.0
twoslash: 0.1.0([email protected])
transitivePeerDependencies:
- supports-color
- typescript
dev: false
/@sinclair/[email protected]:
resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
dev: true
@@ -3833,6 +3899,14 @@ packages:
eslint-visitor-keys: 3.4.3
dev: true
/@typescript/[email protected]:
resolution: {integrity: sha512-AJS307bPgbsZZ9ggCT3wwpg3VbTKMFNHfaY/uF0ahSkYYrPF2dSSKDNIDIQAHm9qJqbLvCsSJH7yN4Vs/CsMMg==}
dependencies:
debug: 4.3.4
transitivePeerDependencies:
- supports-color
dev: false
/@ungap/[email protected]:
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
@@ -9319,17 +9393,6 @@ packages:
vfile: 6.0.1
dev: false
/[email protected]:
resolution: {integrity: sha512-iLc5d8ZzV7iCCZt6m9+PeNy+dY358SbTpLddf9n78aw08X5kx6+9ympHmN0mjD1HY8aF1UpUFPRMJlB9+fBKKQ==}
dependencies:
'@types/hast': 3.0.3
hast-util-to-string: 3.0.0
shikiji: 0.10.0
shikiji-transformers: 0.10.0
unified: 11.0.4
unist-util-visit: 5.0.0
dev: false
/[email protected]:
resolution: {integrity: sha512-Uk5xu1YKdqobe5XpSskwPvo1XeHUUucWEQSl8hTrXt5selvca1e8K1EZ37E6YoZ4BT8BCqCdVfQW7OfHfthtVQ==}
dependencies:
@@ -9673,20 +9736,10 @@ packages:
resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==}
dev: true
/shiki[email protected].0:
resolution: {integrity: sha512-imG+bvRkuNlZUi2q9tMVfegRRouTpDxMFejpfF/6J+bFX3NDKtlW9T9iIAkBYnw4pcCtSwirW0AvkwlQR4wyxg==}
dev: false
/[email protected]:
resolution: {integrity: sha512-x9oYybeF/XOrIc6Mm8G1gU5ezunMxdgD4WwBTKrZ5tAmFFaNIWCjwZENgRt1uR4iMi0+pGH0g9bmrbraSC41nA==}
/shiki@1.0.0-beta.0:
resolution: {integrity: sha512-CcP0IhEDQ3LWfJC44cfxfId9pjJi9Nephl8DxgrL4tKWprI/oz6deZyL0vB+XWxhTx/1uonzWQKaSQPwKx5dTA==}
dependencies:
shikiji: 0.10.0
dev: false
/[email protected]:
resolution: {integrity: sha512-1dAzIOWbtM7B4Sem5BvE+CEdsebDsRA34SfCxM4qJ4PLgR73ZD92VEtNfbcoZ3xOLSqvtV0J9i4WpCgVsmQteg==}
dependencies:
shikiji-core: 0.10.0
'@shikijs/core': 1.0.0-beta.0
dev: false
/[email protected]:
@@ -10428,6 +10481,17 @@ packages:
turbo-windows-arm64: 1.11.3
dev: true
/[email protected]([email protected]):
resolution: {integrity: sha512-zvDn23/FwNdi/i2xMTTDcn7xnX4iKlp6tJt68aD86zRqesQrb/HOnMBtaUu6+vme4gtlX9ScEfKYog1+7IPKSw==}
peerDependencies:
typescript: '*'
dependencies:
'@typescript/vfs': 1.5.0
typescript: 5.3.3
transitivePeerDependencies:
- supports-color
dev: false
/[email protected]:
resolution: {integrity: sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==}
@@ -10528,7 +10592,6 @@ packages:
resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
engines: {node: '>=14.17'}
hasBin: true
dev: true
/[email protected]:
resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==}