├── .editorconfig ├── .github └── workflows │ ├── ci.yml │ ├── pages.yml │ └── publish.yml ├── .gitignore ├── .vscode └── launch.json ├── CHANGELOG.md ├── LICENSE ├── README.md ├── dprint.json ├── package.json ├── pnpm-lock.yaml ├── src ├── plugin.ts ├── test │ └── plugin.test.mts └── testdata │ ├── gh2.ts │ ├── gh6.ts │ ├── gh7.ts │ ├── infer.ts │ ├── input.ts │ └── typedoc_gh2808.ts └── tsconfig.json /.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 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish 2 | on: 3 | push: 4 | branches: 5 | - main 6 | jobs: 7 | npm-publish: 8 | name: npm-publish 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Checkout repository 12 | uses: actions/checkout@v4 13 | with: 14 | fetch-depth: 0 15 | - id: check 16 | uses: EndBug/version-check@v2 17 | with: 18 | diff-search: true 19 | - name: Set up Node 20 | if: steps.check.outputs.changed == 'true' 21 | uses: actions/setup-node@v4 22 | with: 23 | node-version: "20" 24 | - name: Install pnpm 25 | if: steps.check.outputs.changed == 'true' 26 | run: npm i -g pnpm@10 27 | - name: Install 28 | if: steps.check.outputs.changed == 'true' 29 | run: pnpm install 30 | - name: Build 31 | if: steps.check.outputs.changed == 'true' 32 | run: pnpm build 33 | - name: Publish 34 | if: steps.check.outputs.changed == 'true' 35 | run: | 36 | pnpm publish 37 | git tag v$(jq .version package.json -r) 38 | git push --tags 39 | env: 40 | npm_config_//registry.npmjs.org/:_authToken: ${{ secrets.NPM_AUTH_TOKEN }} 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | docs 3 | *.tgz 4 | dist 5 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ### v1.4.1 (2025-03-12) 2 | 3 | - Fix broken type alias resolution with TypeDoc 0.28, #9. 4 | 5 | ### v1.4.0 (2025-03-02) 6 | 7 | - Support TypeDoc 0.28 8 | 9 | ### v1.3.1 (2024-12-14) 10 | 11 | - Fixed broken links to type properties for types created with this plugin, TypeStrong/typedoc#2808. 12 | 13 | ### v1.3.0 (2024-11-24) 14 | 15 | - Support TypeDoc 0.27. 16 | 17 | ### v1.2.1 (2024-08-18) 18 | 19 | - Fix warnings about referenced but not present reflections in packages mode, #6. 20 | - Copy comments from schema object declaration to type alias, #7. 21 | 22 | ### v1.2.0 (2024-06-22) 23 | 24 | - Support TypeDoc 0.26. 25 | 26 | ### v1.1.2 (2024-01-06) 27 | 28 | - Added support for the `z.input` type, #3. 29 | 30 | ### v1.1.1 (2023-12-26) 31 | 32 | - Fixed conversion of symbols where the same name is used for a type and variable, #2. 33 | 34 | ### v1.1.0 (2023-08-25) 35 | 36 | - Add support for TypeDoc 0.25.x 37 | 38 | ### v1.0.2 39 | 40 | - Update peer dependency to allow TypeDoc 0.24 41 | 42 | ### v1.0.1 43 | 44 | - Add GitHub links to NPM package 45 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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.94.0.wasm", 15 | "https://plugins.dprint.dev/json-0.20.0.wasm", 16 | "https://plugins.dprint.dev/markdown-0.18.0.wasm" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typedoc-plugin-zod", 3 | "version": "1.4.1", 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.49.0", 21 | "outdent": "^0.8.0", 22 | "typedoc": "^0.28.2", 23 | "typescript": "^5.8.2", 24 | "vitest": "^3.0.7", 25 | "zod": "^3.24.2" 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 | -------------------------------------------------------------------------------- /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.49.0 16 | version: 0.49.0 17 | outdent: 18 | specifier: ^0.8.0 19 | version: 0.8.0 20 | typedoc: 21 | specifier: ^0.28.2 22 | version: 0.28.2(typescript@5.8.2) 23 | typescript: 24 | specifier: ^5.8.2 25 | version: 5.8.2 26 | vitest: 27 | specifier: ^3.0.7 28 | version: 3.0.7(@types/node@20.17.22)(yaml@2.7.1) 29 | zod: 30 | specifier: ^3.24.2 31 | version: 3.24.2 32 | 33 | packages: 34 | 35 | '@dprint/darwin-arm64@0.49.0': 36 | resolution: {integrity: sha512-b8fwjdfYrX5H+QyeWiB27gPc1GMVdd2LorCtsZWC+MDQO6NOgpuxJePqccbQlFUumy2rfmQuLQprnldvQZhceg==} 37 | cpu: [arm64] 38 | os: [darwin] 39 | 40 | '@dprint/darwin-x64@0.49.0': 41 | resolution: {integrity: sha512-cA/DIPlHClkufLufuIfcXHtZdlyP9U05RuJLvvAfHwJAxyeEC/chKYVc5BVz86RxMIq6czFGpJHoFtTjrfM3YA==} 42 | cpu: [x64] 43 | os: [darwin] 44 | 45 | '@dprint/linux-arm64-glibc@0.49.0': 46 | resolution: {integrity: sha512-UBo3lDJhotT+qza2S48DOPI64MirkJMoFDidh/TJBjokio2TcGd+QUzuB9O7J1+R3AlbwyObcTECjJryCNohHQ==} 47 | cpu: [arm64] 48 | os: [linux] 49 | 50 | '@dprint/linux-arm64-musl@0.49.0': 51 | resolution: {integrity: sha512-XWAPL6Hp+zqk9bi57450wuy4yz4fvT72L3Zji3X7ChL5KD/apMUzQnZhmTpln2sxwIgJ3nCbzEzlF7jhhp/7KA==} 52 | cpu: [arm64] 53 | os: [linux] 54 | 55 | '@dprint/linux-riscv64-glibc@0.49.0': 56 | resolution: {integrity: sha512-6GlGcauMeMbCCJ15OmAMkarouCifij9hb12Vz5UUZPevnutVoWRTQBPQLfllmd+9Znsp23fHnmzmykibdwj4Gw==} 57 | cpu: [riscv64] 58 | os: [linux] 59 | 60 | '@dprint/linux-x64-glibc@0.49.0': 61 | resolution: {integrity: sha512-PJUM1G8L2xwF9R1s4/J6kf29S2sJ/sZGy3ah7g5Uj+oYkZq6SlMOrx3xqCXEkKSa0T6Xuc1bUBcJyrjEf36xiw==} 62 | cpu: [x64] 63 | os: [linux] 64 | 65 | '@dprint/linux-x64-musl@0.49.0': 66 | resolution: {integrity: sha512-+WIInBwbCXYmWZcYYmnD8HdcZj6q8ewy6mPpHH6SDMtWr6nrxzyIVLFr72XeiBoHnVsQFUhN+wv5Bm5NnpJtRw==} 67 | cpu: [x64] 68 | os: [linux] 69 | 70 | '@dprint/win32-arm64@0.49.0': 71 | resolution: {integrity: sha512-AteygrhmT7OXIgE/72REUfTPs/+qU0I1vhU379AYXgcWzOKy6Eeyi8lAt17oF7OmGT4IuyrKEDjpdTxhOWLsQw==} 72 | cpu: [arm64] 73 | os: [win32] 74 | 75 | '@dprint/win32-x64@0.49.0': 76 | resolution: {integrity: sha512-8bE6P9T/32Gd+zMAkcwvUHzOLEMnbHEMgsgiKypYsdFTskpDz+y1GLJvMaxIFd2DB2tMx9TdBYuBQrJroTsMeQ==} 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/estree@1.0.6': 347 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 348 | 349 | '@types/hast@3.0.4': 350 | resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} 351 | 352 | '@types/node@20.17.22': 353 | resolution: {integrity: sha512-9RV2zST+0s3EhfrMZIhrz2bhuhBwxgkbHEwP2gtGWPjBzVQjifMzJ9exw7aDZhR1wbpj8zBrfp3bo8oJcGiUUw==} 354 | 355 | '@types/unist@3.0.3': 356 | resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} 357 | 358 | '@vitest/expect@3.0.7': 359 | resolution: {integrity: sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw==} 360 | 361 | '@vitest/mocker@3.0.7': 362 | resolution: {integrity: sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w==} 363 | peerDependencies: 364 | msw: ^2.4.9 365 | vite: ^5.0.0 || ^6.0.0 366 | peerDependenciesMeta: 367 | msw: 368 | optional: true 369 | vite: 370 | optional: true 371 | 372 | '@vitest/pretty-format@3.0.7': 373 | resolution: {integrity: sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==} 374 | 375 | '@vitest/runner@3.0.7': 376 | resolution: {integrity: sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g==} 377 | 378 | '@vitest/snapshot@3.0.7': 379 | resolution: {integrity: sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA==} 380 | 381 | '@vitest/spy@3.0.7': 382 | resolution: {integrity: sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w==} 383 | 384 | '@vitest/utils@3.0.7': 385 | resolution: {integrity: sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg==} 386 | 387 | argparse@2.0.1: 388 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 389 | 390 | assertion-error@2.0.1: 391 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 392 | engines: {node: '>=12'} 393 | 394 | balanced-match@1.0.2: 395 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 396 | 397 | brace-expansion@2.0.1: 398 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 399 | 400 | cac@6.7.14: 401 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 402 | engines: {node: '>=8'} 403 | 404 | chai@5.2.0: 405 | resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} 406 | engines: {node: '>=12'} 407 | 408 | check-error@2.1.1: 409 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 410 | engines: {node: '>= 16'} 411 | 412 | debug@4.4.0: 413 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 414 | engines: {node: '>=6.0'} 415 | peerDependencies: 416 | supports-color: '*' 417 | peerDependenciesMeta: 418 | supports-color: 419 | optional: true 420 | 421 | deep-eql@5.0.2: 422 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 423 | engines: {node: '>=6'} 424 | 425 | dprint@0.49.0: 426 | resolution: {integrity: sha512-xtBPZbPKWOOJH5al4h6rgzsGHuXpyK7TFJCQ5/TW8Z4zkcB9dfmPAh14/Yp5YZcB798D0liztXw+Nd7suzdzBQ==} 427 | hasBin: true 428 | 429 | entities@4.5.0: 430 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 431 | engines: {node: '>=0.12'} 432 | 433 | es-module-lexer@1.6.0: 434 | resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} 435 | 436 | esbuild@0.25.0: 437 | resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} 438 | engines: {node: '>=18'} 439 | hasBin: true 440 | 441 | estree-walker@3.0.3: 442 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 443 | 444 | expect-type@1.2.0: 445 | resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} 446 | engines: {node: '>=12.0.0'} 447 | 448 | fsevents@2.3.3: 449 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 450 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 451 | os: [darwin] 452 | 453 | linkify-it@5.0.0: 454 | resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} 455 | 456 | loupe@3.1.3: 457 | resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} 458 | 459 | lunr@2.3.9: 460 | resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} 461 | 462 | magic-string@0.30.17: 463 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 464 | 465 | markdown-it@14.1.0: 466 | resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} 467 | hasBin: true 468 | 469 | mdurl@2.0.0: 470 | resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} 471 | 472 | minimatch@9.0.5: 473 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 474 | engines: {node: '>=16 || 14 >=14.17'} 475 | 476 | ms@2.1.3: 477 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 478 | 479 | nanoid@3.3.8: 480 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 481 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 482 | hasBin: true 483 | 484 | outdent@0.8.0: 485 | resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} 486 | 487 | pathe@2.0.3: 488 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 489 | 490 | pathval@2.0.0: 491 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 492 | engines: {node: '>= 14.16'} 493 | 494 | picocolors@1.1.1: 495 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 496 | 497 | postcss@8.5.3: 498 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 499 | engines: {node: ^10 || ^12 || >=14} 500 | 501 | punycode.js@2.3.1: 502 | resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} 503 | engines: {node: '>=6'} 504 | 505 | rollup@4.34.9: 506 | resolution: {integrity: sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==} 507 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 508 | hasBin: true 509 | 510 | siginfo@2.0.0: 511 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 512 | 513 | source-map-js@1.2.1: 514 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 515 | engines: {node: '>=0.10.0'} 516 | 517 | stackback@0.0.2: 518 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 519 | 520 | std-env@3.8.0: 521 | resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} 522 | 523 | tinybench@2.9.0: 524 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 525 | 526 | tinyexec@0.3.2: 527 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 528 | 529 | tinypool@1.0.2: 530 | resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} 531 | engines: {node: ^18.0.0 || >=20.0.0} 532 | 533 | tinyrainbow@2.0.0: 534 | resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 535 | engines: {node: '>=14.0.0'} 536 | 537 | tinyspy@3.0.2: 538 | resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 539 | engines: {node: '>=14.0.0'} 540 | 541 | typedoc@0.28.2: 542 | resolution: {integrity: sha512-9Giuv+eppFKnJ0oi+vxqLM817b/IrIsEMYgy3jj6zdvppAfDqV3d6DXL2vXUg2TnlL62V48th25Zf/tcQKAJdg==} 543 | engines: {node: '>= 18', pnpm: '>= 10'} 544 | hasBin: true 545 | peerDependencies: 546 | 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 547 | 548 | typescript@5.8.2: 549 | resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} 550 | engines: {node: '>=14.17'} 551 | hasBin: true 552 | 553 | uc.micro@2.1.0: 554 | resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} 555 | 556 | undici-types@6.19.8: 557 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 558 | 559 | vite-node@3.0.7: 560 | resolution: {integrity: sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==} 561 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 562 | hasBin: true 563 | 564 | vite@6.2.0: 565 | resolution: {integrity: sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==} 566 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 567 | hasBin: true 568 | peerDependencies: 569 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 570 | jiti: '>=1.21.0' 571 | less: '*' 572 | lightningcss: ^1.21.0 573 | sass: '*' 574 | sass-embedded: '*' 575 | stylus: '*' 576 | sugarss: '*' 577 | terser: ^5.16.0 578 | tsx: ^4.8.1 579 | yaml: ^2.4.2 580 | peerDependenciesMeta: 581 | '@types/node': 582 | optional: true 583 | jiti: 584 | optional: true 585 | less: 586 | optional: true 587 | lightningcss: 588 | optional: true 589 | sass: 590 | optional: true 591 | sass-embedded: 592 | optional: true 593 | stylus: 594 | optional: true 595 | sugarss: 596 | optional: true 597 | terser: 598 | optional: true 599 | tsx: 600 | optional: true 601 | yaml: 602 | optional: true 603 | 604 | vitest@3.0.7: 605 | resolution: {integrity: sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==} 606 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 607 | hasBin: true 608 | peerDependencies: 609 | '@edge-runtime/vm': '*' 610 | '@types/debug': ^4.1.12 611 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 612 | '@vitest/browser': 3.0.7 613 | '@vitest/ui': 3.0.7 614 | happy-dom: '*' 615 | jsdom: '*' 616 | peerDependenciesMeta: 617 | '@edge-runtime/vm': 618 | optional: true 619 | '@types/debug': 620 | optional: true 621 | '@types/node': 622 | optional: true 623 | '@vitest/browser': 624 | optional: true 625 | '@vitest/ui': 626 | optional: true 627 | happy-dom: 628 | optional: true 629 | jsdom: 630 | optional: true 631 | 632 | why-is-node-running@2.3.0: 633 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 634 | engines: {node: '>=8'} 635 | hasBin: true 636 | 637 | yaml@2.7.1: 638 | resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} 639 | engines: {node: '>= 14'} 640 | hasBin: true 641 | 642 | zod@3.24.2: 643 | resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} 644 | 645 | snapshots: 646 | 647 | '@dprint/darwin-arm64@0.49.0': 648 | optional: true 649 | 650 | '@dprint/darwin-x64@0.49.0': 651 | optional: true 652 | 653 | '@dprint/linux-arm64-glibc@0.49.0': 654 | optional: true 655 | 656 | '@dprint/linux-arm64-musl@0.49.0': 657 | optional: true 658 | 659 | '@dprint/linux-riscv64-glibc@0.49.0': 660 | optional: true 661 | 662 | '@dprint/linux-x64-glibc@0.49.0': 663 | optional: true 664 | 665 | '@dprint/linux-x64-musl@0.49.0': 666 | optional: true 667 | 668 | '@dprint/win32-arm64@0.49.0': 669 | optional: true 670 | 671 | '@dprint/win32-x64@0.49.0': 672 | optional: true 673 | 674 | '@esbuild/aix-ppc64@0.25.0': 675 | optional: true 676 | 677 | '@esbuild/android-arm64@0.25.0': 678 | optional: true 679 | 680 | '@esbuild/android-arm@0.25.0': 681 | optional: true 682 | 683 | '@esbuild/android-x64@0.25.0': 684 | optional: true 685 | 686 | '@esbuild/darwin-arm64@0.25.0': 687 | optional: true 688 | 689 | '@esbuild/darwin-x64@0.25.0': 690 | optional: true 691 | 692 | '@esbuild/freebsd-arm64@0.25.0': 693 | optional: true 694 | 695 | '@esbuild/freebsd-x64@0.25.0': 696 | optional: true 697 | 698 | '@esbuild/linux-arm64@0.25.0': 699 | optional: true 700 | 701 | '@esbuild/linux-arm@0.25.0': 702 | optional: true 703 | 704 | '@esbuild/linux-ia32@0.25.0': 705 | optional: true 706 | 707 | '@esbuild/linux-loong64@0.25.0': 708 | optional: true 709 | 710 | '@esbuild/linux-mips64el@0.25.0': 711 | optional: true 712 | 713 | '@esbuild/linux-ppc64@0.25.0': 714 | optional: true 715 | 716 | '@esbuild/linux-riscv64@0.25.0': 717 | optional: true 718 | 719 | '@esbuild/linux-s390x@0.25.0': 720 | optional: true 721 | 722 | '@esbuild/linux-x64@0.25.0': 723 | optional: true 724 | 725 | '@esbuild/netbsd-arm64@0.25.0': 726 | optional: true 727 | 728 | '@esbuild/netbsd-x64@0.25.0': 729 | optional: true 730 | 731 | '@esbuild/openbsd-arm64@0.25.0': 732 | optional: true 733 | 734 | '@esbuild/openbsd-x64@0.25.0': 735 | optional: true 736 | 737 | '@esbuild/sunos-x64@0.25.0': 738 | optional: true 739 | 740 | '@esbuild/win32-arm64@0.25.0': 741 | optional: true 742 | 743 | '@esbuild/win32-ia32@0.25.0': 744 | optional: true 745 | 746 | '@esbuild/win32-x64@0.25.0': 747 | optional: true 748 | 749 | '@gerrit0/mini-shiki@3.2.3': 750 | dependencies: 751 | '@shikijs/engine-oniguruma': 3.2.2 752 | '@shikijs/langs': 3.2.2 753 | '@shikijs/themes': 3.2.2 754 | '@shikijs/types': 3.2.2 755 | '@shikijs/vscode-textmate': 10.0.2 756 | 757 | '@jridgewell/sourcemap-codec@1.5.0': {} 758 | 759 | '@rollup/rollup-android-arm-eabi@4.34.9': 760 | optional: true 761 | 762 | '@rollup/rollup-android-arm64@4.34.9': 763 | optional: true 764 | 765 | '@rollup/rollup-darwin-arm64@4.34.9': 766 | optional: true 767 | 768 | '@rollup/rollup-darwin-x64@4.34.9': 769 | optional: true 770 | 771 | '@rollup/rollup-freebsd-arm64@4.34.9': 772 | optional: true 773 | 774 | '@rollup/rollup-freebsd-x64@4.34.9': 775 | optional: true 776 | 777 | '@rollup/rollup-linux-arm-gnueabihf@4.34.9': 778 | optional: true 779 | 780 | '@rollup/rollup-linux-arm-musleabihf@4.34.9': 781 | optional: true 782 | 783 | '@rollup/rollup-linux-arm64-gnu@4.34.9': 784 | optional: true 785 | 786 | '@rollup/rollup-linux-arm64-musl@4.34.9': 787 | optional: true 788 | 789 | '@rollup/rollup-linux-loongarch64-gnu@4.34.9': 790 | optional: true 791 | 792 | '@rollup/rollup-linux-powerpc64le-gnu@4.34.9': 793 | optional: true 794 | 795 | '@rollup/rollup-linux-riscv64-gnu@4.34.9': 796 | optional: true 797 | 798 | '@rollup/rollup-linux-s390x-gnu@4.34.9': 799 | optional: true 800 | 801 | '@rollup/rollup-linux-x64-gnu@4.34.9': 802 | optional: true 803 | 804 | '@rollup/rollup-linux-x64-musl@4.34.9': 805 | optional: true 806 | 807 | '@rollup/rollup-win32-arm64-msvc@4.34.9': 808 | optional: true 809 | 810 | '@rollup/rollup-win32-ia32-msvc@4.34.9': 811 | optional: true 812 | 813 | '@rollup/rollup-win32-x64-msvc@4.34.9': 814 | optional: true 815 | 816 | '@shikijs/engine-oniguruma@3.2.2': 817 | dependencies: 818 | '@shikijs/types': 3.2.2 819 | '@shikijs/vscode-textmate': 10.0.2 820 | 821 | '@shikijs/langs@3.2.2': 822 | dependencies: 823 | '@shikijs/types': 3.2.2 824 | 825 | '@shikijs/themes@3.2.2': 826 | dependencies: 827 | '@shikijs/types': 3.2.2 828 | 829 | '@shikijs/types@3.2.2': 830 | dependencies: 831 | '@shikijs/vscode-textmate': 10.0.2 832 | '@types/hast': 3.0.4 833 | 834 | '@shikijs/vscode-textmate@10.0.2': {} 835 | 836 | '@types/estree@1.0.6': {} 837 | 838 | '@types/hast@3.0.4': 839 | dependencies: 840 | '@types/unist': 3.0.3 841 | 842 | '@types/node@20.17.22': 843 | dependencies: 844 | undici-types: 6.19.8 845 | 846 | '@types/unist@3.0.3': {} 847 | 848 | '@vitest/expect@3.0.7': 849 | dependencies: 850 | '@vitest/spy': 3.0.7 851 | '@vitest/utils': 3.0.7 852 | chai: 5.2.0 853 | tinyrainbow: 2.0.0 854 | 855 | '@vitest/mocker@3.0.7(vite@6.2.0(@types/node@20.17.22)(yaml@2.7.1))': 856 | dependencies: 857 | '@vitest/spy': 3.0.7 858 | estree-walker: 3.0.3 859 | magic-string: 0.30.17 860 | optionalDependencies: 861 | vite: 6.2.0(@types/node@20.17.22)(yaml@2.7.1) 862 | 863 | '@vitest/pretty-format@3.0.7': 864 | dependencies: 865 | tinyrainbow: 2.0.0 866 | 867 | '@vitest/runner@3.0.7': 868 | dependencies: 869 | '@vitest/utils': 3.0.7 870 | pathe: 2.0.3 871 | 872 | '@vitest/snapshot@3.0.7': 873 | dependencies: 874 | '@vitest/pretty-format': 3.0.7 875 | magic-string: 0.30.17 876 | pathe: 2.0.3 877 | 878 | '@vitest/spy@3.0.7': 879 | dependencies: 880 | tinyspy: 3.0.2 881 | 882 | '@vitest/utils@3.0.7': 883 | dependencies: 884 | '@vitest/pretty-format': 3.0.7 885 | loupe: 3.1.3 886 | tinyrainbow: 2.0.0 887 | 888 | argparse@2.0.1: {} 889 | 890 | assertion-error@2.0.1: {} 891 | 892 | balanced-match@1.0.2: {} 893 | 894 | brace-expansion@2.0.1: 895 | dependencies: 896 | balanced-match: 1.0.2 897 | 898 | cac@6.7.14: {} 899 | 900 | chai@5.2.0: 901 | dependencies: 902 | assertion-error: 2.0.1 903 | check-error: 2.1.1 904 | deep-eql: 5.0.2 905 | loupe: 3.1.3 906 | pathval: 2.0.0 907 | 908 | check-error@2.1.1: {} 909 | 910 | debug@4.4.0: 911 | dependencies: 912 | ms: 2.1.3 913 | 914 | deep-eql@5.0.2: {} 915 | 916 | dprint@0.49.0: 917 | optionalDependencies: 918 | '@dprint/darwin-arm64': 0.49.0 919 | '@dprint/darwin-x64': 0.49.0 920 | '@dprint/linux-arm64-glibc': 0.49.0 921 | '@dprint/linux-arm64-musl': 0.49.0 922 | '@dprint/linux-riscv64-glibc': 0.49.0 923 | '@dprint/linux-x64-glibc': 0.49.0 924 | '@dprint/linux-x64-musl': 0.49.0 925 | '@dprint/win32-arm64': 0.49.0 926 | '@dprint/win32-x64': 0.49.0 927 | 928 | entities@4.5.0: {} 929 | 930 | es-module-lexer@1.6.0: {} 931 | 932 | esbuild@0.25.0: 933 | optionalDependencies: 934 | '@esbuild/aix-ppc64': 0.25.0 935 | '@esbuild/android-arm': 0.25.0 936 | '@esbuild/android-arm64': 0.25.0 937 | '@esbuild/android-x64': 0.25.0 938 | '@esbuild/darwin-arm64': 0.25.0 939 | '@esbuild/darwin-x64': 0.25.0 940 | '@esbuild/freebsd-arm64': 0.25.0 941 | '@esbuild/freebsd-x64': 0.25.0 942 | '@esbuild/linux-arm': 0.25.0 943 | '@esbuild/linux-arm64': 0.25.0 944 | '@esbuild/linux-ia32': 0.25.0 945 | '@esbuild/linux-loong64': 0.25.0 946 | '@esbuild/linux-mips64el': 0.25.0 947 | '@esbuild/linux-ppc64': 0.25.0 948 | '@esbuild/linux-riscv64': 0.25.0 949 | '@esbuild/linux-s390x': 0.25.0 950 | '@esbuild/linux-x64': 0.25.0 951 | '@esbuild/netbsd-arm64': 0.25.0 952 | '@esbuild/netbsd-x64': 0.25.0 953 | '@esbuild/openbsd-arm64': 0.25.0 954 | '@esbuild/openbsd-x64': 0.25.0 955 | '@esbuild/sunos-x64': 0.25.0 956 | '@esbuild/win32-arm64': 0.25.0 957 | '@esbuild/win32-ia32': 0.25.0 958 | '@esbuild/win32-x64': 0.25.0 959 | 960 | estree-walker@3.0.3: 961 | dependencies: 962 | '@types/estree': 1.0.6 963 | 964 | expect-type@1.2.0: {} 965 | 966 | fsevents@2.3.3: 967 | optional: true 968 | 969 | linkify-it@5.0.0: 970 | dependencies: 971 | uc.micro: 2.1.0 972 | 973 | loupe@3.1.3: {} 974 | 975 | lunr@2.3.9: {} 976 | 977 | magic-string@0.30.17: 978 | dependencies: 979 | '@jridgewell/sourcemap-codec': 1.5.0 980 | 981 | markdown-it@14.1.0: 982 | dependencies: 983 | argparse: 2.0.1 984 | entities: 4.5.0 985 | linkify-it: 5.0.0 986 | mdurl: 2.0.0 987 | punycode.js: 2.3.1 988 | uc.micro: 2.1.0 989 | 990 | mdurl@2.0.0: {} 991 | 992 | minimatch@9.0.5: 993 | dependencies: 994 | brace-expansion: 2.0.1 995 | 996 | ms@2.1.3: {} 997 | 998 | nanoid@3.3.8: {} 999 | 1000 | outdent@0.8.0: {} 1001 | 1002 | pathe@2.0.3: {} 1003 | 1004 | pathval@2.0.0: {} 1005 | 1006 | picocolors@1.1.1: {} 1007 | 1008 | postcss@8.5.3: 1009 | dependencies: 1010 | nanoid: 3.3.8 1011 | picocolors: 1.1.1 1012 | source-map-js: 1.2.1 1013 | 1014 | punycode.js@2.3.1: {} 1015 | 1016 | rollup@4.34.9: 1017 | dependencies: 1018 | '@types/estree': 1.0.6 1019 | optionalDependencies: 1020 | '@rollup/rollup-android-arm-eabi': 4.34.9 1021 | '@rollup/rollup-android-arm64': 4.34.9 1022 | '@rollup/rollup-darwin-arm64': 4.34.9 1023 | '@rollup/rollup-darwin-x64': 4.34.9 1024 | '@rollup/rollup-freebsd-arm64': 4.34.9 1025 | '@rollup/rollup-freebsd-x64': 4.34.9 1026 | '@rollup/rollup-linux-arm-gnueabihf': 4.34.9 1027 | '@rollup/rollup-linux-arm-musleabihf': 4.34.9 1028 | '@rollup/rollup-linux-arm64-gnu': 4.34.9 1029 | '@rollup/rollup-linux-arm64-musl': 4.34.9 1030 | '@rollup/rollup-linux-loongarch64-gnu': 4.34.9 1031 | '@rollup/rollup-linux-powerpc64le-gnu': 4.34.9 1032 | '@rollup/rollup-linux-riscv64-gnu': 4.34.9 1033 | '@rollup/rollup-linux-s390x-gnu': 4.34.9 1034 | '@rollup/rollup-linux-x64-gnu': 4.34.9 1035 | '@rollup/rollup-linux-x64-musl': 4.34.9 1036 | '@rollup/rollup-win32-arm64-msvc': 4.34.9 1037 | '@rollup/rollup-win32-ia32-msvc': 4.34.9 1038 | '@rollup/rollup-win32-x64-msvc': 4.34.9 1039 | fsevents: 2.3.3 1040 | 1041 | siginfo@2.0.0: {} 1042 | 1043 | source-map-js@1.2.1: {} 1044 | 1045 | stackback@0.0.2: {} 1046 | 1047 | std-env@3.8.0: {} 1048 | 1049 | tinybench@2.9.0: {} 1050 | 1051 | tinyexec@0.3.2: {} 1052 | 1053 | tinypool@1.0.2: {} 1054 | 1055 | tinyrainbow@2.0.0: {} 1056 | 1057 | tinyspy@3.0.2: {} 1058 | 1059 | typedoc@0.28.2(typescript@5.8.2): 1060 | dependencies: 1061 | '@gerrit0/mini-shiki': 3.2.3 1062 | lunr: 2.3.9 1063 | markdown-it: 14.1.0 1064 | minimatch: 9.0.5 1065 | typescript: 5.8.2 1066 | yaml: 2.7.1 1067 | 1068 | typescript@5.8.2: {} 1069 | 1070 | uc.micro@2.1.0: {} 1071 | 1072 | undici-types@6.19.8: {} 1073 | 1074 | vite-node@3.0.7(@types/node@20.17.22)(yaml@2.7.1): 1075 | dependencies: 1076 | cac: 6.7.14 1077 | debug: 4.4.0 1078 | es-module-lexer: 1.6.0 1079 | pathe: 2.0.3 1080 | vite: 6.2.0(@types/node@20.17.22)(yaml@2.7.1) 1081 | transitivePeerDependencies: 1082 | - '@types/node' 1083 | - jiti 1084 | - less 1085 | - lightningcss 1086 | - sass 1087 | - sass-embedded 1088 | - stylus 1089 | - sugarss 1090 | - supports-color 1091 | - terser 1092 | - tsx 1093 | - yaml 1094 | 1095 | vite@6.2.0(@types/node@20.17.22)(yaml@2.7.1): 1096 | dependencies: 1097 | esbuild: 0.25.0 1098 | postcss: 8.5.3 1099 | rollup: 4.34.9 1100 | optionalDependencies: 1101 | '@types/node': 20.17.22 1102 | fsevents: 2.3.3 1103 | yaml: 2.7.1 1104 | 1105 | vitest@3.0.7(@types/node@20.17.22)(yaml@2.7.1): 1106 | dependencies: 1107 | '@vitest/expect': 3.0.7 1108 | '@vitest/mocker': 3.0.7(vite@6.2.0(@types/node@20.17.22)(yaml@2.7.1)) 1109 | '@vitest/pretty-format': 3.0.7 1110 | '@vitest/runner': 3.0.7 1111 | '@vitest/snapshot': 3.0.7 1112 | '@vitest/spy': 3.0.7 1113 | '@vitest/utils': 3.0.7 1114 | chai: 5.2.0 1115 | debug: 4.4.0 1116 | expect-type: 1.2.0 1117 | magic-string: 0.30.17 1118 | pathe: 2.0.3 1119 | std-env: 3.8.0 1120 | tinybench: 2.9.0 1121 | tinyexec: 0.3.2 1122 | tinypool: 1.0.2 1123 | tinyrainbow: 2.0.0 1124 | vite: 6.2.0(@types/node@20.17.22)(yaml@2.7.1) 1125 | vite-node: 3.0.7(@types/node@20.17.22)(yaml@2.7.1) 1126 | why-is-node-running: 2.3.0 1127 | optionalDependencies: 1128 | '@types/node': 20.17.22 1129 | transitivePeerDependencies: 1130 | - jiti 1131 | - less 1132 | - lightningcss 1133 | - msw 1134 | - sass 1135 | - sass-embedded 1136 | - stylus 1137 | - sugarss 1138 | - supports-color 1139 | - terser 1140 | - tsx 1141 | - yaml 1142 | 1143 | why-is-node-running@2.3.0: 1144 | dependencies: 1145 | siginfo: 2.0.0 1146 | stackback: 0.0.2 1147 | 1148 | yaml@2.7.1: {} 1149 | 1150 | zod@3.24.2: {} 1151 | -------------------------------------------------------------------------------- /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 | if ( 70 | !refl.kindOf(ReflectionKind.TypeAlias) 71 | || refl.type?.type !== "reference" 72 | || refl.type.package !== "zod" 73 | || (refl.type.qualifiedName !== "TypeOf" 74 | && refl.type.qualifiedName !== "input") 75 | ) { 76 | return; 77 | } 78 | 79 | const originalRef = refl.type.typeArguments?.[0]?.visit({ 80 | query: (t) => t.queryType, 81 | }); 82 | 83 | const declaration = getSymbolFromReflection(context, refl) 84 | ?.getDeclarations() 85 | ?.find(ts.isTypeAliasDeclaration); 86 | if (!declaration) return; 87 | 88 | const type = context.getTypeAtLocation(declaration); 89 | refl.type.visit( 90 | makeRecursiveVisitor({ 91 | reflection: (type) => { 92 | context.project.removeReflection(type.declaration); 93 | }, 94 | }), 95 | ); 96 | if (type) { 97 | refl.type = context.converter.convertType( 98 | context.withScope(refl), 99 | type, 100 | ); 101 | } else { 102 | refl.type = new IntrinsicType("any"); 103 | } 104 | 105 | if (originalRef) { 106 | schemaTypes.set(refl, originalRef); 107 | } 108 | } 109 | } 110 | 111 | function getSymbolFromReflection(context: Context, refl: Reflection): ts.Symbol | undefined { 112 | if ("getSymbolFromReflection" in context) { 113 | // 0.28 114 | return context.getSymbolFromReflection(refl); 115 | } 116 | 117 | // <0.28 118 | return (refl.project as any).getSymbolFromReflection(refl); 119 | } 120 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------