├── .gitignore ├── .editorconfig ├── src ├── testdata │ ├── gh2.ts │ ├── gh6.ts │ ├── gh10.ts │ ├── gh7.ts │ ├── infer.ts │ ├── input.ts │ └── typedoc_gh2808.ts ├── plugin.ts └── test │ └── plugin.test.mts ├── dprint.json ├── README.md ├── tsconfig.json ├── .vscode └── launch.json ├── .github └── workflows │ ├── ci.yml │ ├── pages.yml │ └── publish.yml ├── LICENSE ├── CHANGELOG.md ├── package.json └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | docs 3 | *.tgz 4 | dist 5 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # https://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | indent_style = space 8 | indent_size = 4 9 | end_of_line = lf 10 | insert_final_newline = true 11 | trim_trailing_whitespace = true 12 | -------------------------------------------------------------------------------- /src/testdata/gh2.ts: -------------------------------------------------------------------------------- 1 | import { number, object, string, TypeOf, unknown } from "zod"; 2 | 3 | export const Foo = object({ 4 | a: string(), 5 | b: number(), 6 | c: unknown(), 7 | }); 8 | 9 | export type Foo = TypeOf; 10 | -------------------------------------------------------------------------------- /src/testdata/gh6.ts: -------------------------------------------------------------------------------- 1 | import { number, object, string, TypeOf, unknown } from "zod"; 2 | 3 | export const Foo = object({ 4 | a: string(), 5 | b: number(), 6 | c: unknown(), 7 | }); 8 | 9 | export type Foo = TypeOf; 10 | -------------------------------------------------------------------------------- /src/testdata/gh10.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod/v4"; 2 | 3 | export const abc = z.object({ 4 | inner: z.object({ 5 | arr: z.array(z.number()), 6 | }), 7 | }); 8 | 9 | export type InferAbc = z.infer; 10 | export type TypeOfAbc = z.TypeOf; 11 | -------------------------------------------------------------------------------- /src/testdata/gh7.ts: -------------------------------------------------------------------------------- 1 | import { object, string, TypeOf } from "zod"; 2 | 3 | /** Foo docs */ 4 | export const Foo = object({ 5 | a: string(), 6 | }); 7 | 8 | export type Foo = TypeOf; 9 | 10 | /** Bar docs */ 11 | export const Bar = object({ 12 | b: string(), 13 | }); 14 | 15 | /** Bar type docs */ 16 | export type Bar = TypeOf; 17 | -------------------------------------------------------------------------------- /dprint.json: -------------------------------------------------------------------------------- 1 | { 2 | "indentWidth": 4, 3 | "typescript": { 4 | }, 5 | "json": { 6 | }, 7 | "markdown": { 8 | }, 9 | "excludes": [ 10 | "**/node_modules", 11 | "**/*-lock.json" 12 | ], 13 | "plugins": [ 14 | "https://plugins.dprint.dev/typescript-0.95.7.wasm", 15 | "https://plugins.dprint.dev/json-0.20.0.wasm", 16 | "https://plugins.dprint.dev/markdown-0.18.0.wasm" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # typedoc-plugin-zod 2 | 3 | Improves display of types created with [Zod](https://github.com/colinhacks/zod)'s `z.infer` and `z.input` types. 4 | 5 | ## Usage 6 | 7 | ```bash 8 | npm install --save-dev typedoc-plugin-zod 9 | ``` 10 | 11 | ```jsonc 12 | // typedoc.json 13 | { 14 | "plugin": ["typedoc-plugin-zod"] 15 | } 16 | ``` 17 | 18 | See [an example](https://gerritbirkeland.com/typedoc-plugin-zod/types/Abc.html) of this plugin in action. 19 | 20 | ## Change Log 21 | 22 | See [CHANGELOG.md](./CHANGELOG.md) 23 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2020", 4 | "module": "Node16", 5 | "strict": true, 6 | "isolatedModules": true, 7 | "esModuleInterop": true, 8 | "outDir": "dist", 9 | "types": [] 10 | }, 11 | "include": ["."], 12 | "typedocOptions": { 13 | "readme": "none", 14 | "logLevel": "Verbose", 15 | "outputs": [ 16 | { "name": "html", "path": "./docs" }, 17 | { "name": "json", "path": "./docs/docs.json" } 18 | ] 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible Node.js debug attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Attach", 9 | "port": 9229, 10 | "request": "attach", 11 | "internalConsoleOptions": "openOnSessionStart", 12 | "skipFiles": ["/**"], 13 | "type": "node", 14 | "sourceMaps": true 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: [push, pull_request] 3 | jobs: 4 | build: 5 | runs-on: ubuntu-latest 6 | strategy: 7 | matrix: 8 | node: ["18", "20", "22"] 9 | name: Node ${{ matrix.node }} 10 | steps: 11 | - name: Checkout repository 12 | uses: actions/checkout@v4 13 | - name: Set up Node 14 | uses: actions/setup-node@v4 15 | with: 16 | node-version: ${{ matrix.node }} 17 | - name: Install pnpm 18 | run: npm i -g pnpm@10 19 | - name: Install 20 | run: pnpm install 21 | - name: Build 22 | run: pnpm build 23 | - name: Test 24 | run: pnpm test 25 | - name: Lint 26 | run: pnpm lint 27 | -------------------------------------------------------------------------------- /src/testdata/infer.ts: -------------------------------------------------------------------------------- 1 | import z from "zod"; 2 | 3 | /** 4 | * An example zod object for demonstration. This is declared as: 5 | * 6 | * ```ts 7 | * export const abc = zod.object({ 8 | * prop: zod.string(), 9 | * other: zod.object({ 10 | * arr: zod.array(zod.number()), 11 | * }), 12 | * opt: z.string().optional(), 13 | * def: z.string().default("abc"), 14 | * }); 15 | * ``` 16 | */ 17 | export const abc = z.object({ 18 | prop: z.string(), 19 | other: z.object({ 20 | arr: z.array(z.number()), 21 | }), 22 | opt: z.string().optional(), 23 | def: z.string().default("abc"), 24 | }); 25 | 26 | /** 27 | * Exported type alias which infers its type using the {@link abc} schema. 28 | * 29 | * This is declared as: 30 | * ```ts 31 | * export type Abc = zod.infer; 32 | * ``` 33 | */ 34 | export type Abc = z.infer; 35 | -------------------------------------------------------------------------------- /src/testdata/input.ts: -------------------------------------------------------------------------------- 1 | import z from "zod"; 2 | 3 | /** 4 | * An example zod object for demonstration. This is declared as: 5 | * 6 | * ```ts 7 | * export const abc = zod.object({ 8 | * prop: z.string(), 9 | * other: zod.object({ 10 | * arr: zod.array(zod.number()), 11 | * }), 12 | * opt: z.string().optional(), 13 | * def: z.string().default('abc') 14 | * }); 15 | * ``` 16 | */ 17 | export const abc = z.object({ 18 | prop: z.string(), 19 | other: z.object({ 20 | arr: z.array(z.number()), 21 | }), 22 | opt: z.string().optional(), 23 | def: z.string().default("abc"), 24 | }); 25 | 26 | /** 27 | * Exported type alias which infers its input type using the {@link abc} schema. 28 | * 29 | * This is declared as: 30 | * ```ts 31 | * export type Abc = zod.input; 32 | * ``` 33 | */ 34 | export type Abc = z.input; 35 | -------------------------------------------------------------------------------- /.github/workflows/pages.yml: -------------------------------------------------------------------------------- 1 | name: GitHub Pages 2 | on: 3 | push: 4 | branches: 5 | - main 6 | workflow_dispatch: 7 | jobs: 8 | build-docs: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Checkout repository 12 | uses: actions/checkout@v4 13 | - name: Set up Node 14 | uses: actions/setup-node@v4 15 | with: 16 | node-version: "20" 17 | - name: Install pnpm 18 | run: npm i -g pnpm@10 19 | - name: Install 20 | run: pnpm i 21 | - name: Build 22 | run: pnpm build 23 | - name: Build docs 24 | run: pnpm doc src/testdata/infer.ts 25 | - name: Deploy 26 | uses: JamesIves/github-pages-deploy-action@v4.4.1 27 | with: 28 | branch: gh-pages 29 | folder: docs 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2023 Gerrit Birkeland 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ### v1.4.3 (2025-10-11) 2 | 3 | - No behavior changes, migrated release workflow to use trusted publishing. 4 | 5 | ### v1.4.2 (2025-06-14) 6 | 7 | - Fixed handling of zod types created by importing `zod/v4`, #10. 8 | 9 | ### v1.4.1 (2025-03-12) 10 | 11 | - Fix broken type alias resolution with TypeDoc 0.28, #9. 12 | 13 | ### v1.4.0 (2025-03-02) 14 | 15 | - Support TypeDoc 0.28 16 | 17 | ### v1.3.1 (2024-12-14) 18 | 19 | - Fixed broken links to type properties for types created with this plugin, TypeStrong/typedoc#2808. 20 | 21 | ### v1.3.0 (2024-11-24) 22 | 23 | - Support TypeDoc 0.27. 24 | 25 | ### v1.2.1 (2024-08-18) 26 | 27 | - Fix warnings about referenced but not present reflections in packages mode, #6. 28 | - Copy comments from schema object declaration to type alias, #7. 29 | 30 | ### v1.2.0 (2024-06-22) 31 | 32 | - Support TypeDoc 0.26. 33 | 34 | ### v1.1.2 (2024-01-06) 35 | 36 | - Added support for the `z.input` type, #3. 37 | 38 | ### v1.1.1 (2023-12-26) 39 | 40 | - Fixed conversion of symbols where the same name is used for a type and variable, #2. 41 | 42 | ### v1.1.0 (2023-08-25) 43 | 44 | - Add support for TypeDoc 0.25.x 45 | 46 | ### v1.0.2 47 | 48 | - Update peer dependency to allow TypeDoc 0.24 49 | 50 | ### v1.0.1 51 | 52 | - Add GitHub links to NPM package 53 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typedoc-plugin-zod", 3 | "version": "1.4.3", 4 | "description": "TypeDoc plugin which replaces z.infer with the inferred type", 5 | "main": "dist/plugin.js", 6 | "type": "module", 7 | "scripts": { 8 | "build": "tsc", 9 | "lint": "dprint check", 10 | "test": "vitest run", 11 | "doc": "typedoc --plugin ./dist/plugin.js" 12 | }, 13 | "keywords": [ 14 | "typedoc-plugin" 15 | ], 16 | "author": "Gerrit Birkeland ", 17 | "license": "MIT", 18 | "devDependencies": { 19 | "@types/node": "^20.14.8", 20 | "dprint": "^0.50.0", 21 | "outdent": "^0.8.0", 22 | "typedoc": "^0.28.5", 23 | "typescript": "^5.8.3", 24 | "vitest": "^3.2.3", 25 | "zod": "^3.25.64" 26 | }, 27 | "peerDependencies": { 28 | "typedoc": "0.23.x || 0.24.x || 0.25.x || 0.26.x || 0.27.x || 0.28.x" 29 | }, 30 | "files": [ 31 | "dist/plugin.js" 32 | ], 33 | "repository": { 34 | "type": "git", 35 | "url": "git://github.com/Gerrit0/typedoc-plugin-zod.git" 36 | }, 37 | "bugs": { 38 | "url": "https://github.com/Gerrit0/typedoc-plugin-zod/issues" 39 | }, 40 | "pnpm": { 41 | "onlyBuiltDependencies": [ 42 | "dprint", 43 | "esbuild" 44 | ] 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish 2 | on: 3 | push: 4 | branches: 5 | - main 6 | 7 | permissions: 8 | id-token: write # Required for OIDC 9 | contents: write # Required for git tag 10 | 11 | jobs: 12 | npm-publish: 13 | name: npm-publish 14 | runs-on: ubuntu-latest 15 | steps: 16 | - name: Checkout repository 17 | uses: actions/checkout@v4 18 | with: 19 | fetch-depth: 0 20 | - id: check 21 | uses: EndBug/version-check@v2 22 | with: 23 | diff-search: true 24 | - name: Set up Node 25 | if: steps.check.outputs.changed == 'true' 26 | uses: actions/setup-node@v4 27 | with: 28 | node-version: "20" 29 | - name: Upgrade npm # Hack to deal with needing a new version for OIDC 30 | if: steps.check.outputs.changed == 'true' 31 | run: npm install -g npm@11 32 | - name: Install pnpm 33 | if: steps.check.outputs.changed == 'true' 34 | run: npm i -g pnpm@10 35 | - name: Install 36 | if: steps.check.outputs.changed == 'true' 37 | run: pnpm install 38 | - name: Build 39 | if: steps.check.outputs.changed == 'true' 40 | run: pnpm build 41 | - name: Publish 42 | if: steps.check.outputs.changed == 'true' 43 | run: | 44 | pnpm publish 45 | git tag v$(jq .version package.json -r) 46 | git push --tags 47 | -------------------------------------------------------------------------------- /src/testdata/typedoc_gh2808.ts: -------------------------------------------------------------------------------- 1 | // See https://github.com/TypeStrong/typedoc/issues/2808 2 | 3 | import { z } from "zod"; 4 | 5 | export const foo = { 6 | /** foo a property */ 7 | a: "", 8 | /** foo b property */ 9 | b: "", 10 | }; 11 | export type FooType = typeof foo; 12 | /** @useDeclaredType */ 13 | export type FooTypeDT = typeof foo; 14 | export type FooExplicit = { 15 | /** FooExplicit a property */ 16 | a: string; 17 | /** FooExplicit b property */ 18 | b: string; 19 | }; 20 | export const zfoo = z.object({ 21 | /** ZodFoo a property */ 22 | a: z.string(), 23 | /** ZodFoo b property */ 24 | b: z.string(), 25 | }); 26 | export type ZodFoo = z.infer; 27 | /** @useDeclaredType */ 28 | export type ZodFooDT = z.infer; 29 | 30 | /** 31 | * Link Tests 32 | * 33 | * {@link foo} | {@link foo.a} 34 | * 35 | * {@link FooType} | {@link FooType.a} 36 | * 37 | * {@link FooTypeDT} | {@link FooTypeDT.a} 38 | * 39 | * {@link FooExplicit} | {@link FooExplicit.a} 40 | * 41 | * {@link ZodFoo} | {@link ZodFoo#a} 42 | * 43 | * {@link ZodFooDT} | {@link ZodFooDT#a} 44 | */ 45 | export const doSomething = () => {}; 46 | 47 | const CollectionConfigSchema = z.object({ 48 | /** 49 | * base property 50 | * 51 | * Link to Options.collections property - {@link Options#collections collections} 52 | * 53 | * Link to Options.collectionBase - {@link Options#collectionBase collectionBase} 54 | * 55 | * Link to CollectionConfig.base - {@link CollectionConfig#base base} 56 | * 57 | * Link to CollectionConfig.name - {@link CollectionConfig#name name} 58 | */ 59 | base: z.string().optional(), 60 | name: z.string().optional(), 61 | }); 62 | 63 | const OptionsSchema = z.object({ 64 | /** 65 | * collectionBase property 66 | * 67 | * Link to Options.collections property - {@link Options#collections collections} 68 | * 69 | * Link to Options.collectionBase - {@link Options#collectionBase collectionBase} 70 | * 71 | * Link to CollectionConfig.base - {@link CollectionConfig#base base} 72 | * 73 | * Link to CollectionConfig.name - {@link CollectionConfig#name name} 74 | */ 75 | collectionBase: z.string().optional(), 76 | // Problem happens with this line 77 | collections: z.record(CollectionConfigSchema).default({}), 78 | // But does not happen with this line 79 | // collections: z.record(z.object({ base: z.string().optional(), name: z.string().optional()})).default({}), 80 | base: z.string().optional(), 81 | }); 82 | 83 | export interface Options extends z.input {} 84 | export interface CollectionConfig extends z.input {} 85 | -------------------------------------------------------------------------------- /src/plugin.ts: -------------------------------------------------------------------------------- 1 | import { 2 | type Application, 3 | type Context, 4 | Converter, 5 | DeclarationReflection, 6 | IntrinsicType, 7 | makeRecursiveVisitor, 8 | ReferenceType, 9 | Reflection, 10 | ReflectionKind, 11 | TypeScript as ts, 12 | } from "typedoc"; 13 | 14 | export function load(app: Application) { 15 | // schema type alias -> referenced validator 16 | const schemaTypes = new Map(); 17 | 18 | app.converter.on(Converter.EVENT_CREATE_DECLARATION, onCreateDeclaration); 19 | app.converter.on( 20 | Converter.EVENT_RESOLVE_BEGIN, 21 | (context: Context) => { 22 | const typeCleanup = makeRecursiveVisitor({ 23 | reflection: (type) => { 24 | context.project.removeReflection(type.declaration); 25 | }, 26 | }); 27 | 28 | for (const [inferredType, refOrig] of schemaTypes) { 29 | if ( 30 | refOrig.reflection instanceof DeclarationReflection 31 | && refOrig.reflection.type instanceof ReferenceType 32 | ) { 33 | refOrig.reflection.type.typeArguments?.forEach((t) => t.visit(typeCleanup)); 34 | refOrig.reflection.type.typeArguments = [ 35 | ReferenceType.createResolvedReference( 36 | inferredType.name, 37 | inferredType, 38 | context.project, 39 | ), 40 | ]; 41 | 42 | inferredType.comment ??= refOrig.reflection.comment?.clone(); 43 | } 44 | } 45 | 46 | schemaTypes.clear(); 47 | }, 48 | 2000, 49 | ); 50 | 51 | function onCreateDeclaration( 52 | context: Context, 53 | refl: DeclarationReflection, 54 | ) { 55 | if ("deferConversion" in context.converter) { 56 | // In 0.28, the `type` member of type aliases isn't set yet, so we need 57 | // to wait until deferred conversion steps are happening to check it. 58 | // This isn't really what that hook was intended for originally, but seems 59 | // like an appropriate use for this plugin. 60 | context.converter.deferConversion(() => { 61 | resolveTypeAliasTypes(context, refl); 62 | }); 63 | } else { 64 | resolveTypeAliasTypes(context, refl); 65 | } 66 | } 67 | 68 | function resolveTypeAliasTypes(context: Context, refl: DeclarationReflection) { 69 | // Check if this is a type alias which points to a zod schema 70 | // This is a rather unfortunate way to do this check... Zod's type structure 71 | // has changed somewhat between v3 and v4, so we have to check several names. 72 | // TypeDoc doesn't track scoped imports (zod vs zod/v4) so that doesn't need 73 | // to be checked here. 74 | if ( 75 | !refl.kindOf(ReflectionKind.TypeAlias) 76 | || refl.type?.type !== "reference" 77 | || refl.type.package !== "zod" 78 | || !["TypeOf", "input", "output"].includes(refl.type.qualifiedName) 79 | ) { 80 | return; 81 | } 82 | 83 | const originalRef = refl.type.typeArguments?.[0]?.visit({ 84 | query: (t) => t.queryType, 85 | }); 86 | 87 | const declaration = getSymbolFromReflection(context, refl) 88 | ?.getDeclarations() 89 | ?.find(ts.isTypeAliasDeclaration); 90 | if (!declaration) return; 91 | 92 | const type = context.getTypeAtLocation(declaration); 93 | refl.type.visit( 94 | makeRecursiveVisitor({ 95 | reflection: (type) => { 96 | context.project.removeReflection(type.declaration); 97 | }, 98 | }), 99 | ); 100 | if (type) { 101 | refl.type = context.converter.convertType( 102 | context.withScope(refl), 103 | type, 104 | ); 105 | } else { 106 | refl.type = new IntrinsicType("any"); 107 | } 108 | 109 | if (originalRef) { 110 | schemaTypes.set(refl, originalRef); 111 | } 112 | } 113 | } 114 | 115 | function getSymbolFromReflection(context: Context, refl: Reflection): ts.Symbol | undefined { 116 | if ("getSymbolFromReflection" in context) { 117 | // 0.28 118 | return context.getSymbolFromReflection(refl); 119 | } 120 | 121 | // <0.28 122 | return (refl.project as any).getSymbolFromReflection(refl); 123 | } 124 | -------------------------------------------------------------------------------- /src/test/plugin.test.mts: -------------------------------------------------------------------------------- 1 | import { outdent } from "outdent"; 2 | import { 3 | Application, 4 | Comment, 5 | DeclarationReflection, 6 | normalizePath, 7 | ProjectReflection, 8 | ReflectionType, 9 | TSConfigReader, 10 | TypeScript as ts, 11 | } from "typedoc"; 12 | import { beforeAll, expect, test } from "vitest"; 13 | import { load } from "../plugin.js"; 14 | 15 | let app: Application; 16 | let program: ts.Program; 17 | 18 | function convert(entry: string) { 19 | const sourceFile = program.getSourceFile( 20 | `${process.cwd()}/src/testdata/${entry}`.replace(/\\/g, "/"), 21 | )!; 22 | 23 | return app.converter.convert([ 24 | { 25 | displayName: entry, 26 | program, 27 | sourceFile, 28 | }, 29 | ]); 30 | } 31 | 32 | function getComment(project: ProjectReflection, path: string) { 33 | const refl = project.getChildByName(path); 34 | return Comment.combineDisplayParts(refl?.comment?.summary); 35 | } 36 | 37 | beforeAll(async () => { 38 | app = await Application.bootstrap( 39 | { 40 | entryPoints: ["src/testdata/infer.ts"], 41 | }, 42 | [new TSConfigReader()], 43 | ); 44 | load(app); 45 | 46 | const entryPoints = app.getEntryPoints(); 47 | expect(entryPoints).toBeDefined(); 48 | program = entryPoints![0].program; 49 | }); 50 | 51 | test("infer.ts", () => { 52 | const project = convert("infer.ts"); 53 | const typeDeclaration = project.getChildByName( 54 | "Abc", 55 | ) as DeclarationReflection; 56 | expect(typeDeclaration.toStringHierarchy()).toBe(outdent` 57 | TypeAlias Abc: { def: string; opt?: string; other: { arr: number[] }; prop: string } 58 | TypeLiteral __type 59 | Property def: string 60 | Property opt: string 61 | Property other: { arr: number[] } 62 | TypeLiteral __type 63 | Property arr: number[] 64 | Property prop: string 65 | `); 66 | 67 | const schemaDeclaration = project.getChildByName( 68 | "abc", 69 | ) as DeclarationReflection; 70 | expect(schemaDeclaration.toStringHierarchy()).toBe( 71 | "Variable abc: ZodObject", 72 | ); 73 | 74 | expect( 75 | (typeDeclaration.type as ReflectionType)!.declaration!.getChildByName( 76 | "def", 77 | )!.flags.isOptional, 78 | ).toBe(false); 79 | }); 80 | 81 | test("input.ts", () => { 82 | const project = convert("input.ts"); 83 | const typeDeclaration = project.getChildByName( 84 | "Abc", 85 | ) as DeclarationReflection; 86 | expect(typeDeclaration.toStringHierarchy()).toBe(outdent` 87 | TypeAlias Abc: { def?: string; opt?: string; other: { arr: number[] }; prop: string } 88 | TypeLiteral __type 89 | Property def: string 90 | Property opt: string 91 | Property other: { arr: number[] } 92 | TypeLiteral __type 93 | Property arr: number[] 94 | Property prop: string 95 | `); 96 | 97 | const schemaDeclaration = project.getChildByName( 98 | "abc", 99 | ) as DeclarationReflection; 100 | expect(schemaDeclaration.toStringHierarchy()).toBe( 101 | "Variable abc: ZodObject", 102 | ); 103 | 104 | expect( 105 | (typeDeclaration.type as ReflectionType)!.declaration!.getChildByName( 106 | "def", 107 | )!.flags.isOptional, 108 | ).toBe(true); 109 | }); 110 | 111 | test("Schemas which have multiple declarations, #2", () => { 112 | const project = convert("gh2.ts"); 113 | 114 | expect(project.toStringHierarchy()).toBe(outdent` 115 | Project typedoc-plugin-zod 116 | TypeAlias Foo: { a: string; b: number; c?: unknown } 117 | TypeLiteral __type 118 | Property a: string 119 | Property b: number 120 | Property c: unknown 121 | Variable Foo: ZodObject 122 | `); 123 | }); 124 | 125 | test("Serialized/deserialized projects do not create warnings, #6", () => { 126 | const project = convert("gh6.ts"); 127 | const ser = app.serializer.projectToObject(project, normalizePath(process.cwd())); 128 | app.deserializer.reviveProject("gh6", ser, { 129 | projectRoot: normalizePath(process.cwd()), 130 | registry: project.files, 131 | }); 132 | 133 | expect(project.toStringHierarchy()).toBe(outdent` 134 | Project typedoc-plugin-zod 135 | TypeAlias Foo: { a: string; b: number; c?: unknown } 136 | TypeLiteral __type 137 | Property a: string 138 | Property b: number 139 | Property c: unknown 140 | Variable Foo: ZodObject 141 | `); 142 | 143 | expect(app.logger.hasWarnings()).toBe(false); 144 | }); 145 | 146 | test("Comments on type aliases, #7", () => { 147 | const project = convert("gh7.ts"); 148 | 149 | expect(project.toStringHierarchy()).toBe(outdent` 150 | Project typedoc-plugin-zod 151 | TypeAlias Bar: { b: string } 152 | TypeLiteral __type 153 | Property b: string 154 | TypeAlias Foo: { a: string } 155 | TypeLiteral __type 156 | Property a: string 157 | Variable Bar: ZodObject 158 | Variable Foo: ZodObject 159 | `); 160 | 161 | const comments = ["Bar type docs", "Foo docs", "Bar docs", "Foo docs"]; 162 | const actualComments = project.children?.map((c) => Comment.combineDisplayParts(c.comment?.summary)); 163 | expect(actualComments).toEqual(comments); 164 | }); 165 | 166 | test("Support for Zod version 4, #10", () => { 167 | const project = convert("gh10.ts"); 168 | 169 | console.log(project.toStringHierarchy()); 170 | 171 | expect(project.toStringHierarchy()).toBe(outdent` 172 | Project typedoc-plugin-zod 173 | TypeAlias InferAbc: { inner: { arr: number[] } } 174 | TypeLiteral __type 175 | Property inner: { arr: number[] } 176 | TypeLiteral __type 177 | Property arr: number[] 178 | TypeAlias TypeOfAbc: { inner: { arr: number[] } } 179 | TypeLiteral __type 180 | Property inner: { arr: number[] } 181 | TypeLiteral __type 182 | Property arr: number[] 183 | Variable abc: ZodObject 184 | `); 185 | }); 186 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@types/node': 12 | specifier: ^20.14.8 13 | version: 20.17.22 14 | dprint: 15 | specifier: ^0.50.0 16 | version: 0.50.0 17 | outdent: 18 | specifier: ^0.8.0 19 | version: 0.8.0 20 | typedoc: 21 | specifier: ^0.28.5 22 | version: 0.28.5(typescript@5.8.3) 23 | typescript: 24 | specifier: ^5.8.3 25 | version: 5.8.3 26 | vitest: 27 | specifier: ^3.2.3 28 | version: 3.2.3(@types/node@20.17.22)(yaml@2.7.1) 29 | zod: 30 | specifier: ^3.25.64 31 | version: 3.25.64 32 | 33 | packages: 34 | 35 | '@dprint/darwin-arm64@0.50.0': 36 | resolution: {integrity: sha512-KqWpsvm4JveYdKDLSLlQINGNW4pEAGHcTFPEHR5qXMYV4pPomLgHHPyBrxe3XdGtlUp4I8HfvBMBw3b/LKd06A==} 37 | cpu: [arm64] 38 | os: [darwin] 39 | 40 | '@dprint/darwin-x64@0.50.0': 41 | resolution: {integrity: sha512-kFeeLYhCIVAe1SMtFYk1q0qWxrkmW8FhOBTUh2oblr4AnAjpjb03m8BVUrHHKFeBTsppwck+1b8hzU6LRZO7fA==} 42 | cpu: [x64] 43 | os: [darwin] 44 | 45 | '@dprint/linux-arm64-glibc@0.50.0': 46 | resolution: {integrity: sha512-EL0+uMSdj/n+cZOP9ZO8ndvjmtOSWXNsMHKdAAaTG0+EjH9M9YKXD6kopP6PKOR5pJuiyHCRpVKJ4xoD4adfpQ==} 47 | cpu: [arm64] 48 | os: [linux] 49 | 50 | '@dprint/linux-arm64-musl@0.50.0': 51 | resolution: {integrity: sha512-bzyYxKtFw/hYAA+7lWQGQGo2YFPnH7Ql9uWxxWqiGaWVPU66K9WQt0RUEqu1hQBrCk9mMz3jx5l4oKWQ/Dc0fw==} 52 | cpu: [arm64] 53 | os: [linux] 54 | 55 | '@dprint/linux-riscv64-glibc@0.50.0': 56 | resolution: {integrity: sha512-ElFqmKs96NyVXWqd2SJGJGtyVmUWNiLUyaImEzL7XZRmpoJG+Ky7SryhccMQU0ENtQmY0CVgZipLZ1SqhIoluA==} 57 | cpu: [riscv64] 58 | os: [linux] 59 | 60 | '@dprint/linux-x64-glibc@0.50.0': 61 | resolution: {integrity: sha512-Kim8TtCdpCQUNqF2D96vunuonYy6tPfp/AQblSVA4ADChVyFLGfPaQIECpGAAKxXnIG2SX5JRQP7nB/4JgPNbA==} 62 | cpu: [x64] 63 | os: [linux] 64 | 65 | '@dprint/linux-x64-musl@0.50.0': 66 | resolution: {integrity: sha512-ChZf0BnS3S6BIfqAPgQKqEh/7vgD1xc0MpcFcTrvkVQHuSdCQu1XiqUN12agzxB+Y5Ml9exgzP8lYgNza7iXvw==} 67 | cpu: [x64] 68 | os: [linux] 69 | 70 | '@dprint/win32-arm64@0.50.0': 71 | resolution: {integrity: sha512-xSY607bRyIPG7UO3uRa5c5wTGHKJqLUkQst85Hcz89EL/It6wswwUSNcywDydssN99HmSHop4fIf6FJTEpEp2g==} 72 | cpu: [arm64] 73 | os: [win32] 74 | 75 | '@dprint/win32-x64@0.50.0': 76 | resolution: {integrity: sha512-uGDjrK88LOet9a8pPRM9nKins93mK2NLozqL/hCNV88Nu5Nk0bBeVwRMAnPapjV3Jo+hsJOeq3Z1ibrq2c3v8w==} 77 | cpu: [x64] 78 | os: [win32] 79 | 80 | '@esbuild/aix-ppc64@0.25.0': 81 | resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} 82 | engines: {node: '>=18'} 83 | cpu: [ppc64] 84 | os: [aix] 85 | 86 | '@esbuild/android-arm64@0.25.0': 87 | resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} 88 | engines: {node: '>=18'} 89 | cpu: [arm64] 90 | os: [android] 91 | 92 | '@esbuild/android-arm@0.25.0': 93 | resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} 94 | engines: {node: '>=18'} 95 | cpu: [arm] 96 | os: [android] 97 | 98 | '@esbuild/android-x64@0.25.0': 99 | resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} 100 | engines: {node: '>=18'} 101 | cpu: [x64] 102 | os: [android] 103 | 104 | '@esbuild/darwin-arm64@0.25.0': 105 | resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} 106 | engines: {node: '>=18'} 107 | cpu: [arm64] 108 | os: [darwin] 109 | 110 | '@esbuild/darwin-x64@0.25.0': 111 | resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} 112 | engines: {node: '>=18'} 113 | cpu: [x64] 114 | os: [darwin] 115 | 116 | '@esbuild/freebsd-arm64@0.25.0': 117 | resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} 118 | engines: {node: '>=18'} 119 | cpu: [arm64] 120 | os: [freebsd] 121 | 122 | '@esbuild/freebsd-x64@0.25.0': 123 | resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} 124 | engines: {node: '>=18'} 125 | cpu: [x64] 126 | os: [freebsd] 127 | 128 | '@esbuild/linux-arm64@0.25.0': 129 | resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} 130 | engines: {node: '>=18'} 131 | cpu: [arm64] 132 | os: [linux] 133 | 134 | '@esbuild/linux-arm@0.25.0': 135 | resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} 136 | engines: {node: '>=18'} 137 | cpu: [arm] 138 | os: [linux] 139 | 140 | '@esbuild/linux-ia32@0.25.0': 141 | resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} 142 | engines: {node: '>=18'} 143 | cpu: [ia32] 144 | os: [linux] 145 | 146 | '@esbuild/linux-loong64@0.25.0': 147 | resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} 148 | engines: {node: '>=18'} 149 | cpu: [loong64] 150 | os: [linux] 151 | 152 | '@esbuild/linux-mips64el@0.25.0': 153 | resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} 154 | engines: {node: '>=18'} 155 | cpu: [mips64el] 156 | os: [linux] 157 | 158 | '@esbuild/linux-ppc64@0.25.0': 159 | resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} 160 | engines: {node: '>=18'} 161 | cpu: [ppc64] 162 | os: [linux] 163 | 164 | '@esbuild/linux-riscv64@0.25.0': 165 | resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} 166 | engines: {node: '>=18'} 167 | cpu: [riscv64] 168 | os: [linux] 169 | 170 | '@esbuild/linux-s390x@0.25.0': 171 | resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} 172 | engines: {node: '>=18'} 173 | cpu: [s390x] 174 | os: [linux] 175 | 176 | '@esbuild/linux-x64@0.25.0': 177 | resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} 178 | engines: {node: '>=18'} 179 | cpu: [x64] 180 | os: [linux] 181 | 182 | '@esbuild/netbsd-arm64@0.25.0': 183 | resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} 184 | engines: {node: '>=18'} 185 | cpu: [arm64] 186 | os: [netbsd] 187 | 188 | '@esbuild/netbsd-x64@0.25.0': 189 | resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} 190 | engines: {node: '>=18'} 191 | cpu: [x64] 192 | os: [netbsd] 193 | 194 | '@esbuild/openbsd-arm64@0.25.0': 195 | resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} 196 | engines: {node: '>=18'} 197 | cpu: [arm64] 198 | os: [openbsd] 199 | 200 | '@esbuild/openbsd-x64@0.25.0': 201 | resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} 202 | engines: {node: '>=18'} 203 | cpu: [x64] 204 | os: [openbsd] 205 | 206 | '@esbuild/sunos-x64@0.25.0': 207 | resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} 208 | engines: {node: '>=18'} 209 | cpu: [x64] 210 | os: [sunos] 211 | 212 | '@esbuild/win32-arm64@0.25.0': 213 | resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} 214 | engines: {node: '>=18'} 215 | cpu: [arm64] 216 | os: [win32] 217 | 218 | '@esbuild/win32-ia32@0.25.0': 219 | resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} 220 | engines: {node: '>=18'} 221 | cpu: [ia32] 222 | os: [win32] 223 | 224 | '@esbuild/win32-x64@0.25.0': 225 | resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} 226 | engines: {node: '>=18'} 227 | cpu: [x64] 228 | os: [win32] 229 | 230 | '@gerrit0/mini-shiki@3.2.3': 231 | resolution: {integrity: sha512-yemSYr0Oiqk5NAQRfbD5DKUTlThiZw1MxTMx/YpQTg6m4QRJDtV2JTYSuNevgx1ayy/O7x+uwDjh3IgECGFY/Q==} 232 | 233 | '@jridgewell/sourcemap-codec@1.5.0': 234 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 235 | 236 | '@rollup/rollup-android-arm-eabi@4.34.9': 237 | resolution: {integrity: sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==} 238 | cpu: [arm] 239 | os: [android] 240 | 241 | '@rollup/rollup-android-arm64@4.34.9': 242 | resolution: {integrity: sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==} 243 | cpu: [arm64] 244 | os: [android] 245 | 246 | '@rollup/rollup-darwin-arm64@4.34.9': 247 | resolution: {integrity: sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==} 248 | cpu: [arm64] 249 | os: [darwin] 250 | 251 | '@rollup/rollup-darwin-x64@4.34.9': 252 | resolution: {integrity: sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==} 253 | cpu: [x64] 254 | os: [darwin] 255 | 256 | '@rollup/rollup-freebsd-arm64@4.34.9': 257 | resolution: {integrity: sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==} 258 | cpu: [arm64] 259 | os: [freebsd] 260 | 261 | '@rollup/rollup-freebsd-x64@4.34.9': 262 | resolution: {integrity: sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==} 263 | cpu: [x64] 264 | os: [freebsd] 265 | 266 | '@rollup/rollup-linux-arm-gnueabihf@4.34.9': 267 | resolution: {integrity: sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==} 268 | cpu: [arm] 269 | os: [linux] 270 | 271 | '@rollup/rollup-linux-arm-musleabihf@4.34.9': 272 | resolution: {integrity: sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==} 273 | cpu: [arm] 274 | os: [linux] 275 | 276 | '@rollup/rollup-linux-arm64-gnu@4.34.9': 277 | resolution: {integrity: sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==} 278 | cpu: [arm64] 279 | os: [linux] 280 | 281 | '@rollup/rollup-linux-arm64-musl@4.34.9': 282 | resolution: {integrity: sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==} 283 | cpu: [arm64] 284 | os: [linux] 285 | 286 | '@rollup/rollup-linux-loongarch64-gnu@4.34.9': 287 | resolution: {integrity: sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==} 288 | cpu: [loong64] 289 | os: [linux] 290 | 291 | '@rollup/rollup-linux-powerpc64le-gnu@4.34.9': 292 | resolution: {integrity: sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==} 293 | cpu: [ppc64] 294 | os: [linux] 295 | 296 | '@rollup/rollup-linux-riscv64-gnu@4.34.9': 297 | resolution: {integrity: sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==} 298 | cpu: [riscv64] 299 | os: [linux] 300 | 301 | '@rollup/rollup-linux-s390x-gnu@4.34.9': 302 | resolution: {integrity: sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==} 303 | cpu: [s390x] 304 | os: [linux] 305 | 306 | '@rollup/rollup-linux-x64-gnu@4.34.9': 307 | resolution: {integrity: sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==} 308 | cpu: [x64] 309 | os: [linux] 310 | 311 | '@rollup/rollup-linux-x64-musl@4.34.9': 312 | resolution: {integrity: sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==} 313 | cpu: [x64] 314 | os: [linux] 315 | 316 | '@rollup/rollup-win32-arm64-msvc@4.34.9': 317 | resolution: {integrity: sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==} 318 | cpu: [arm64] 319 | os: [win32] 320 | 321 | '@rollup/rollup-win32-ia32-msvc@4.34.9': 322 | resolution: {integrity: sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==} 323 | cpu: [ia32] 324 | os: [win32] 325 | 326 | '@rollup/rollup-win32-x64-msvc@4.34.9': 327 | resolution: {integrity: sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==} 328 | cpu: [x64] 329 | os: [win32] 330 | 331 | '@shikijs/engine-oniguruma@3.2.2': 332 | resolution: {integrity: sha512-vyXRnWVCSvokwbaUD/8uPn6Gqsf5Hv7XwcW4AgiU4Z2qwy19sdr6VGzMdheKKN58tJOOe5MIKiNb901bgcUXYQ==} 333 | 334 | '@shikijs/langs@3.2.2': 335 | resolution: {integrity: sha512-NY0Urg2dV9ETt3JIOWoMPuoDNwte3geLZ4M1nrPHbkDS8dWMpKcEwlqiEIGqtwZNmt5gKyWpR26ln2Bg2ecPgw==} 336 | 337 | '@shikijs/themes@3.2.2': 338 | resolution: {integrity: sha512-Zuq4lgAxVKkb0FFdhHSdDkALuRpsj1so1JdihjKNQfgM78EHxV2JhO10qPsMrm01FkE3mDRTdF68wfmsqjt6HA==} 339 | 340 | '@shikijs/types@3.2.2': 341 | resolution: {integrity: sha512-a5TiHk7EH5Lso8sHcLHbVNNhWKP0Wi3yVnXnu73g86n3WoDgEra7n3KszyeCGuyoagspQ2fzvy4cpSc8pKhb0A==} 342 | 343 | '@shikijs/vscode-textmate@10.0.2': 344 | resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} 345 | 346 | '@types/chai@5.2.2': 347 | resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} 348 | 349 | '@types/deep-eql@4.0.2': 350 | resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} 351 | 352 | '@types/estree@1.0.6': 353 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 354 | 355 | '@types/estree@1.0.8': 356 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 357 | 358 | '@types/hast@3.0.4': 359 | resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} 360 | 361 | '@types/node@20.17.22': 362 | resolution: {integrity: sha512-9RV2zST+0s3EhfrMZIhrz2bhuhBwxgkbHEwP2gtGWPjBzVQjifMzJ9exw7aDZhR1wbpj8zBrfp3bo8oJcGiUUw==} 363 | 364 | '@types/unist@3.0.3': 365 | resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} 366 | 367 | '@vitest/expect@3.2.3': 368 | resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==} 369 | 370 | '@vitest/mocker@3.2.3': 371 | resolution: {integrity: sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==} 372 | peerDependencies: 373 | msw: ^2.4.9 374 | vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 375 | peerDependenciesMeta: 376 | msw: 377 | optional: true 378 | vite: 379 | optional: true 380 | 381 | '@vitest/pretty-format@3.2.3': 382 | resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==} 383 | 384 | '@vitest/runner@3.2.3': 385 | resolution: {integrity: sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==} 386 | 387 | '@vitest/snapshot@3.2.3': 388 | resolution: {integrity: sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==} 389 | 390 | '@vitest/spy@3.2.3': 391 | resolution: {integrity: sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==} 392 | 393 | '@vitest/utils@3.2.3': 394 | resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==} 395 | 396 | argparse@2.0.1: 397 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 398 | 399 | assertion-error@2.0.1: 400 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 401 | engines: {node: '>=12'} 402 | 403 | balanced-match@1.0.2: 404 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 405 | 406 | brace-expansion@2.0.1: 407 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 408 | 409 | cac@6.7.14: 410 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 411 | engines: {node: '>=8'} 412 | 413 | chai@5.2.0: 414 | resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} 415 | engines: {node: '>=12'} 416 | 417 | check-error@2.1.1: 418 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 419 | engines: {node: '>= 16'} 420 | 421 | debug@4.4.1: 422 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 423 | engines: {node: '>=6.0'} 424 | peerDependencies: 425 | supports-color: '*' 426 | peerDependenciesMeta: 427 | supports-color: 428 | optional: true 429 | 430 | deep-eql@5.0.2: 431 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 432 | engines: {node: '>=6'} 433 | 434 | dprint@0.50.0: 435 | resolution: {integrity: sha512-aNJhOQsUS5D9k/YkMUaLLniIpxEBUR0ZwT0RXGQV5YpaGwE2nx6FcKuVkC6wRaZXTr8X0NpV/2HFbcvNuI2jtA==} 436 | hasBin: true 437 | 438 | entities@4.5.0: 439 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 440 | engines: {node: '>=0.12'} 441 | 442 | es-module-lexer@1.7.0: 443 | resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 444 | 445 | esbuild@0.25.0: 446 | resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} 447 | engines: {node: '>=18'} 448 | hasBin: true 449 | 450 | estree-walker@3.0.3: 451 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 452 | 453 | expect-type@1.2.1: 454 | resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} 455 | engines: {node: '>=12.0.0'} 456 | 457 | fdir@6.4.6: 458 | resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} 459 | peerDependencies: 460 | picomatch: ^3 || ^4 461 | peerDependenciesMeta: 462 | picomatch: 463 | optional: true 464 | 465 | fsevents@2.3.3: 466 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 467 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 468 | os: [darwin] 469 | 470 | js-tokens@9.0.1: 471 | resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} 472 | 473 | linkify-it@5.0.0: 474 | resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} 475 | 476 | loupe@3.1.3: 477 | resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} 478 | 479 | lunr@2.3.9: 480 | resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} 481 | 482 | magic-string@0.30.17: 483 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 484 | 485 | markdown-it@14.1.0: 486 | resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} 487 | hasBin: true 488 | 489 | mdurl@2.0.0: 490 | resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} 491 | 492 | minimatch@9.0.5: 493 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 494 | engines: {node: '>=16 || 14 >=14.17'} 495 | 496 | ms@2.1.3: 497 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 498 | 499 | nanoid@3.3.8: 500 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 501 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 502 | hasBin: true 503 | 504 | outdent@0.8.0: 505 | resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} 506 | 507 | pathe@2.0.3: 508 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 509 | 510 | pathval@2.0.0: 511 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 512 | engines: {node: '>= 14.16'} 513 | 514 | picocolors@1.1.1: 515 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 516 | 517 | picomatch@4.0.2: 518 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 519 | engines: {node: '>=12'} 520 | 521 | postcss@8.5.3: 522 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 523 | engines: {node: ^10 || ^12 || >=14} 524 | 525 | punycode.js@2.3.1: 526 | resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} 527 | engines: {node: '>=6'} 528 | 529 | rollup@4.34.9: 530 | resolution: {integrity: sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==} 531 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 532 | hasBin: true 533 | 534 | siginfo@2.0.0: 535 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 536 | 537 | source-map-js@1.2.1: 538 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 539 | engines: {node: '>=0.10.0'} 540 | 541 | stackback@0.0.2: 542 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 543 | 544 | std-env@3.9.0: 545 | resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} 546 | 547 | strip-literal@3.0.0: 548 | resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} 549 | 550 | tinybench@2.9.0: 551 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 552 | 553 | tinyexec@0.3.2: 554 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 555 | 556 | tinyglobby@0.2.14: 557 | resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} 558 | engines: {node: '>=12.0.0'} 559 | 560 | tinypool@1.1.0: 561 | resolution: {integrity: sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==} 562 | engines: {node: ^18.0.0 || >=20.0.0} 563 | 564 | tinyrainbow@2.0.0: 565 | resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 566 | engines: {node: '>=14.0.0'} 567 | 568 | tinyspy@4.0.3: 569 | resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} 570 | engines: {node: '>=14.0.0'} 571 | 572 | typedoc@0.28.5: 573 | resolution: {integrity: sha512-5PzUddaA9FbaarUzIsEc4wNXCiO4Ot3bJNeMF2qKpYlTmM9TTaSHQ7162w756ERCkXER/+o2purRG6YOAv6EMA==} 574 | engines: {node: '>= 18', pnpm: '>= 10'} 575 | hasBin: true 576 | peerDependencies: 577 | typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x 578 | 579 | typescript@5.8.3: 580 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 581 | engines: {node: '>=14.17'} 582 | hasBin: true 583 | 584 | uc.micro@2.1.0: 585 | resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} 586 | 587 | undici-types@6.19.8: 588 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 589 | 590 | vite-node@3.2.3: 591 | resolution: {integrity: sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==} 592 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 593 | hasBin: true 594 | 595 | vite@6.2.0: 596 | resolution: {integrity: sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==} 597 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 598 | hasBin: true 599 | peerDependencies: 600 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 601 | jiti: '>=1.21.0' 602 | less: '*' 603 | lightningcss: ^1.21.0 604 | sass: '*' 605 | sass-embedded: '*' 606 | stylus: '*' 607 | sugarss: '*' 608 | terser: ^5.16.0 609 | tsx: ^4.8.1 610 | yaml: ^2.4.2 611 | peerDependenciesMeta: 612 | '@types/node': 613 | optional: true 614 | jiti: 615 | optional: true 616 | less: 617 | optional: true 618 | lightningcss: 619 | optional: true 620 | sass: 621 | optional: true 622 | sass-embedded: 623 | optional: true 624 | stylus: 625 | optional: true 626 | sugarss: 627 | optional: true 628 | terser: 629 | optional: true 630 | tsx: 631 | optional: true 632 | yaml: 633 | optional: true 634 | 635 | vitest@3.2.3: 636 | resolution: {integrity: sha512-E6U2ZFXe3N/t4f5BwUaVCKRLHqUpk1CBWeMh78UT4VaTPH/2dyvH6ALl29JTovEPu9dVKr/K/J4PkXgrMbw4Ww==} 637 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 638 | hasBin: true 639 | peerDependencies: 640 | '@edge-runtime/vm': '*' 641 | '@types/debug': ^4.1.12 642 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 643 | '@vitest/browser': 3.2.3 644 | '@vitest/ui': 3.2.3 645 | happy-dom: '*' 646 | jsdom: '*' 647 | peerDependenciesMeta: 648 | '@edge-runtime/vm': 649 | optional: true 650 | '@types/debug': 651 | optional: true 652 | '@types/node': 653 | optional: true 654 | '@vitest/browser': 655 | optional: true 656 | '@vitest/ui': 657 | optional: true 658 | happy-dom: 659 | optional: true 660 | jsdom: 661 | optional: true 662 | 663 | why-is-node-running@2.3.0: 664 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 665 | engines: {node: '>=8'} 666 | hasBin: true 667 | 668 | yaml@2.7.1: 669 | resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} 670 | engines: {node: '>= 14'} 671 | hasBin: true 672 | 673 | zod@3.25.64: 674 | resolution: {integrity: sha512-hbP9FpSZf7pkS7hRVUrOjhwKJNyampPgtXKc3AN6DsWtoHsg2Sb4SQaS4Tcay380zSwd2VPo9G9180emBACp5g==} 675 | 676 | snapshots: 677 | 678 | '@dprint/darwin-arm64@0.50.0': 679 | optional: true 680 | 681 | '@dprint/darwin-x64@0.50.0': 682 | optional: true 683 | 684 | '@dprint/linux-arm64-glibc@0.50.0': 685 | optional: true 686 | 687 | '@dprint/linux-arm64-musl@0.50.0': 688 | optional: true 689 | 690 | '@dprint/linux-riscv64-glibc@0.50.0': 691 | optional: true 692 | 693 | '@dprint/linux-x64-glibc@0.50.0': 694 | optional: true 695 | 696 | '@dprint/linux-x64-musl@0.50.0': 697 | optional: true 698 | 699 | '@dprint/win32-arm64@0.50.0': 700 | optional: true 701 | 702 | '@dprint/win32-x64@0.50.0': 703 | optional: true 704 | 705 | '@esbuild/aix-ppc64@0.25.0': 706 | optional: true 707 | 708 | '@esbuild/android-arm64@0.25.0': 709 | optional: true 710 | 711 | '@esbuild/android-arm@0.25.0': 712 | optional: true 713 | 714 | '@esbuild/android-x64@0.25.0': 715 | optional: true 716 | 717 | '@esbuild/darwin-arm64@0.25.0': 718 | optional: true 719 | 720 | '@esbuild/darwin-x64@0.25.0': 721 | optional: true 722 | 723 | '@esbuild/freebsd-arm64@0.25.0': 724 | optional: true 725 | 726 | '@esbuild/freebsd-x64@0.25.0': 727 | optional: true 728 | 729 | '@esbuild/linux-arm64@0.25.0': 730 | optional: true 731 | 732 | '@esbuild/linux-arm@0.25.0': 733 | optional: true 734 | 735 | '@esbuild/linux-ia32@0.25.0': 736 | optional: true 737 | 738 | '@esbuild/linux-loong64@0.25.0': 739 | optional: true 740 | 741 | '@esbuild/linux-mips64el@0.25.0': 742 | optional: true 743 | 744 | '@esbuild/linux-ppc64@0.25.0': 745 | optional: true 746 | 747 | '@esbuild/linux-riscv64@0.25.0': 748 | optional: true 749 | 750 | '@esbuild/linux-s390x@0.25.0': 751 | optional: true 752 | 753 | '@esbuild/linux-x64@0.25.0': 754 | optional: true 755 | 756 | '@esbuild/netbsd-arm64@0.25.0': 757 | optional: true 758 | 759 | '@esbuild/netbsd-x64@0.25.0': 760 | optional: true 761 | 762 | '@esbuild/openbsd-arm64@0.25.0': 763 | optional: true 764 | 765 | '@esbuild/openbsd-x64@0.25.0': 766 | optional: true 767 | 768 | '@esbuild/sunos-x64@0.25.0': 769 | optional: true 770 | 771 | '@esbuild/win32-arm64@0.25.0': 772 | optional: true 773 | 774 | '@esbuild/win32-ia32@0.25.0': 775 | optional: true 776 | 777 | '@esbuild/win32-x64@0.25.0': 778 | optional: true 779 | 780 | '@gerrit0/mini-shiki@3.2.3': 781 | dependencies: 782 | '@shikijs/engine-oniguruma': 3.2.2 783 | '@shikijs/langs': 3.2.2 784 | '@shikijs/themes': 3.2.2 785 | '@shikijs/types': 3.2.2 786 | '@shikijs/vscode-textmate': 10.0.2 787 | 788 | '@jridgewell/sourcemap-codec@1.5.0': {} 789 | 790 | '@rollup/rollup-android-arm-eabi@4.34.9': 791 | optional: true 792 | 793 | '@rollup/rollup-android-arm64@4.34.9': 794 | optional: true 795 | 796 | '@rollup/rollup-darwin-arm64@4.34.9': 797 | optional: true 798 | 799 | '@rollup/rollup-darwin-x64@4.34.9': 800 | optional: true 801 | 802 | '@rollup/rollup-freebsd-arm64@4.34.9': 803 | optional: true 804 | 805 | '@rollup/rollup-freebsd-x64@4.34.9': 806 | optional: true 807 | 808 | '@rollup/rollup-linux-arm-gnueabihf@4.34.9': 809 | optional: true 810 | 811 | '@rollup/rollup-linux-arm-musleabihf@4.34.9': 812 | optional: true 813 | 814 | '@rollup/rollup-linux-arm64-gnu@4.34.9': 815 | optional: true 816 | 817 | '@rollup/rollup-linux-arm64-musl@4.34.9': 818 | optional: true 819 | 820 | '@rollup/rollup-linux-loongarch64-gnu@4.34.9': 821 | optional: true 822 | 823 | '@rollup/rollup-linux-powerpc64le-gnu@4.34.9': 824 | optional: true 825 | 826 | '@rollup/rollup-linux-riscv64-gnu@4.34.9': 827 | optional: true 828 | 829 | '@rollup/rollup-linux-s390x-gnu@4.34.9': 830 | optional: true 831 | 832 | '@rollup/rollup-linux-x64-gnu@4.34.9': 833 | optional: true 834 | 835 | '@rollup/rollup-linux-x64-musl@4.34.9': 836 | optional: true 837 | 838 | '@rollup/rollup-win32-arm64-msvc@4.34.9': 839 | optional: true 840 | 841 | '@rollup/rollup-win32-ia32-msvc@4.34.9': 842 | optional: true 843 | 844 | '@rollup/rollup-win32-x64-msvc@4.34.9': 845 | optional: true 846 | 847 | '@shikijs/engine-oniguruma@3.2.2': 848 | dependencies: 849 | '@shikijs/types': 3.2.2 850 | '@shikijs/vscode-textmate': 10.0.2 851 | 852 | '@shikijs/langs@3.2.2': 853 | dependencies: 854 | '@shikijs/types': 3.2.2 855 | 856 | '@shikijs/themes@3.2.2': 857 | dependencies: 858 | '@shikijs/types': 3.2.2 859 | 860 | '@shikijs/types@3.2.2': 861 | dependencies: 862 | '@shikijs/vscode-textmate': 10.0.2 863 | '@types/hast': 3.0.4 864 | 865 | '@shikijs/vscode-textmate@10.0.2': {} 866 | 867 | '@types/chai@5.2.2': 868 | dependencies: 869 | '@types/deep-eql': 4.0.2 870 | 871 | '@types/deep-eql@4.0.2': {} 872 | 873 | '@types/estree@1.0.6': {} 874 | 875 | '@types/estree@1.0.8': {} 876 | 877 | '@types/hast@3.0.4': 878 | dependencies: 879 | '@types/unist': 3.0.3 880 | 881 | '@types/node@20.17.22': 882 | dependencies: 883 | undici-types: 6.19.8 884 | 885 | '@types/unist@3.0.3': {} 886 | 887 | '@vitest/expect@3.2.3': 888 | dependencies: 889 | '@types/chai': 5.2.2 890 | '@vitest/spy': 3.2.3 891 | '@vitest/utils': 3.2.3 892 | chai: 5.2.0 893 | tinyrainbow: 2.0.0 894 | 895 | '@vitest/mocker@3.2.3(vite@6.2.0(@types/node@20.17.22)(yaml@2.7.1))': 896 | dependencies: 897 | '@vitest/spy': 3.2.3 898 | estree-walker: 3.0.3 899 | magic-string: 0.30.17 900 | optionalDependencies: 901 | vite: 6.2.0(@types/node@20.17.22)(yaml@2.7.1) 902 | 903 | '@vitest/pretty-format@3.2.3': 904 | dependencies: 905 | tinyrainbow: 2.0.0 906 | 907 | '@vitest/runner@3.2.3': 908 | dependencies: 909 | '@vitest/utils': 3.2.3 910 | pathe: 2.0.3 911 | strip-literal: 3.0.0 912 | 913 | '@vitest/snapshot@3.2.3': 914 | dependencies: 915 | '@vitest/pretty-format': 3.2.3 916 | magic-string: 0.30.17 917 | pathe: 2.0.3 918 | 919 | '@vitest/spy@3.2.3': 920 | dependencies: 921 | tinyspy: 4.0.3 922 | 923 | '@vitest/utils@3.2.3': 924 | dependencies: 925 | '@vitest/pretty-format': 3.2.3 926 | loupe: 3.1.3 927 | tinyrainbow: 2.0.0 928 | 929 | argparse@2.0.1: {} 930 | 931 | assertion-error@2.0.1: {} 932 | 933 | balanced-match@1.0.2: {} 934 | 935 | brace-expansion@2.0.1: 936 | dependencies: 937 | balanced-match: 1.0.2 938 | 939 | cac@6.7.14: {} 940 | 941 | chai@5.2.0: 942 | dependencies: 943 | assertion-error: 2.0.1 944 | check-error: 2.1.1 945 | deep-eql: 5.0.2 946 | loupe: 3.1.3 947 | pathval: 2.0.0 948 | 949 | check-error@2.1.1: {} 950 | 951 | debug@4.4.1: 952 | dependencies: 953 | ms: 2.1.3 954 | 955 | deep-eql@5.0.2: {} 956 | 957 | dprint@0.50.0: 958 | optionalDependencies: 959 | '@dprint/darwin-arm64': 0.50.0 960 | '@dprint/darwin-x64': 0.50.0 961 | '@dprint/linux-arm64-glibc': 0.50.0 962 | '@dprint/linux-arm64-musl': 0.50.0 963 | '@dprint/linux-riscv64-glibc': 0.50.0 964 | '@dprint/linux-x64-glibc': 0.50.0 965 | '@dprint/linux-x64-musl': 0.50.0 966 | '@dprint/win32-arm64': 0.50.0 967 | '@dprint/win32-x64': 0.50.0 968 | 969 | entities@4.5.0: {} 970 | 971 | es-module-lexer@1.7.0: {} 972 | 973 | esbuild@0.25.0: 974 | optionalDependencies: 975 | '@esbuild/aix-ppc64': 0.25.0 976 | '@esbuild/android-arm': 0.25.0 977 | '@esbuild/android-arm64': 0.25.0 978 | '@esbuild/android-x64': 0.25.0 979 | '@esbuild/darwin-arm64': 0.25.0 980 | '@esbuild/darwin-x64': 0.25.0 981 | '@esbuild/freebsd-arm64': 0.25.0 982 | '@esbuild/freebsd-x64': 0.25.0 983 | '@esbuild/linux-arm': 0.25.0 984 | '@esbuild/linux-arm64': 0.25.0 985 | '@esbuild/linux-ia32': 0.25.0 986 | '@esbuild/linux-loong64': 0.25.0 987 | '@esbuild/linux-mips64el': 0.25.0 988 | '@esbuild/linux-ppc64': 0.25.0 989 | '@esbuild/linux-riscv64': 0.25.0 990 | '@esbuild/linux-s390x': 0.25.0 991 | '@esbuild/linux-x64': 0.25.0 992 | '@esbuild/netbsd-arm64': 0.25.0 993 | '@esbuild/netbsd-x64': 0.25.0 994 | '@esbuild/openbsd-arm64': 0.25.0 995 | '@esbuild/openbsd-x64': 0.25.0 996 | '@esbuild/sunos-x64': 0.25.0 997 | '@esbuild/win32-arm64': 0.25.0 998 | '@esbuild/win32-ia32': 0.25.0 999 | '@esbuild/win32-x64': 0.25.0 1000 | 1001 | estree-walker@3.0.3: 1002 | dependencies: 1003 | '@types/estree': 1.0.8 1004 | 1005 | expect-type@1.2.1: {} 1006 | 1007 | fdir@6.4.6(picomatch@4.0.2): 1008 | optionalDependencies: 1009 | picomatch: 4.0.2 1010 | 1011 | fsevents@2.3.3: 1012 | optional: true 1013 | 1014 | js-tokens@9.0.1: {} 1015 | 1016 | linkify-it@5.0.0: 1017 | dependencies: 1018 | uc.micro: 2.1.0 1019 | 1020 | loupe@3.1.3: {} 1021 | 1022 | lunr@2.3.9: {} 1023 | 1024 | magic-string@0.30.17: 1025 | dependencies: 1026 | '@jridgewell/sourcemap-codec': 1.5.0 1027 | 1028 | markdown-it@14.1.0: 1029 | dependencies: 1030 | argparse: 2.0.1 1031 | entities: 4.5.0 1032 | linkify-it: 5.0.0 1033 | mdurl: 2.0.0 1034 | punycode.js: 2.3.1 1035 | uc.micro: 2.1.0 1036 | 1037 | mdurl@2.0.0: {} 1038 | 1039 | minimatch@9.0.5: 1040 | dependencies: 1041 | brace-expansion: 2.0.1 1042 | 1043 | ms@2.1.3: {} 1044 | 1045 | nanoid@3.3.8: {} 1046 | 1047 | outdent@0.8.0: {} 1048 | 1049 | pathe@2.0.3: {} 1050 | 1051 | pathval@2.0.0: {} 1052 | 1053 | picocolors@1.1.1: {} 1054 | 1055 | picomatch@4.0.2: {} 1056 | 1057 | postcss@8.5.3: 1058 | dependencies: 1059 | nanoid: 3.3.8 1060 | picocolors: 1.1.1 1061 | source-map-js: 1.2.1 1062 | 1063 | punycode.js@2.3.1: {} 1064 | 1065 | rollup@4.34.9: 1066 | dependencies: 1067 | '@types/estree': 1.0.6 1068 | optionalDependencies: 1069 | '@rollup/rollup-android-arm-eabi': 4.34.9 1070 | '@rollup/rollup-android-arm64': 4.34.9 1071 | '@rollup/rollup-darwin-arm64': 4.34.9 1072 | '@rollup/rollup-darwin-x64': 4.34.9 1073 | '@rollup/rollup-freebsd-arm64': 4.34.9 1074 | '@rollup/rollup-freebsd-x64': 4.34.9 1075 | '@rollup/rollup-linux-arm-gnueabihf': 4.34.9 1076 | '@rollup/rollup-linux-arm-musleabihf': 4.34.9 1077 | '@rollup/rollup-linux-arm64-gnu': 4.34.9 1078 | '@rollup/rollup-linux-arm64-musl': 4.34.9 1079 | '@rollup/rollup-linux-loongarch64-gnu': 4.34.9 1080 | '@rollup/rollup-linux-powerpc64le-gnu': 4.34.9 1081 | '@rollup/rollup-linux-riscv64-gnu': 4.34.9 1082 | '@rollup/rollup-linux-s390x-gnu': 4.34.9 1083 | '@rollup/rollup-linux-x64-gnu': 4.34.9 1084 | '@rollup/rollup-linux-x64-musl': 4.34.9 1085 | '@rollup/rollup-win32-arm64-msvc': 4.34.9 1086 | '@rollup/rollup-win32-ia32-msvc': 4.34.9 1087 | '@rollup/rollup-win32-x64-msvc': 4.34.9 1088 | fsevents: 2.3.3 1089 | 1090 | siginfo@2.0.0: {} 1091 | 1092 | source-map-js@1.2.1: {} 1093 | 1094 | stackback@0.0.2: {} 1095 | 1096 | std-env@3.9.0: {} 1097 | 1098 | strip-literal@3.0.0: 1099 | dependencies: 1100 | js-tokens: 9.0.1 1101 | 1102 | tinybench@2.9.0: {} 1103 | 1104 | tinyexec@0.3.2: {} 1105 | 1106 | tinyglobby@0.2.14: 1107 | dependencies: 1108 | fdir: 6.4.6(picomatch@4.0.2) 1109 | picomatch: 4.0.2 1110 | 1111 | tinypool@1.1.0: {} 1112 | 1113 | tinyrainbow@2.0.0: {} 1114 | 1115 | tinyspy@4.0.3: {} 1116 | 1117 | typedoc@0.28.5(typescript@5.8.3): 1118 | dependencies: 1119 | '@gerrit0/mini-shiki': 3.2.3 1120 | lunr: 2.3.9 1121 | markdown-it: 14.1.0 1122 | minimatch: 9.0.5 1123 | typescript: 5.8.3 1124 | yaml: 2.7.1 1125 | 1126 | typescript@5.8.3: {} 1127 | 1128 | uc.micro@2.1.0: {} 1129 | 1130 | undici-types@6.19.8: {} 1131 | 1132 | vite-node@3.2.3(@types/node@20.17.22)(yaml@2.7.1): 1133 | dependencies: 1134 | cac: 6.7.14 1135 | debug: 4.4.1 1136 | es-module-lexer: 1.7.0 1137 | pathe: 2.0.3 1138 | vite: 6.2.0(@types/node@20.17.22)(yaml@2.7.1) 1139 | transitivePeerDependencies: 1140 | - '@types/node' 1141 | - jiti 1142 | - less 1143 | - lightningcss 1144 | - sass 1145 | - sass-embedded 1146 | - stylus 1147 | - sugarss 1148 | - supports-color 1149 | - terser 1150 | - tsx 1151 | - yaml 1152 | 1153 | vite@6.2.0(@types/node@20.17.22)(yaml@2.7.1): 1154 | dependencies: 1155 | esbuild: 0.25.0 1156 | postcss: 8.5.3 1157 | rollup: 4.34.9 1158 | optionalDependencies: 1159 | '@types/node': 20.17.22 1160 | fsevents: 2.3.3 1161 | yaml: 2.7.1 1162 | 1163 | vitest@3.2.3(@types/node@20.17.22)(yaml@2.7.1): 1164 | dependencies: 1165 | '@types/chai': 5.2.2 1166 | '@vitest/expect': 3.2.3 1167 | '@vitest/mocker': 3.2.3(vite@6.2.0(@types/node@20.17.22)(yaml@2.7.1)) 1168 | '@vitest/pretty-format': 3.2.3 1169 | '@vitest/runner': 3.2.3 1170 | '@vitest/snapshot': 3.2.3 1171 | '@vitest/spy': 3.2.3 1172 | '@vitest/utils': 3.2.3 1173 | chai: 5.2.0 1174 | debug: 4.4.1 1175 | expect-type: 1.2.1 1176 | magic-string: 0.30.17 1177 | pathe: 2.0.3 1178 | picomatch: 4.0.2 1179 | std-env: 3.9.0 1180 | tinybench: 2.9.0 1181 | tinyexec: 0.3.2 1182 | tinyglobby: 0.2.14 1183 | tinypool: 1.1.0 1184 | tinyrainbow: 2.0.0 1185 | vite: 6.2.0(@types/node@20.17.22)(yaml@2.7.1) 1186 | vite-node: 3.2.3(@types/node@20.17.22)(yaml@2.7.1) 1187 | why-is-node-running: 2.3.0 1188 | optionalDependencies: 1189 | '@types/node': 20.17.22 1190 | transitivePeerDependencies: 1191 | - jiti 1192 | - less 1193 | - lightningcss 1194 | - msw 1195 | - sass 1196 | - sass-embedded 1197 | - stylus 1198 | - sugarss 1199 | - supports-color 1200 | - terser 1201 | - tsx 1202 | - yaml 1203 | 1204 | why-is-node-running@2.3.0: 1205 | dependencies: 1206 | siginfo: 2.0.0 1207 | stackback: 0.0.2 1208 | 1209 | yaml@2.7.1: {} 1210 | 1211 | zod@3.25.64: {} 1212 | --------------------------------------------------------------------------------