From 5453c745376407cdae6ece8c786ce108558caa37 Mon Sep 17 00:00:00 2001 From: Hamin Park Date: Wed, 21 Jan 2026 16:15:40 +0900 Subject: [PATCH] test: mdx rehype plugin --- packages/mdx/.prettierignore | 1 + packages/mdx/package.json | 9 +- packages/mdx/test/fixtures/link-support.md | 27 + .../mdx/test/fixtures/link-support.out.html | 15 + packages/mdx/test/fixtures/mock-hast-tree.ts | 28 + .../mdx/test/fixtures/syntax-highlight.md | 44 + .../test/fixtures/syntax-highlight.out.html | 33 + packages/mdx/test/fixtures/twoslash.md | 102 ++ packages/mdx/test/fixtures/twoslash.out.html | 80 ++ packages/mdx/test/rehype.test.ts | 66 ++ packages/mdx/vitest.config.ts | 9 + yarn.lock | 919 +++++++++++++++++- 12 files changed, 1325 insertions(+), 8 deletions(-) create mode 100644 packages/mdx/.prettierignore create mode 100644 packages/mdx/test/fixtures/link-support.md create mode 100644 packages/mdx/test/fixtures/link-support.out.html create mode 100644 packages/mdx/test/fixtures/mock-hast-tree.ts create mode 100644 packages/mdx/test/fixtures/syntax-highlight.md create mode 100644 packages/mdx/test/fixtures/syntax-highlight.out.html create mode 100644 packages/mdx/test/fixtures/twoslash.md create mode 100644 packages/mdx/test/fixtures/twoslash.out.html create mode 100644 packages/mdx/test/rehype.test.ts create mode 100644 packages/mdx/vitest.config.ts diff --git a/packages/mdx/.prettierignore b/packages/mdx/.prettierignore new file mode 100644 index 0000000..a843dc4 --- /dev/null +++ b/packages/mdx/.prettierignore @@ -0,0 +1 @@ +test/fixtures diff --git a/packages/mdx/package.json b/packages/mdx/package.json index ef89cd5..c951257 100644 --- a/packages/mdx/package.json +++ b/packages/mdx/package.json @@ -60,7 +60,8 @@ "type": "tsc --noEmit", "lint": "eslint . --cache", "format": "prettier . --write", - "format:check": "prettier . --check" + "format:check": "prettier . --check", + "test": "vitest" }, "author": "Mintlify, Inc.", "license": "MIT", @@ -84,8 +85,12 @@ "prettier-plugin-tailwindcss": "^0.6.8", "react": "^19.2.1", "react-dom": "^19.2.1", + "rehype-stringify": "^10.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", "rimraf": "^5.0.1", - "typescript": "^5.7.2" + "typescript": "^5.7.2", + "vitest": "^4.0.17" }, "peerDependencies": { "@radix-ui/react-popover": "^19.2.1", diff --git a/packages/mdx/test/fixtures/link-support.md b/packages/mdx/test/fixtures/link-support.md new file mode 100644 index 0000000..5bd757e --- /dev/null +++ b/packages/mdx/test/fixtures/link-support.md @@ -0,0 +1,27 @@ +```js Link Testing icon="js" lines twoslash +import { useEffect, useState } from 'react'; + +// @link Component +export function Component() { + // ^? + return
{count}
; +} + +// @link OtherFunction: #hola-there +export function OtherFunction() { + // ^? + return
{count}
; +} + +// @link ExternalLink: https://google.com +export function ExternalLink() { + // ^? + const str = + "Don't worry, only hover targets with ExternalLink will be affected, not random strings"; + return
{count}
; +} +``` + +### Component + +Hello world from the `Component` section diff --git a/packages/mdx/test/fixtures/link-support.out.html b/packages/mdx/test/fixtures/link-support.out.html new file mode 100644 index 0000000..adab173 --- /dev/null +++ b/packages/mdx/test/fixtures/link-support.out.html @@ -0,0 +1,15 @@ +
import { function useEffect(effect: EffectCallback, deps?: DependencyList): void

Accepts a function that contains imperative, possibly effectful code.

@parameffect Imperative function that can return a cleanup function@paramdeps If present, effect will only activate if the values in the list change.@version16.8.0@seehttps://react.dev/reference/react/useEffect
useEffect
, function useState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>] (+1 overload)

Returns a stateful value, and a function to update it.

useState
} from 'react';
+ +export function Component() {
function Component(): JSX.Element
return <JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>div>{count}</JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>div>; +} + +export function OtherFunction() {
function OtherFunction(): JSX.Element
return <JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>div>{count}</JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>div>; +} + +export function ExternalLink() {
function ExternalLink(): JSX.Element
const const str: "Don't worry, only hover targets with ExternalLink will be affected, not random strings"str = + "Don't worry, only hover targets with ExternalLink will be affected, not random strings"; + return <JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>div>{count}</JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>div>; +} +
+

Component

+

Hello world from the Component section

\ No newline at end of file diff --git a/packages/mdx/test/fixtures/mock-hast-tree.ts b/packages/mdx/test/fixtures/mock-hast-tree.ts new file mode 100644 index 0000000..efe9e24 --- /dev/null +++ b/packages/mdx/test/fixtures/mock-hast-tree.ts @@ -0,0 +1,28 @@ +import type { Root } from 'hast'; + +const MOCK_HAST_TREE: Root = { + type: 'root', + children: [ + { + type: 'element', + tagName: 'pre', + properties: {}, + children: [ + { + type: 'element', + tagName: 'code', + properties: { className: ['language-js'] }, + children: [ + { + type: 'text', + value: "console.log('Hello World!');", + }, + ], + data: { meta: 'index.js {1}' }, + }, + ], + }, + ], +}; + +export { MOCK_HAST_TREE }; diff --git a/packages/mdx/test/fixtures/syntax-highlight.md b/packages/mdx/test/fixtures/syntax-highlight.md new file mode 100644 index 0000000..eac5e65 --- /dev/null +++ b/packages/mdx/test/fixtures/syntax-highlight.md @@ -0,0 +1,44 @@ +## JavaScript + +```js index.js {2} +console.log('Hello, world!'); +function add(a, b) { + return a + b; +} + +function subtract(a, b) { + return a - b; +} +``` + +## Python + +```python index.py {1-2,4-5} +def add(a, b): + return a + b + +def subtract(a, b): + return a - b +``` + +## Java + +```java {3} +public class Main { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +} +``` + +## C# + +```csharp index.cs {1,3-4} +public class Program +{ + public static void Main(string[] args) + { + Console.WriteLine("Hello, World!"); + } +} +``` diff --git a/packages/mdx/test/fixtures/syntax-highlight.out.html b/packages/mdx/test/fixtures/syntax-highlight.out.html new file mode 100644 index 0000000..ef9d69b --- /dev/null +++ b/packages/mdx/test/fixtures/syntax-highlight.out.html @@ -0,0 +1,33 @@ +

JavaScript

+
console.log('Hello, world!');
+function add(a, b) {
+  return a + b;
+}
+
+function subtract(a, b) {
+  return a - b;
+}
+
+

Python

+
def add(a, b):
+    return a + b
+
+def subtract(a, b):
+    return a - b
+
+

Java

+
public class Main {
+    public static void main(String[] args) {
+        System.out.println("Hello, World!");
+    }
+}
+
+

C#

+
public class Program
+{
+    public static void Main(string[] args)
+    {
+        Console.WriteLine("Hello, World!");
+    }
+}
+
\ No newline at end of file diff --git a/packages/mdx/test/fixtures/twoslash.md b/packages/mdx/test/fixtures/twoslash.md new file mode 100644 index 0000000..bdce722 --- /dev/null +++ b/packages/mdx/test/fixtures/twoslash.md @@ -0,0 +1,102 @@ +### Twoslash disabled without any additional configs or filenames + +```ts +// This is a tooltip that will appear on the next line +const myVariable = 'hello world'; +// ^? + +// This is the second line +// You can include [links](#anchor) in your hover content +function myFunction() { + // ^? + return myVariable; +} +``` + +### Twoslash enabled without any additional configs or filenames + +```ts twoslash +// This is a tooltip that will appear on the next line +const myVariable = 'hello world'; +// ^? + +// This is the second line +// You can include [links](#anchor) in your hover content +function myFunction() { + // ^? + return myVariable; +} +``` + +### Twoslash disabled with additional configs and filename + +```js something_with_external_packages.tsx icon="js" lines +import { useEffect, useState } from 'react'; + +export function Component() { + // ^? + const [count, setCount] = useState(0); + // ^? ^? + + useEffect(() => { + setTimeout(() => setCount(count + 1), 1000); + // ^? + }, [count]); + + return
{count}
; +} +``` + +### Twoslash enabled with additional configs + +```js something_with_external_packages.tsx icon="js" lines twoslash +import { useEffect, useState } from 'react'; + +export function Component() { + // ^? + const [count, setCount] = useState(0); + // ^? ^? + + useEffect(() => { + setTimeout(() => setCount(count + 1), 1000); + // ^? + }, [count]); + + return
{count}
; +} +``` + +### Twoslash cut before + +```ts twoslash +type PermissionResult = + | { + behavior: 'allow'; + updatedInput: ToolInput; + updatedPermissions?: PermissionUpdate[]; + } + | { + behavior: 'deny'; + message: string; + interrupt?: boolean; + }; + +type ToolInput = string[]; + +type PermissionUpdate = { + name: string; + permission: Array; +}; + +// ---cut-before--- + +type CanUseTool = ( + toolName: string, + input: ToolInput, + options: { + signal: AbortSignal; + suggestions?: PermissionUpdate[]; + // ^? + } +) => Promise; +``` diff --git a/packages/mdx/test/fixtures/twoslash.out.html b/packages/mdx/test/fixtures/twoslash.out.html new file mode 100644 index 0000000..0ad7050 --- /dev/null +++ b/packages/mdx/test/fixtures/twoslash.out.html @@ -0,0 +1,80 @@ +

Twoslash disabled without any additional configs or filenames

+
// This is a tooltip that will appear on the next line
+const myVariable = 'hello world';
+//    ^?
+
+// This is the second line
+// You can include [links](#anchor) in your hover content
+function myFunction() {
+  //     ^?
+  return myVariable;
+}
+
+

Twoslash enabled without any additional configs or filenames

+
// This is a tooltip that will appear on the next line
+const myVariable = 'hello world';
const myVariable: "hello world"
+// This is the second line +// You can include [links](#anchor) in your hover content +function myFunction() {
function myFunction(): string
return const myVariable: "hello world"myVariable; +} +
+

Twoslash disabled with additional configs and filename

+
import { useEffect, useState } from 'react';
+
+export function Component() {
+  //            ^?
+  const [count, setCount] = useState(0);
+  //     ^?     ^?
+
+  useEffect(() => {
+    setTimeout(() => setCount(count + 1), 1000);
+    // ^?
+  }, [count]);
+
+  return <div>{count}</div>;
+}
+
+

Twoslash enabled with additional configs

+
import { function useEffect(effect: EffectCallback, deps?: DependencyList): void

Accepts a function that contains imperative, possibly effectful code.

@parameffect Imperative function that can return a cleanup function@paramdeps If present, effect will only activate if the values in the list change.@version16.8.0@seehttps://react.dev/reference/react/useEffect
useEffect
, function useState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>] (+1 overload)

Returns a stateful value, and a function to update it.

useState
} from 'react';
+ +export function Component() {
function Component(): JSX.Element
const [count, const setCount: Dispatch<SetStateAction<number>>setCount] = useState<number>(initialState: number | (() => number)): [number, Dispatch<SetStateAction<number>>] (+1 overload)

Returns a stateful value, and a function to update it.

useState
(0);
const count: number
+ function useEffect(effect: EffectCallback, deps?: DependencyList): void

Accepts a function that contains imperative, possibly effectful code.

@parameffect Imperative function that can return a cleanup function@paramdeps If present, effect will only activate if the values in the list change.@version16.8.0@seehttps://react.dev/reference/react/useEffect
useEffect
(() => {
+ setTimeout(() => const setCount: (value: SetStateAction<number>) => voidsetCount(const count: numbercount + 1), 1000);
function setTimeout<[]>(callback: () => void, ms?: number): NodeJS.Timeout (+1 overload)

Schedules execution of a one-time callback after delay milliseconds.

+

The callback will likely not be invoked in precisely delay milliseconds. +Node.js makes no guarantees about the exact timing of when callbacks will fire, +nor of their ordering. The callback will be called as close as possible to the +time specified.

+

When delay is larger than 2147483647 or less than 1, the delay will be set to 1. Non-integer delays are truncated to an integer.

+

If callback is not a function, a TypeError will be thrown.

+

This method has a custom variant for promises that is available using timersPromises.setTimeout().

@sincev0.0.1@paramcallback The function to call when the timer elapses.@paramdelay The number of milliseconds to wait before calling the callback.@paramargs Optional arguments to pass when the callback is called.@returnfor use with clearTimeout
}, [const count: numbercount]); + + return <JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>div>{const count: numbercount}</JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>div>; +} +
+

Twoslash cut before

+

+type 
type CanUseTool = (toolName: string, input: ToolInput, options: {
+    signal: AbortSignal;
+    suggestions?: PermissionUpdate[];
+}) => Promise<PermissionResult>
CanUseTool
= (
+ toolName: stringtoolName: string, + input: ToolInputinput: type ToolInput = string[]ToolInput, +
options: {
+    signal: AbortSignal;
+    suggestions?: PermissionUpdate[];
+}
options
: {
+ signal: AbortSignalsignal: AbortSignal; + suggestions?: PermissionUpdate[] | undefinedsuggestions?: PermissionUpdate[];
type PermissionUpdate = {
+    name: string;
+    permission: Array<number>;
+}
} +) => interface Promise<T>

Represents the completion of an asynchronous operation

Promise
<
type PermissionResult = {
+    behavior: "allow";
+    updatedInput: ToolInput;
+    updatedPermissions?: PermissionUpdate[];
+} | {
+    behavior: "deny";
+    message: string;
+    interrupt?: boolean;
+}
PermissionResult
>;
+
\ No newline at end of file diff --git a/packages/mdx/test/rehype.test.ts b/packages/mdx/test/rehype.test.ts new file mode 100644 index 0000000..de0ee85 --- /dev/null +++ b/packages/mdx/test/rehype.test.ts @@ -0,0 +1,66 @@ +import fs from 'node:fs/promises'; +import rehypeStringify from 'rehype-stringify'; +import remarkParse from 'remark-parse'; +import remarkRehype from 'remark-rehype'; +import { unified } from 'unified'; +import { describe, expect, it } from 'vitest'; + +import { rehypeSyntaxHighlighting } from '../src/plugins/index.js'; +import { MOCK_HAST_TREE } from './fixtures/mock-hast-tree.js'; + +describe('Unit test', () => { + it('should set pre code node properties', async () => { + // Plugin isolated run + const processor = unified().use(rehypeSyntaxHighlighting); + const result = await processor.run(structuredClone(MOCK_HAST_TREE)); + const preCodeNode = result.children.find( + (node) => node.type === 'element' && node.tagName === 'pre' + ); + + // Check if pre code node properties are set + expect(preCodeNode?.type === 'element' && preCodeNode.properties.class).toBeDefined(); + expect(preCodeNode?.type === 'element' && preCodeNode.properties.style).toBeDefined(); + expect(preCodeNode?.type === 'element' && preCodeNode.properties.language).toBeDefined(); + + // Check if language is set correctly + expect(preCodeNode?.type === 'element' && preCodeNode.properties.language).toBe('javascript'); + + // Check if data meta is set correctly + expect(preCodeNode?.type === 'element' && preCodeNode.data?.meta).toBe('index.js {1}'); + }); +}); + +describe('Snapshot test', () => { + const createProcessor = () => + unified().use(remarkParse).use(remarkRehype).use(rehypeSyntaxHighlighting).use(rehypeStringify); + + it('syntax highlight', async () => { + const processor = createProcessor(); + const result = await processor.process( + await fs.readFile(new URL('./fixtures/syntax-highlight.md', import.meta.url)) + ); + + // Check syntax highlighting + await expect(result.toString()).toMatchFileSnapshot('./fixtures/syntax-highlight.out.html'); + }); + + it('twoslash', async () => { + const processor = createProcessor(); + const result = await processor.process( + await fs.readFile(new URL('./fixtures/twoslash.md', import.meta.url)) + ); + + // Check twoslash + await expect(result.toString()).toMatchFileSnapshot('./fixtures/twoslash.out.html'); + }); + + it('link support', async () => { + const processor = createProcessor(); + const result = await processor.process( + await fs.readFile(new URL('./fixtures/link-support.md', import.meta.url)) + ); + + // Check link support + await expect(result.toString()).toMatchFileSnapshot('./fixtures/link-support.out.html'); + }); +}); diff --git a/packages/mdx/vitest.config.ts b/packages/mdx/vitest.config.ts new file mode 100644 index 0000000..9ac4c88 --- /dev/null +++ b/packages/mdx/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + testTimeout: 10_000, + include: ['test/**/*.test.ts'], + exclude: ['**/node_modules/**', '**/dist/**'], + }, +}); diff --git a/yarn.lock b/yarn.lock index 8689990..3677281 100644 --- a/yarn.lock +++ b/yarn.lock @@ -393,6 +393,188 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/aix-ppc64@npm:0.27.2" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/android-arm64@npm:0.27.2" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/android-arm@npm:0.27.2" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/android-x64@npm:0.27.2" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/darwin-arm64@npm:0.27.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/darwin-x64@npm:0.27.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/freebsd-arm64@npm:0.27.2" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/freebsd-x64@npm:0.27.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-arm64@npm:0.27.2" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-arm@npm:0.27.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-ia32@npm:0.27.2" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-loong64@npm:0.27.2" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-mips64el@npm:0.27.2" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-ppc64@npm:0.27.2" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-riscv64@npm:0.27.2" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-s390x@npm:0.27.2" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/linux-x64@npm:0.27.2" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-arm64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/netbsd-arm64@npm:0.27.2" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/netbsd-x64@npm:0.27.2" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/openbsd-arm64@npm:0.27.2" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/openbsd-x64@npm:0.27.2" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openharmony-arm64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/openharmony-arm64@npm:0.27.2" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/sunos-x64@npm:0.27.2" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/win32-arm64@npm:0.27.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/win32-ia32@npm:0.27.2" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.27.2": + version: 0.27.2 + resolution: "@esbuild/win32-x64@npm:0.27.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -948,7 +1130,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.5.0": +"@jridgewell/sourcemap-codec@npm:^1.5.0, @jridgewell/sourcemap-codec@npm:^1.5.5": version: 1.5.5 resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 @@ -1079,14 +1261,18 @@ __metadata: react: "npm:^19.2.1" react-dom: "npm:^19.2.1" rehype-katex: "npm:^7.0.1" + rehype-stringify: "npm:^10.0.1" remark-gfm: "npm:^4.0.0" remark-math: "npm:^6.0.0" + remark-parse: "npm:^11.0.0" + remark-rehype: "npm:^11.1.2" remark-smartypants: "npm:^3.0.2" rimraf: "npm:^5.0.1" shiki: "npm:^3.11.0" typescript: "npm:^5.7.2" unified: "npm:^11.0.0" unist-util-visit: "npm:^5.0.0" + vitest: "npm:^4.0.17" peerDependencies: "@radix-ui/react-popover": ^19.2.1 react: ^19.2.1 @@ -1617,6 +1803,181 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm-eabi@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.55.2" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-android-arm64@npm:4.55.2" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-darwin-arm64@npm:4.55.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-darwin-x64@npm:4.55.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.55.2" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-freebsd-x64@npm:4.55.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.55.2" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.55.2" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.55.2" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.55.2" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-loong64-gnu@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.55.2" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-loong64-musl@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-linux-loong64-musl@npm:4.55.2" + conditions: os=linux & cpu=loong64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-ppc64-gnu@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.55.2" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-ppc64-musl@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-linux-ppc64-musl@npm:4.55.2" + conditions: os=linux & cpu=ppc64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.55.2" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-musl@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.55.2" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.55.2" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.55.2" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.55.2" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-openbsd-x64@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-openbsd-x64@npm:4.55.2" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-openharmony-arm64@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.55.2" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.55.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.55.2" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-gnu@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-win32-x64-gnu@npm:4.55.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.55.2": + version: 4.55.2 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.55.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@rtsao/scc@npm:^1.1.0": version: 1.1.0 resolution: "@rtsao/scc@npm:1.1.0" @@ -1737,6 +2098,13 @@ __metadata: languageName: node linkType: hard +"@standard-schema/spec@npm:^1.0.0": + version: 1.1.0 + resolution: "@standard-schema/spec@npm:1.1.0" + checksum: 10c0/d90f55acde4b2deb983529c87e8025fa693de1a5e8b49ecc6eb84d1fd96328add0e03d7d551442156c7432fd78165b2c26ff561b970a9a881f046abb78d6a526 + languageName: node + linkType: hard + "@swc/helpers@npm:0.5.15": version: 0.5.15 resolution: "@swc/helpers@npm:0.5.15" @@ -1796,6 +2164,16 @@ __metadata: languageName: node linkType: hard +"@types/chai@npm:^5.2.2": + version: 5.2.3 + resolution: "@types/chai@npm:5.2.3" + dependencies: + "@types/deep-eql": "npm:*" + assertion-error: "npm:^2.0.1" + checksum: 10c0/e0ef1de3b6f8045a5e473e867c8565788c444271409d155588504840ad1a53611011f85072188c2833941189400228c1745d78323dac13fcede9c2b28bacfb2f + languageName: node + linkType: hard + "@types/debug@npm:^4.0.0": version: 4.1.12 resolution: "@types/debug@npm:4.1.12" @@ -1805,6 +2183,13 @@ __metadata: languageName: node linkType: hard +"@types/deep-eql@npm:*": + version: 4.0.2 + resolution: "@types/deep-eql@npm:4.0.2" + checksum: 10c0/bf3f811843117900d7084b9d0c852da9a044d12eb40e6de73b552598a6843c21291a8a381b0532644574beecd5e3491c5ff3a0365ab86b15d59862c025384844 + languageName: node + linkType: hard + "@types/estree-jsx@npm:^1.0.0": version: 1.0.3 resolution: "@types/estree-jsx@npm:1.0.3" @@ -1821,7 +2206,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:^1.0.6": +"@types/estree@npm:1.0.8, @types/estree@npm:^1.0.6": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 @@ -2236,6 +2621,86 @@ __metadata: languageName: node linkType: hard +"@vitest/expect@npm:4.0.17": + version: 4.0.17 + resolution: "@vitest/expect@npm:4.0.17" + dependencies: + "@standard-schema/spec": "npm:^1.0.0" + "@types/chai": "npm:^5.2.2" + "@vitest/spy": "npm:4.0.17" + "@vitest/utils": "npm:4.0.17" + chai: "npm:^6.2.1" + tinyrainbow: "npm:^3.0.3" + checksum: 10c0/cdaa6827aa3a9473d51fd0944bcd698a94507929fa3c98b00bbdb74342319ec04279f01108d7d2dd7cbcd0d8062f65a3f21bb3615c0d5223e61adcc036c8b370 + languageName: node + linkType: hard + +"@vitest/mocker@npm:4.0.17": + version: 4.0.17 + resolution: "@vitest/mocker@npm:4.0.17" + dependencies: + "@vitest/spy": "npm:4.0.17" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.21" + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 10c0/54e657fa5b79764926b15aac993528bfe7083f6731209253617b1f27d328aa3297fcbf96b67e84d1a5632553231f795585f2396f563837cf117a574c87f5cef7 + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:4.0.17": + version: 4.0.17 + resolution: "@vitest/pretty-format@npm:4.0.17" + dependencies: + tinyrainbow: "npm:^3.0.3" + checksum: 10c0/10a2dd7e2daf7ee006107d380bbd28b66b09a7014d31087daab0dea7dee0d12868cfcf6b3372729268502fd9065162345b68b9b9c5d225f5c6c2fd2c664a2a86 + languageName: node + linkType: hard + +"@vitest/runner@npm:4.0.17": + version: 4.0.17 + resolution: "@vitest/runner@npm:4.0.17" + dependencies: + "@vitest/utils": "npm:4.0.17" + pathe: "npm:^2.0.3" + checksum: 10c0/f4ccc236d1ed5ba2186d5f36ff0306d4ac7b711a40d7316ad6fd71c0f7229482b19969a8737e87670f3d4efb08f2138ff5b47a744fd7ae8db6c03cf991293a04 + languageName: node + linkType: hard + +"@vitest/snapshot@npm:4.0.17": + version: 4.0.17 + resolution: "@vitest/snapshot@npm:4.0.17" + dependencies: + "@vitest/pretty-format": "npm:4.0.17" + magic-string: "npm:^0.30.21" + pathe: "npm:^2.0.3" + checksum: 10c0/31a047a097b13eff6c0f5393ea3e7203771ae9a22afe6465cd9023fd2ed516ddccd84523d48504a032c9d04a86a12e3f1235e08bb2ffc7d7a125e372c41ef53d + languageName: node + linkType: hard + +"@vitest/spy@npm:4.0.17": + version: 4.0.17 + resolution: "@vitest/spy@npm:4.0.17" + checksum: 10c0/c290731ba3392f11eaba8fc7fa08063a3a4d14af6baeec210b260ccd5a46613196fb4a8ff3ac8bf91a9606aef90eee9b6364bda130ce71abff368e35dfe2b265 + languageName: node + linkType: hard + +"@vitest/utils@npm:4.0.17": + version: 4.0.17 + resolution: "@vitest/utils@npm:4.0.17" + dependencies: + "@vitest/pretty-format": "npm:4.0.17" + tinyrainbow: "npm:^3.0.3" + checksum: 10c0/1e2e4d7d7709ec022f603a1e12015523a2290f326c0bbe0c6bd5481ec396d4efc6bf8c738d601915d88e74267e9841df1e05157edced10f5048865204aeb86ff + languageName: node + linkType: hard + "abbrev@npm:^2.0.0": version: 2.0.0 resolution: "abbrev@npm:2.0.0" @@ -2562,6 +3027,13 @@ __metadata: languageName: node linkType: hard +"assertion-error@npm:^2.0.1": + version: 2.0.1 + resolution: "assertion-error@npm:2.0.1" + checksum: 10c0/bbbcb117ac6480138f8c93cf7f535614282dea9dc828f540cdece85e3c665e8f78958b96afac52f29ff883c72638e6a87d469ecc9fe5bc902df03ed24a55dba8 + languageName: node + linkType: hard + "ast-types-flow@npm:^0.0.8": version: 0.0.8 resolution: "ast-types-flow@npm:0.0.8" @@ -2843,6 +3315,13 @@ __metadata: languageName: node linkType: hard +"chai@npm:^6.2.1": + version: 6.2.2 + resolution: "chai@npm:6.2.2" + checksum: 10c0/e6c69e5f0c11dffe6ea13d0290936ebb68fcc1ad688b8e952e131df6a6d5797d5e860bc55cef1aca2e950c3e1f96daf79e9d5a70fb7dbaab4e46355e2635ed53 + languageName: node + linkType: hard + "chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -3506,6 +3985,13 @@ __metadata: languageName: node linkType: hard +"es-module-lexer@npm:^1.7.0": + version: 1.7.0 + resolution: "es-module-lexer@npm:1.7.0" + checksum: 10c0/4c935affcbfeba7fb4533e1da10fa8568043df1e3574b869385980de9e2d475ddc36769891936dbb07036edb3c3786a8b78ccf44964cd130dedc1f2c984b6c7b + languageName: node + linkType: hard + "es-object-atoms@npm:^1.0.0": version: 1.0.0 resolution: "es-object-atoms@npm:1.0.0" @@ -3600,6 +4086,95 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.27.0": + version: 0.27.2 + resolution: "esbuild@npm:0.27.2" + dependencies: + "@esbuild/aix-ppc64": "npm:0.27.2" + "@esbuild/android-arm": "npm:0.27.2" + "@esbuild/android-arm64": "npm:0.27.2" + "@esbuild/android-x64": "npm:0.27.2" + "@esbuild/darwin-arm64": "npm:0.27.2" + "@esbuild/darwin-x64": "npm:0.27.2" + "@esbuild/freebsd-arm64": "npm:0.27.2" + "@esbuild/freebsd-x64": "npm:0.27.2" + "@esbuild/linux-arm": "npm:0.27.2" + "@esbuild/linux-arm64": "npm:0.27.2" + "@esbuild/linux-ia32": "npm:0.27.2" + "@esbuild/linux-loong64": "npm:0.27.2" + "@esbuild/linux-mips64el": "npm:0.27.2" + "@esbuild/linux-ppc64": "npm:0.27.2" + "@esbuild/linux-riscv64": "npm:0.27.2" + "@esbuild/linux-s390x": "npm:0.27.2" + "@esbuild/linux-x64": "npm:0.27.2" + "@esbuild/netbsd-arm64": "npm:0.27.2" + "@esbuild/netbsd-x64": "npm:0.27.2" + "@esbuild/openbsd-arm64": "npm:0.27.2" + "@esbuild/openbsd-x64": "npm:0.27.2" + "@esbuild/openharmony-arm64": "npm:0.27.2" + "@esbuild/sunos-x64": "npm:0.27.2" + "@esbuild/win32-arm64": "npm:0.27.2" + "@esbuild/win32-ia32": "npm:0.27.2" + "@esbuild/win32-x64": "npm:0.27.2" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/openharmony-arm64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/cf83f626f55500f521d5fe7f4bc5871bec240d3deb2a01fbd379edc43b3664d1167428738a5aad8794b35d1cca985c44c375b1cd38a2ca613c77ced2c83aafcd + languageName: node + linkType: hard + "escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" @@ -4123,7 +4698,7 @@ __metadata: languageName: node linkType: hard -"estree-walker@npm:^3.0.0": +"estree-walker@npm:^3.0.0, estree-walker@npm:^3.0.3": version: 3.0.3 resolution: "estree-walker@npm:3.0.3" dependencies: @@ -4139,6 +4714,13 @@ __metadata: languageName: node linkType: hard +"expect-type@npm:^1.2.2": + version: 1.3.0 + resolution: "expect-type@npm:1.3.0" + checksum: 10c0/8412b3fe4f392c420ab41dae220b09700e4e47c639a29ba7ba2e83cc6cffd2b4926f7ac9e47d7e277e8f4f02acda76fd6931cb81fd2b382fa9477ef9ada953fd + languageName: node + linkType: hard + "exponential-backoff@npm:^3.1.1": version: 3.1.1 resolution: "exponential-backoff@npm:3.1.1" @@ -4346,7 +4928,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:~2.3.2": +"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -4356,7 +4938,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -4804,7 +5386,7 @@ __metadata: languageName: node linkType: hard -"hast-util-to-html@npm:^9.0.5": +"hast-util-to-html@npm:^9.0.0, hast-util-to-html@npm:^9.0.5": version: 9.0.5 resolution: "hast-util-to-html@npm:9.0.5" dependencies: @@ -5693,6 +6275,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.30.21": + version: 0.30.21 + resolution: "magic-string@npm:0.30.21" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.5" + checksum: 10c0/299378e38f9a270069fc62358522ddfb44e94244baa0d6a8980ab2a9b2490a1d03b236b447eee309e17eb3bddfa482c61259d47960eb018a904f0ded52780c4a + languageName: node + linkType: hard + "make-fetch-happen@npm:^14.0.3": version: 14.0.3 resolution: "make-fetch-happen@npm:14.0.3" @@ -6652,6 +7243,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.11": + version: 3.3.11 + resolution: "nanoid@npm:3.3.11" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b + languageName: node + linkType: hard + "nanoid@npm:^3.3.6, nanoid@npm:^3.3.7": version: 3.3.8 resolution: "nanoid@npm:3.3.8" @@ -6940,6 +7540,13 @@ __metadata: languageName: node linkType: hard +"obug@npm:^2.1.1": + version: 2.1.1 + resolution: "obug@npm:2.1.1" + checksum: 10c0/59dccd7de72a047e08f8649e94c1015ec72f94eefb6ddb57fb4812c4b425a813bc7e7cd30c9aca20db3c59abc3c85cc7a62bb656a968741d770f4e8e02bc2e78 + languageName: node + linkType: hard + "once@npm:^1.3.0": version: 1.4.0 resolution: "once@npm:1.4.0" @@ -7149,6 +7756,13 @@ __metadata: languageName: node linkType: hard +"pathe@npm:^2.0.3": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10c0/c118dc5a8b5c4166011b2b70608762e260085180bb9e33e80a50dcdb1e78c010b1624f4280c492c92b05fc276715a4c357d1f9edc570f8f1b3d90b6839ebaca1 + languageName: node + linkType: hard + "picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" @@ -7293,6 +7907,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.5.6": + version: 8.5.6 + resolution: "postcss@npm:8.5.6" + dependencies: + nanoid: "npm:^3.3.11" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/5127cc7c91ed7a133a1b7318012d8bfa112da9ef092dddf369ae699a1f10ebbd89b1b9f25f3228795b84585c72aabd5ced5fc11f2ba467eedf7b081a66fad024 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -7674,6 +8299,17 @@ __metadata: languageName: node linkType: hard +"rehype-stringify@npm:^10.0.1": + version: 10.0.1 + resolution: "rehype-stringify@npm:10.0.1" + dependencies: + "@types/hast": "npm:^3.0.0" + hast-util-to-html: "npm:^9.0.0" + unified: "npm:^11.0.0" + checksum: 10c0/c643ae3a4862465033e0f1e9f664433767279b4ee9296570746970a79940417ec1fb1997a513659aab97063cf971c5d97e0af8129f590719f01628c8aa480765 + languageName: node + linkType: hard + "remark-gfm@npm:^4.0.0": version: 4.0.0 resolution: "remark-gfm@npm:4.0.0" @@ -7746,6 +8382,19 @@ __metadata: languageName: node linkType: hard +"remark-rehype@npm:^11.1.2": + version: 11.1.2 + resolution: "remark-rehype@npm:11.1.2" + dependencies: + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + mdast-util-to-hast: "npm:^13.0.0" + unified: "npm:^11.0.0" + vfile: "npm:^6.0.0" + checksum: 10c0/f9eccacfb596d9605581dc05bfad28635d6ded5dd0a18e88af5fd4df0d3fcf9612e1501d4513bc2164d833cfe9636dab20400080b09e53f155c6e1442a1231fb + languageName: node + linkType: hard + "remark-smartypants@npm:^3.0.2": version: 3.0.2 resolution: "remark-smartypants@npm:3.0.2" @@ -7927,6 +8576,96 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.43.0": + version: 4.55.2 + resolution: "rollup@npm:4.55.2" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.55.2" + "@rollup/rollup-android-arm64": "npm:4.55.2" + "@rollup/rollup-darwin-arm64": "npm:4.55.2" + "@rollup/rollup-darwin-x64": "npm:4.55.2" + "@rollup/rollup-freebsd-arm64": "npm:4.55.2" + "@rollup/rollup-freebsd-x64": "npm:4.55.2" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.55.2" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.55.2" + "@rollup/rollup-linux-arm64-gnu": "npm:4.55.2" + "@rollup/rollup-linux-arm64-musl": "npm:4.55.2" + "@rollup/rollup-linux-loong64-gnu": "npm:4.55.2" + "@rollup/rollup-linux-loong64-musl": "npm:4.55.2" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.55.2" + "@rollup/rollup-linux-ppc64-musl": "npm:4.55.2" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.55.2" + "@rollup/rollup-linux-riscv64-musl": "npm:4.55.2" + "@rollup/rollup-linux-s390x-gnu": "npm:4.55.2" + "@rollup/rollup-linux-x64-gnu": "npm:4.55.2" + "@rollup/rollup-linux-x64-musl": "npm:4.55.2" + "@rollup/rollup-openbsd-x64": "npm:4.55.2" + "@rollup/rollup-openharmony-arm64": "npm:4.55.2" + "@rollup/rollup-win32-arm64-msvc": "npm:4.55.2" + "@rollup/rollup-win32-ia32-msvc": "npm:4.55.2" + "@rollup/rollup-win32-x64-gnu": "npm:4.55.2" + "@rollup/rollup-win32-x64-msvc": "npm:4.55.2" + "@types/estree": "npm:1.0.8" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loong64-gnu": + optional: true + "@rollup/rollup-linux-loong64-musl": + optional: true + "@rollup/rollup-linux-ppc64-gnu": + optional: true + "@rollup/rollup-linux-ppc64-musl": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-riscv64-musl": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-openbsd-x64": + optional: true + "@rollup/rollup-openharmony-arm64": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-gnu": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/0b18e107147e905491f96e993cb97609e05f518cf6a388b521edbf8c4d4789bbf8476d960c1671be370e770aeaa4479399fe4483ccf001c3bd593cbc2fd26483 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -8232,6 +8971,13 @@ __metadata: languageName: node linkType: hard +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 10c0/3def8f8e516fbb34cb6ae415b07ccc5d9c018d85b4b8611e3dc6f8be6d1899f693a4382913c9ed51a06babb5201639d76453ab297d1c54a456544acf5c892e34 + languageName: node + linkType: hard + "signal-exit@npm:^4.0.1": version: 4.1.0 resolution: "signal-exit@npm:4.1.0" @@ -8325,6 +9071,20 @@ __metadata: languageName: node linkType: hard +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 10c0/89a1416668f950236dd5ac9f9a6b2588e1b9b62b1b6ad8dff1bfc5d1a15dbf0aafc9b52d2226d00c28dffff212da464eaeebfc6b7578b9d180cef3e3782c5983 + languageName: node + linkType: hard + +"std-env@npm:^3.10.0": + version: 3.10.0 + resolution: "std-env@npm:3.10.0" + checksum: 10c0/1814927a45004d36dde6707eaf17552a546769bc79a6421be2c16ce77d238158dfe5de30910b78ec30d95135cc1c59ea73ee22d2ca170f8b9753f84da34c427f + languageName: node + linkType: hard + "stop-iteration-iterator@npm:^1.1.0": version: 1.1.0 resolution: "stop-iteration-iterator@npm:1.1.0" @@ -8635,6 +9395,20 @@ __metadata: languageName: node linkType: hard +"tinybench@npm:^2.9.0": + version: 2.9.0 + resolution: "tinybench@npm:2.9.0" + checksum: 10c0/c3500b0f60d2eb8db65250afe750b66d51623057ee88720b7f064894a6cb7eb93360ca824a60a31ab16dab30c7b1f06efe0795b352e37914a9d4bad86386a20c + languageName: node + linkType: hard + +"tinyexec@npm:^1.0.2": + version: 1.0.2 + resolution: "tinyexec@npm:1.0.2" + checksum: 10c0/1261a8e34c9b539a9aae3b7f0bb5372045ff28ee1eba035a2a059e532198fe1a182ec61ac60fa0b4a4129f0c4c4b1d2d57355b5cb9aa2d17ac9454ecace502ee + languageName: node + linkType: hard + "tinyglobby@npm:^0.2.15": version: 0.2.15 resolution: "tinyglobby@npm:0.2.15" @@ -8645,6 +9419,13 @@ __metadata: languageName: node linkType: hard +"tinyrainbow@npm:^3.0.3": + version: 3.0.3 + resolution: "tinyrainbow@npm:3.0.3" + checksum: 10c0/1e799d35cd23cabe02e22550985a3051dc88814a979be02dc632a159c393a998628eacfc558e4c746b3006606d54b00bcdea0c39301133956d10a27aa27e988c + languageName: node + linkType: hard + "to-fast-properties@npm:^2.0.0": version: 2.0.0 resolution: "to-fast-properties@npm:2.0.0" @@ -9162,6 +9943,120 @@ __metadata: languageName: node linkType: hard +"vite@npm:^6.0.0 || ^7.0.0": + version: 7.3.1 + resolution: "vite@npm:7.3.1" + dependencies: + esbuild: "npm:^0.27.0" + fdir: "npm:^6.5.0" + fsevents: "npm:~2.3.3" + picomatch: "npm:^4.0.3" + postcss: "npm:^8.5.6" + rollup: "npm:^4.43.0" + tinyglobby: "npm:^0.2.15" + peerDependencies: + "@types/node": ^20.19.0 || >=22.12.0 + jiti: ">=1.21.0" + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: ">=0.54.8" + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/5c7548f5f43a23533e53324304db4ad85f1896b1bfd3ee32ae9b866bac2933782c77b350eb2b52a02c625c8ad1ddd4c000df077419410650c982cd97fde8d014 + languageName: node + linkType: hard + +"vitest@npm:^4.0.17": + version: 4.0.17 + resolution: "vitest@npm:4.0.17" + dependencies: + "@vitest/expect": "npm:4.0.17" + "@vitest/mocker": "npm:4.0.17" + "@vitest/pretty-format": "npm:4.0.17" + "@vitest/runner": "npm:4.0.17" + "@vitest/snapshot": "npm:4.0.17" + "@vitest/spy": "npm:4.0.17" + "@vitest/utils": "npm:4.0.17" + es-module-lexer: "npm:^1.7.0" + expect-type: "npm:^1.2.2" + magic-string: "npm:^0.30.21" + obug: "npm:^2.1.1" + pathe: "npm:^2.0.3" + picomatch: "npm:^4.0.3" + std-env: "npm:^3.10.0" + tinybench: "npm:^2.9.0" + tinyexec: "npm:^1.0.2" + tinyglobby: "npm:^0.2.15" + tinyrainbow: "npm:^3.0.3" + vite: "npm:^6.0.0 || ^7.0.0" + why-is-node-running: "npm:^2.3.0" + peerDependencies: + "@edge-runtime/vm": "*" + "@opentelemetry/api": ^1.9.0 + "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0 + "@vitest/browser-playwright": 4.0.17 + "@vitest/browser-preview": 4.0.17 + "@vitest/browser-webdriverio": 4.0.17 + "@vitest/ui": 4.0.17 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@opentelemetry/api": + optional: true + "@types/node": + optional: true + "@vitest/browser-playwright": + optional: true + "@vitest/browser-preview": + optional: true + "@vitest/browser-webdriverio": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: 10c0/e1648bbfe2d01e23ceb6856863344035d2a1c139f39e8b15859e6ea8dc510ac3ba425df7c45486492d85ca516472aa892540dfd11ab6ad0613be98fd56d40716 + languageName: node + linkType: hard + "web-namespaces@npm:^2.0.0": version: 2.0.1 resolution: "web-namespaces@npm:2.0.1" @@ -9265,6 +10160,18 @@ __metadata: languageName: node linkType: hard +"why-is-node-running@npm:^2.3.0": + version: 2.3.0 + resolution: "why-is-node-running@npm:2.3.0" + dependencies: + siginfo: "npm:^2.0.0" + stackback: "npm:0.0.2" + bin: + why-is-node-running: cli.js + checksum: 10c0/1cde0b01b827d2cf4cb11db962f3958b9175d5d9e7ac7361d1a7b0e2dc6069a263e69118bd974c4f6d0a890ef4eedfe34cf3d5167ec14203dbc9a18620537054 + languageName: node + linkType: hard + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0"