├── .gitignore ├── LICENSE.md ├── README.md ├── package-lock.json ├── package.json ├── public └── mcp.png ├── src ├── server.ts └── utils │ ├── api.ts │ ├── formatters.ts │ ├── index.ts │ └── schemas.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .DS_Store 3 | dist/ 4 | tsconfig.tsbuildinfo -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Magic UI 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # @magicuidesign/mcp 2 | 3 | [![npm version](https://badge.fury.io/js/@magicuidesign%2Fmcp.svg?icon=si%3Anpm)](https://badge.fury.io/js/@magicuidesign%2Fmcp) 4 | 5 | Official ModelContextProtocol (MCP) server for [Magic UI](https://magicui.design/). 6 | 7 |
8 | MCP 9 |
10 | 11 | ## Install MCP configuration 12 | 13 | ```bash 14 | npx @magicuidesign/cli@latest install 15 | ``` 16 | 17 | ### Supported Clients 18 | 19 | - [x] cursor 20 | - [x] windsurf 21 | - [x] claude 22 | - [x] cline 23 | - [x] roo-cline 24 | 25 | ## Manual Installation 26 | 27 | Add to your IDE's MCP config: 28 | 29 | ```json 30 | { 31 | "mcpServers": { 32 | "@magicuidesign/mcp": { 33 | "command": "npx", 34 | "args": ["-y", "@magicuidesign/mcp@latest"] 35 | } 36 | } 37 | } 38 | ``` 39 | 40 | ## Example Usage 41 | 42 | Once configured, you can questions like: 43 | 44 | > "Make a marquee of logos" 45 | 46 | > "Add a blur fade text animation" 47 | 48 | > "Add a grid background" 49 | 50 | ## Available Tools 51 | 52 | The server provides the following tools callable via MCP: 53 | 54 | | Tool Name | Description | 55 | |-----------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 56 | | `getUIComponents` | Provides a comprehensive list of all Magic UI components. | 57 | | `getLayout` | Provides implementation details for [bento-grid](https://magicui.design/docs/components/bento-grid), [dock](https://magicui.design/docs/components/dock), [file-tree](https://magicui.design/docs/components/file-tree), [grid-pattern](https://magicui.design/docs/components/grid-pattern), [interactive-grid-pattern](https://magicui.design/docs/components/interactive-grid-pattern), [dot-pattern](https://magicui.design/docs/components/dot-pattern) components. | 58 | | `getMedia` | Provides implementation details for [hero-video-dialog](https://magicui.design/docs/components/hero-video-dialog), [terminal](https://magicui.design/docs/components/terminal), [marquee](https://magicui.design/docs/components/marquee), [script-copy-btn](https://magicui.design/docs/components/script-copy-btn), [code-comparison](https://magicui.design/docs/components/code-comparison) components. | 59 | | `getMotion` | Provides implementation details for [blur-fade](https://magicui.design/docs/components/blur-fade), [scroll-progress](https://magicui.design/docs/components/scroll-progress), [scroll-based-velocity](https://magicui.design/docs/components/scroll-based-velocity), [orbiting-circles](https://magicui.design/docs/components/orbiting-circles), [animated-circular-progress-bar](https://magicui.design/docs/components/animated-circular-progress-bar) components. | 60 | | `getTextReveal` | Provides implementation details for [text-animate](https://magicui.design/docs/components/text-animate), [line-shadow-text](https://magicui.design/docs/components/line-shadow-text), [aurora-text](https://magicui.design/docs/components/aurora-text), [animated-shiny-text](https://magicui.design/docs/components/animated-shiny-text), [animated-gradient-text](https://magicui.design/docs/components/animated-gradient-text), [text-reveal](https://magicui.design/docs/components/text-reveal), [typing-animation](https://magicui.design/docs/components/typing-animation), [box-reveal](https://magicui.design/docs/components/box-reveal), [number-ticker](https://magicui.design/docs/components/number-ticker) components. | 61 | | `getTextEffects` | Provides implementation details for [word-rotate](https://magicui.design/docs/components/word-rotate), [flip-text](https://magicui.design/docs/components/flip-text), [hyper-text](https://magicui.design/docs/components/hyper-text), [morphing-text](https://magicui.design/docs/components/morphing-text), [spinning-text](https://magicui.design/docs/components/spinning-text), [sparkles-text](https://magicui.design/docs/components/sparkles-text) components. | 62 | | `getButtons` | Provides implementation details for [rainbow-button](https://magicui.design/docs/components/rainbow-button), [shimmer-button](https://magicui.design/docs/components/shimmer-button), [shiny-button](https://magicui.design/docs/components/shiny-button), [interactive-hover-button](https://magicui.design/docs/components/interactive-hover-button), [animated-subscribe-button](https://magicui.design/docs/components/animated-subscribe-button), [pulsating-button](https://magicui.design/docs/components/pulsating-button), [ripple-button](https://magicui.design/docs/components/ripple-button) components. | 63 | | `getEffects` | Provides implementation details for [animated-beam](https://magicui.design/docs/components/animated-beam), [border-beam](https://magicui.design/docs/components/border-beam), [shine-border](https://magicui.design/docs/components/shine-border), [magic-card](https://magicui.design/docs/components/magic-card), [meteors](https://magicui.design/docs/components/meteors), [neon-gradient-card](https://magicui.design/docs/components/neon-gradient-card), [confetti](https://magicui.design/docs/components/confetti), [particles](https://magicui.design/docs/components/particles), [cool-mode](https://magicui.design/docs/components/cool-mode), [scratch-to-reveal](https://magicui.design/docs/components/scratch-to-reveal) components. | 64 | | `getWidgets` | Provides implementation details for [animated-list](https://magicui.design/docs/components/animated-list), [tweet-card](https://magicui.design/docs/components/tweet-card), [client-tweet-card](https://magicui.design/docs/components/client-tweet-card), [lens](https://magicui.design/docs/components/lens), [pointer](https://magicui.design/docs/components/pointer), [avatar-circles](https://magicui.design/docs/components/avatar-circles), [icon-cloud](https://magicui.design/docs/components/icon-cloud), [globe](https://magicui.design/docs/components/globe) components. | 65 | | `getBackgrounds` | Provides implementation details for [warp-background](https://magicui.design/docs/components/warp-background), [flickering-grid](https://magicui.design/docs/components/flickering-grid), [animated-grid-pattern](https://magicui.design/docs/components/animated-grid-pattern), [retro-grid](https://magicui.design/docs/components/retro-grid), [ripple](https://magicui.design/docs/components/ripple) components. | 66 | | `getDevices` | Provides implementation details for [safari](https://magicui.design/docs/components/safari), [iphone-15-pro](https://magicui.design/docs/components/iphone-15-pro), [android](https://magicui.design/docs/components/android) components. | 67 | 68 | ## MCP Limitations 69 | 70 | Some clients have a [limit](https://docs.cursor.com/context/model-context-protocol#limitations) on the number of tools they can call. This is why we opted to group the tools into categories. Note: For more specific context on each component, run the MCP locally and modify the logic that groups the components. 71 | 72 | ## Credits 73 | 74 | Big thanks to [@beaubhp](https://github.com/beaubhp) for creating the MCP server 🙏 75 | 76 | [MIT](https://github.com/magicuidesign/mcp/blob/main/LICENSE.md) -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@magicuidesign/mcp", 3 | "version": "1.0.4", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@magicuidesign/mcp", 9 | "version": "1.0.4", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@modelcontextprotocol/sdk": "^1.9.0", 13 | "zod": "^3.24.2" 14 | }, 15 | "bin": { 16 | "mcp": "dist/server.js" 17 | }, 18 | "devDependencies": { 19 | "@types/node": "^22.14.1", 20 | "nodemon": "^3.1.0", 21 | "shx": "^0.4.0", 22 | "typescript": "^5.8.3" 23 | } 24 | }, 25 | "node_modules/@modelcontextprotocol/sdk": { 26 | "version": "1.9.0", 27 | "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.9.0.tgz", 28 | "integrity": "sha512-Jq2EUCQpe0iyO5FGpzVYDNFR6oR53AIrwph9yWl7uSc7IWUMsrmpmSaTGra5hQNunXpM+9oit85p924jWuHzUA==", 29 | "license": "MIT", 30 | "dependencies": { 31 | "content-type": "^1.0.5", 32 | "cors": "^2.8.5", 33 | "cross-spawn": "^7.0.3", 34 | "eventsource": "^3.0.2", 35 | "express": "^5.0.1", 36 | "express-rate-limit": "^7.5.0", 37 | "pkce-challenge": "^5.0.0", 38 | "raw-body": "^3.0.0", 39 | "zod": "^3.23.8", 40 | "zod-to-json-schema": "^3.24.1" 41 | }, 42 | "engines": { 43 | "node": ">=18" 44 | } 45 | }, 46 | "node_modules/@nodelib/fs.scandir": { 47 | "version": "2.1.5", 48 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 49 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 50 | "dev": true, 51 | "license": "MIT", 52 | "dependencies": { 53 | "@nodelib/fs.stat": "2.0.5", 54 | "run-parallel": "^1.1.9" 55 | }, 56 | "engines": { 57 | "node": ">= 8" 58 | } 59 | }, 60 | "node_modules/@nodelib/fs.stat": { 61 | "version": "2.0.5", 62 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 63 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 64 | "dev": true, 65 | "license": "MIT", 66 | "engines": { 67 | "node": ">= 8" 68 | } 69 | }, 70 | "node_modules/@nodelib/fs.walk": { 71 | "version": "1.2.8", 72 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 73 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 74 | "dev": true, 75 | "license": "MIT", 76 | "dependencies": { 77 | "@nodelib/fs.scandir": "2.1.5", 78 | "fastq": "^1.6.0" 79 | }, 80 | "engines": { 81 | "node": ">= 8" 82 | } 83 | }, 84 | "node_modules/@types/node": { 85 | "version": "22.14.1", 86 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", 87 | "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", 88 | "dev": true, 89 | "license": "MIT", 90 | "dependencies": { 91 | "undici-types": "~6.21.0" 92 | } 93 | }, 94 | "node_modules/accepts": { 95 | "version": "2.0.0", 96 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", 97 | "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", 98 | "license": "MIT", 99 | "dependencies": { 100 | "mime-types": "^3.0.0", 101 | "negotiator": "^1.0.0" 102 | }, 103 | "engines": { 104 | "node": ">= 0.6" 105 | } 106 | }, 107 | "node_modules/anymatch": { 108 | "version": "3.1.3", 109 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 110 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 111 | "dev": true, 112 | "license": "ISC", 113 | "dependencies": { 114 | "normalize-path": "^3.0.0", 115 | "picomatch": "^2.0.4" 116 | }, 117 | "engines": { 118 | "node": ">= 8" 119 | } 120 | }, 121 | "node_modules/balanced-match": { 122 | "version": "1.0.2", 123 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 124 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 125 | "dev": true, 126 | "license": "MIT" 127 | }, 128 | "node_modules/binary-extensions": { 129 | "version": "2.3.0", 130 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 131 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 132 | "dev": true, 133 | "license": "MIT", 134 | "engines": { 135 | "node": ">=8" 136 | }, 137 | "funding": { 138 | "url": "https://github.com/sponsors/sindresorhus" 139 | } 140 | }, 141 | "node_modules/body-parser": { 142 | "version": "2.2.0", 143 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", 144 | "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", 145 | "license": "MIT", 146 | "dependencies": { 147 | "bytes": "^3.1.2", 148 | "content-type": "^1.0.5", 149 | "debug": "^4.4.0", 150 | "http-errors": "^2.0.0", 151 | "iconv-lite": "^0.6.3", 152 | "on-finished": "^2.4.1", 153 | "qs": "^6.14.0", 154 | "raw-body": "^3.0.0", 155 | "type-is": "^2.0.0" 156 | }, 157 | "engines": { 158 | "node": ">=18" 159 | } 160 | }, 161 | "node_modules/brace-expansion": { 162 | "version": "1.1.11", 163 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 164 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 165 | "dev": true, 166 | "license": "MIT", 167 | "dependencies": { 168 | "balanced-match": "^1.0.0", 169 | "concat-map": "0.0.1" 170 | } 171 | }, 172 | "node_modules/braces": { 173 | "version": "3.0.3", 174 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 175 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 176 | "dev": true, 177 | "license": "MIT", 178 | "dependencies": { 179 | "fill-range": "^7.1.1" 180 | }, 181 | "engines": { 182 | "node": ">=8" 183 | } 184 | }, 185 | "node_modules/bytes": { 186 | "version": "3.1.2", 187 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 188 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 189 | "license": "MIT", 190 | "engines": { 191 | "node": ">= 0.8" 192 | } 193 | }, 194 | "node_modules/call-bind-apply-helpers": { 195 | "version": "1.0.2", 196 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 197 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 198 | "license": "MIT", 199 | "dependencies": { 200 | "es-errors": "^1.3.0", 201 | "function-bind": "^1.1.2" 202 | }, 203 | "engines": { 204 | "node": ">= 0.4" 205 | } 206 | }, 207 | "node_modules/call-bound": { 208 | "version": "1.0.4", 209 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", 210 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 211 | "license": "MIT", 212 | "dependencies": { 213 | "call-bind-apply-helpers": "^1.0.2", 214 | "get-intrinsic": "^1.3.0" 215 | }, 216 | "engines": { 217 | "node": ">= 0.4" 218 | }, 219 | "funding": { 220 | "url": "https://github.com/sponsors/ljharb" 221 | } 222 | }, 223 | "node_modules/chokidar": { 224 | "version": "3.6.0", 225 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 226 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 227 | "dev": true, 228 | "license": "MIT", 229 | "dependencies": { 230 | "anymatch": "~3.1.2", 231 | "braces": "~3.0.2", 232 | "glob-parent": "~5.1.2", 233 | "is-binary-path": "~2.1.0", 234 | "is-glob": "~4.0.1", 235 | "normalize-path": "~3.0.0", 236 | "readdirp": "~3.6.0" 237 | }, 238 | "engines": { 239 | "node": ">= 8.10.0" 240 | }, 241 | "funding": { 242 | "url": "https://paulmillr.com/funding/" 243 | }, 244 | "optionalDependencies": { 245 | "fsevents": "~2.3.2" 246 | } 247 | }, 248 | "node_modules/concat-map": { 249 | "version": "0.0.1", 250 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 251 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 252 | "dev": true, 253 | "license": "MIT" 254 | }, 255 | "node_modules/content-disposition": { 256 | "version": "1.0.0", 257 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", 258 | "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", 259 | "license": "MIT", 260 | "dependencies": { 261 | "safe-buffer": "5.2.1" 262 | }, 263 | "engines": { 264 | "node": ">= 0.6" 265 | } 266 | }, 267 | "node_modules/content-type": { 268 | "version": "1.0.5", 269 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 270 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 271 | "license": "MIT", 272 | "engines": { 273 | "node": ">= 0.6" 274 | } 275 | }, 276 | "node_modules/cookie": { 277 | "version": "0.7.2", 278 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", 279 | "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", 280 | "license": "MIT", 281 | "engines": { 282 | "node": ">= 0.6" 283 | } 284 | }, 285 | "node_modules/cookie-signature": { 286 | "version": "1.2.2", 287 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", 288 | "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", 289 | "license": "MIT", 290 | "engines": { 291 | "node": ">=6.6.0" 292 | } 293 | }, 294 | "node_modules/cors": { 295 | "version": "2.8.5", 296 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 297 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 298 | "license": "MIT", 299 | "dependencies": { 300 | "object-assign": "^4", 301 | "vary": "^1" 302 | }, 303 | "engines": { 304 | "node": ">= 0.10" 305 | } 306 | }, 307 | "node_modules/cross-spawn": { 308 | "version": "7.0.6", 309 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 310 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 311 | "license": "MIT", 312 | "dependencies": { 313 | "path-key": "^3.1.0", 314 | "shebang-command": "^2.0.0", 315 | "which": "^2.0.1" 316 | }, 317 | "engines": { 318 | "node": ">= 8" 319 | } 320 | }, 321 | "node_modules/debug": { 322 | "version": "4.4.0", 323 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 324 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 325 | "license": "MIT", 326 | "dependencies": { 327 | "ms": "^2.1.3" 328 | }, 329 | "engines": { 330 | "node": ">=6.0" 331 | }, 332 | "peerDependenciesMeta": { 333 | "supports-color": { 334 | "optional": true 335 | } 336 | } 337 | }, 338 | "node_modules/depd": { 339 | "version": "2.0.0", 340 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 341 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 342 | "license": "MIT", 343 | "engines": { 344 | "node": ">= 0.8" 345 | } 346 | }, 347 | "node_modules/dunder-proto": { 348 | "version": "1.0.1", 349 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 350 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 351 | "license": "MIT", 352 | "dependencies": { 353 | "call-bind-apply-helpers": "^1.0.1", 354 | "es-errors": "^1.3.0", 355 | "gopd": "^1.2.0" 356 | }, 357 | "engines": { 358 | "node": ">= 0.4" 359 | } 360 | }, 361 | "node_modules/ee-first": { 362 | "version": "1.1.1", 363 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 364 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 365 | "license": "MIT" 366 | }, 367 | "node_modules/encodeurl": { 368 | "version": "2.0.0", 369 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 370 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 371 | "license": "MIT", 372 | "engines": { 373 | "node": ">= 0.8" 374 | } 375 | }, 376 | "node_modules/end-of-stream": { 377 | "version": "1.4.4", 378 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 379 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 380 | "dev": true, 381 | "license": "MIT", 382 | "dependencies": { 383 | "once": "^1.4.0" 384 | } 385 | }, 386 | "node_modules/es-define-property": { 387 | "version": "1.0.1", 388 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 389 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 390 | "license": "MIT", 391 | "engines": { 392 | "node": ">= 0.4" 393 | } 394 | }, 395 | "node_modules/es-errors": { 396 | "version": "1.3.0", 397 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 398 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 399 | "license": "MIT", 400 | "engines": { 401 | "node": ">= 0.4" 402 | } 403 | }, 404 | "node_modules/es-object-atoms": { 405 | "version": "1.1.1", 406 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 407 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 408 | "license": "MIT", 409 | "dependencies": { 410 | "es-errors": "^1.3.0" 411 | }, 412 | "engines": { 413 | "node": ">= 0.4" 414 | } 415 | }, 416 | "node_modules/escape-html": { 417 | "version": "1.0.3", 418 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 419 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 420 | "license": "MIT" 421 | }, 422 | "node_modules/etag": { 423 | "version": "1.8.1", 424 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 425 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 426 | "license": "MIT", 427 | "engines": { 428 | "node": ">= 0.6" 429 | } 430 | }, 431 | "node_modules/eventsource": { 432 | "version": "3.0.6", 433 | "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.6.tgz", 434 | "integrity": "sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==", 435 | "license": "MIT", 436 | "dependencies": { 437 | "eventsource-parser": "^3.0.1" 438 | }, 439 | "engines": { 440 | "node": ">=18.0.0" 441 | } 442 | }, 443 | "node_modules/eventsource-parser": { 444 | "version": "3.0.1", 445 | "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", 446 | "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", 447 | "license": "MIT", 448 | "engines": { 449 | "node": ">=18.0.0" 450 | } 451 | }, 452 | "node_modules/execa": { 453 | "version": "1.0.0", 454 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 455 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 456 | "dev": true, 457 | "license": "MIT", 458 | "dependencies": { 459 | "cross-spawn": "^6.0.0", 460 | "get-stream": "^4.0.0", 461 | "is-stream": "^1.1.0", 462 | "npm-run-path": "^2.0.0", 463 | "p-finally": "^1.0.0", 464 | "signal-exit": "^3.0.0", 465 | "strip-eof": "^1.0.0" 466 | }, 467 | "engines": { 468 | "node": ">=6" 469 | } 470 | }, 471 | "node_modules/execa/node_modules/cross-spawn": { 472 | "version": "6.0.6", 473 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", 474 | "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", 475 | "dev": true, 476 | "license": "MIT", 477 | "dependencies": { 478 | "nice-try": "^1.0.4", 479 | "path-key": "^2.0.1", 480 | "semver": "^5.5.0", 481 | "shebang-command": "^1.2.0", 482 | "which": "^1.2.9" 483 | }, 484 | "engines": { 485 | "node": ">=4.8" 486 | } 487 | }, 488 | "node_modules/execa/node_modules/path-key": { 489 | "version": "2.0.1", 490 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 491 | "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", 492 | "dev": true, 493 | "license": "MIT", 494 | "engines": { 495 | "node": ">=4" 496 | } 497 | }, 498 | "node_modules/execa/node_modules/shebang-command": { 499 | "version": "1.2.0", 500 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 501 | "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", 502 | "dev": true, 503 | "license": "MIT", 504 | "dependencies": { 505 | "shebang-regex": "^1.0.0" 506 | }, 507 | "engines": { 508 | "node": ">=0.10.0" 509 | } 510 | }, 511 | "node_modules/execa/node_modules/shebang-regex": { 512 | "version": "1.0.0", 513 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 514 | "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", 515 | "dev": true, 516 | "license": "MIT", 517 | "engines": { 518 | "node": ">=0.10.0" 519 | } 520 | }, 521 | "node_modules/execa/node_modules/which": { 522 | "version": "1.3.1", 523 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 524 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 525 | "dev": true, 526 | "license": "ISC", 527 | "dependencies": { 528 | "isexe": "^2.0.0" 529 | }, 530 | "bin": { 531 | "which": "bin/which" 532 | } 533 | }, 534 | "node_modules/express": { 535 | "version": "5.1.0", 536 | "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", 537 | "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", 538 | "license": "MIT", 539 | "dependencies": { 540 | "accepts": "^2.0.0", 541 | "body-parser": "^2.2.0", 542 | "content-disposition": "^1.0.0", 543 | "content-type": "^1.0.5", 544 | "cookie": "^0.7.1", 545 | "cookie-signature": "^1.2.1", 546 | "debug": "^4.4.0", 547 | "encodeurl": "^2.0.0", 548 | "escape-html": "^1.0.3", 549 | "etag": "^1.8.1", 550 | "finalhandler": "^2.1.0", 551 | "fresh": "^2.0.0", 552 | "http-errors": "^2.0.0", 553 | "merge-descriptors": "^2.0.0", 554 | "mime-types": "^3.0.0", 555 | "on-finished": "^2.4.1", 556 | "once": "^1.4.0", 557 | "parseurl": "^1.3.3", 558 | "proxy-addr": "^2.0.7", 559 | "qs": "^6.14.0", 560 | "range-parser": "^1.2.1", 561 | "router": "^2.2.0", 562 | "send": "^1.1.0", 563 | "serve-static": "^2.2.0", 564 | "statuses": "^2.0.1", 565 | "type-is": "^2.0.1", 566 | "vary": "^1.1.2" 567 | }, 568 | "engines": { 569 | "node": ">= 18" 570 | }, 571 | "funding": { 572 | "type": "opencollective", 573 | "url": "https://opencollective.com/express" 574 | } 575 | }, 576 | "node_modules/express-rate-limit": { 577 | "version": "7.5.0", 578 | "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", 579 | "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", 580 | "license": "MIT", 581 | "engines": { 582 | "node": ">= 16" 583 | }, 584 | "funding": { 585 | "url": "https://github.com/sponsors/express-rate-limit" 586 | }, 587 | "peerDependencies": { 588 | "express": "^4.11 || 5 || ^5.0.0-beta.1" 589 | } 590 | }, 591 | "node_modules/fast-glob": { 592 | "version": "3.3.3", 593 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 594 | "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 595 | "dev": true, 596 | "license": "MIT", 597 | "dependencies": { 598 | "@nodelib/fs.stat": "^2.0.2", 599 | "@nodelib/fs.walk": "^1.2.3", 600 | "glob-parent": "^5.1.2", 601 | "merge2": "^1.3.0", 602 | "micromatch": "^4.0.8" 603 | }, 604 | "engines": { 605 | "node": ">=8.6.0" 606 | } 607 | }, 608 | "node_modules/fastq": { 609 | "version": "1.19.1", 610 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", 611 | "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", 612 | "dev": true, 613 | "license": "ISC", 614 | "dependencies": { 615 | "reusify": "^1.0.4" 616 | } 617 | }, 618 | "node_modules/fill-range": { 619 | "version": "7.1.1", 620 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 621 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 622 | "dev": true, 623 | "license": "MIT", 624 | "dependencies": { 625 | "to-regex-range": "^5.0.1" 626 | }, 627 | "engines": { 628 | "node": ">=8" 629 | } 630 | }, 631 | "node_modules/finalhandler": { 632 | "version": "2.1.0", 633 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", 634 | "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", 635 | "license": "MIT", 636 | "dependencies": { 637 | "debug": "^4.4.0", 638 | "encodeurl": "^2.0.0", 639 | "escape-html": "^1.0.3", 640 | "on-finished": "^2.4.1", 641 | "parseurl": "^1.3.3", 642 | "statuses": "^2.0.1" 643 | }, 644 | "engines": { 645 | "node": ">= 0.8" 646 | } 647 | }, 648 | "node_modules/forwarded": { 649 | "version": "0.2.0", 650 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 651 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 652 | "license": "MIT", 653 | "engines": { 654 | "node": ">= 0.6" 655 | } 656 | }, 657 | "node_modules/fresh": { 658 | "version": "2.0.0", 659 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", 660 | "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", 661 | "license": "MIT", 662 | "engines": { 663 | "node": ">= 0.8" 664 | } 665 | }, 666 | "node_modules/fsevents": { 667 | "version": "2.3.3", 668 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 669 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 670 | "dev": true, 671 | "hasInstallScript": true, 672 | "license": "MIT", 673 | "optional": true, 674 | "os": [ 675 | "darwin" 676 | ], 677 | "engines": { 678 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 679 | } 680 | }, 681 | "node_modules/function-bind": { 682 | "version": "1.1.2", 683 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 684 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 685 | "license": "MIT", 686 | "funding": { 687 | "url": "https://github.com/sponsors/ljharb" 688 | } 689 | }, 690 | "node_modules/get-intrinsic": { 691 | "version": "1.3.0", 692 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 693 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 694 | "license": "MIT", 695 | "dependencies": { 696 | "call-bind-apply-helpers": "^1.0.2", 697 | "es-define-property": "^1.0.1", 698 | "es-errors": "^1.3.0", 699 | "es-object-atoms": "^1.1.1", 700 | "function-bind": "^1.1.2", 701 | "get-proto": "^1.0.1", 702 | "gopd": "^1.2.0", 703 | "has-symbols": "^1.1.0", 704 | "hasown": "^2.0.2", 705 | "math-intrinsics": "^1.1.0" 706 | }, 707 | "engines": { 708 | "node": ">= 0.4" 709 | }, 710 | "funding": { 711 | "url": "https://github.com/sponsors/ljharb" 712 | } 713 | }, 714 | "node_modules/get-proto": { 715 | "version": "1.0.1", 716 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 717 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 718 | "license": "MIT", 719 | "dependencies": { 720 | "dunder-proto": "^1.0.1", 721 | "es-object-atoms": "^1.0.0" 722 | }, 723 | "engines": { 724 | "node": ">= 0.4" 725 | } 726 | }, 727 | "node_modules/get-stream": { 728 | "version": "4.1.0", 729 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 730 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 731 | "dev": true, 732 | "license": "MIT", 733 | "dependencies": { 734 | "pump": "^3.0.0" 735 | }, 736 | "engines": { 737 | "node": ">=6" 738 | } 739 | }, 740 | "node_modules/glob-parent": { 741 | "version": "5.1.2", 742 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 743 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 744 | "dev": true, 745 | "license": "ISC", 746 | "dependencies": { 747 | "is-glob": "^4.0.1" 748 | }, 749 | "engines": { 750 | "node": ">= 6" 751 | } 752 | }, 753 | "node_modules/gopd": { 754 | "version": "1.2.0", 755 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 756 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 757 | "license": "MIT", 758 | "engines": { 759 | "node": ">= 0.4" 760 | }, 761 | "funding": { 762 | "url": "https://github.com/sponsors/ljharb" 763 | } 764 | }, 765 | "node_modules/has-flag": { 766 | "version": "3.0.0", 767 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 768 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 769 | "dev": true, 770 | "license": "MIT", 771 | "engines": { 772 | "node": ">=4" 773 | } 774 | }, 775 | "node_modules/has-symbols": { 776 | "version": "1.1.0", 777 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 778 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 779 | "license": "MIT", 780 | "engines": { 781 | "node": ">= 0.4" 782 | }, 783 | "funding": { 784 | "url": "https://github.com/sponsors/ljharb" 785 | } 786 | }, 787 | "node_modules/hasown": { 788 | "version": "2.0.2", 789 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 790 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 791 | "license": "MIT", 792 | "dependencies": { 793 | "function-bind": "^1.1.2" 794 | }, 795 | "engines": { 796 | "node": ">= 0.4" 797 | } 798 | }, 799 | "node_modules/http-errors": { 800 | "version": "2.0.0", 801 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 802 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 803 | "license": "MIT", 804 | "dependencies": { 805 | "depd": "2.0.0", 806 | "inherits": "2.0.4", 807 | "setprototypeof": "1.2.0", 808 | "statuses": "2.0.1", 809 | "toidentifier": "1.0.1" 810 | }, 811 | "engines": { 812 | "node": ">= 0.8" 813 | } 814 | }, 815 | "node_modules/iconv-lite": { 816 | "version": "0.6.3", 817 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 818 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 819 | "license": "MIT", 820 | "dependencies": { 821 | "safer-buffer": ">= 2.1.2 < 3.0.0" 822 | }, 823 | "engines": { 824 | "node": ">=0.10.0" 825 | } 826 | }, 827 | "node_modules/ignore-by-default": { 828 | "version": "1.0.1", 829 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 830 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 831 | "dev": true, 832 | "license": "ISC" 833 | }, 834 | "node_modules/inherits": { 835 | "version": "2.0.4", 836 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 837 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 838 | "license": "ISC" 839 | }, 840 | "node_modules/interpret": { 841 | "version": "1.4.0", 842 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", 843 | "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", 844 | "dev": true, 845 | "license": "MIT", 846 | "engines": { 847 | "node": ">= 0.10" 848 | } 849 | }, 850 | "node_modules/ipaddr.js": { 851 | "version": "1.9.1", 852 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 853 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 854 | "license": "MIT", 855 | "engines": { 856 | "node": ">= 0.10" 857 | } 858 | }, 859 | "node_modules/is-binary-path": { 860 | "version": "2.1.0", 861 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 862 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 863 | "dev": true, 864 | "license": "MIT", 865 | "dependencies": { 866 | "binary-extensions": "^2.0.0" 867 | }, 868 | "engines": { 869 | "node": ">=8" 870 | } 871 | }, 872 | "node_modules/is-core-module": { 873 | "version": "2.16.1", 874 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 875 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 876 | "dev": true, 877 | "license": "MIT", 878 | "dependencies": { 879 | "hasown": "^2.0.2" 880 | }, 881 | "engines": { 882 | "node": ">= 0.4" 883 | }, 884 | "funding": { 885 | "url": "https://github.com/sponsors/ljharb" 886 | } 887 | }, 888 | "node_modules/is-extglob": { 889 | "version": "2.1.1", 890 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 891 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 892 | "dev": true, 893 | "license": "MIT", 894 | "engines": { 895 | "node": ">=0.10.0" 896 | } 897 | }, 898 | "node_modules/is-glob": { 899 | "version": "4.0.3", 900 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 901 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 902 | "dev": true, 903 | "license": "MIT", 904 | "dependencies": { 905 | "is-extglob": "^2.1.1" 906 | }, 907 | "engines": { 908 | "node": ">=0.10.0" 909 | } 910 | }, 911 | "node_modules/is-number": { 912 | "version": "7.0.0", 913 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 914 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 915 | "dev": true, 916 | "license": "MIT", 917 | "engines": { 918 | "node": ">=0.12.0" 919 | } 920 | }, 921 | "node_modules/is-promise": { 922 | "version": "4.0.0", 923 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", 924 | "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", 925 | "license": "MIT" 926 | }, 927 | "node_modules/is-stream": { 928 | "version": "1.1.0", 929 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 930 | "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", 931 | "dev": true, 932 | "license": "MIT", 933 | "engines": { 934 | "node": ">=0.10.0" 935 | } 936 | }, 937 | "node_modules/isexe": { 938 | "version": "2.0.0", 939 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 940 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 941 | "license": "ISC" 942 | }, 943 | "node_modules/math-intrinsics": { 944 | "version": "1.1.0", 945 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 946 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 947 | "license": "MIT", 948 | "engines": { 949 | "node": ">= 0.4" 950 | } 951 | }, 952 | "node_modules/media-typer": { 953 | "version": "1.1.0", 954 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", 955 | "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", 956 | "license": "MIT", 957 | "engines": { 958 | "node": ">= 0.8" 959 | } 960 | }, 961 | "node_modules/merge-descriptors": { 962 | "version": "2.0.0", 963 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", 964 | "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", 965 | "license": "MIT", 966 | "engines": { 967 | "node": ">=18" 968 | }, 969 | "funding": { 970 | "url": "https://github.com/sponsors/sindresorhus" 971 | } 972 | }, 973 | "node_modules/merge2": { 974 | "version": "1.4.1", 975 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 976 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 977 | "dev": true, 978 | "license": "MIT", 979 | "engines": { 980 | "node": ">= 8" 981 | } 982 | }, 983 | "node_modules/micromatch": { 984 | "version": "4.0.8", 985 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 986 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 987 | "dev": true, 988 | "license": "MIT", 989 | "dependencies": { 990 | "braces": "^3.0.3", 991 | "picomatch": "^2.3.1" 992 | }, 993 | "engines": { 994 | "node": ">=8.6" 995 | } 996 | }, 997 | "node_modules/mime-db": { 998 | "version": "1.54.0", 999 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", 1000 | "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", 1001 | "license": "MIT", 1002 | "engines": { 1003 | "node": ">= 0.6" 1004 | } 1005 | }, 1006 | "node_modules/mime-types": { 1007 | "version": "3.0.1", 1008 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", 1009 | "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", 1010 | "license": "MIT", 1011 | "dependencies": { 1012 | "mime-db": "^1.54.0" 1013 | }, 1014 | "engines": { 1015 | "node": ">= 0.6" 1016 | } 1017 | }, 1018 | "node_modules/minimatch": { 1019 | "version": "3.1.2", 1020 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1021 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1022 | "dev": true, 1023 | "license": "ISC", 1024 | "dependencies": { 1025 | "brace-expansion": "^1.1.7" 1026 | }, 1027 | "engines": { 1028 | "node": "*" 1029 | } 1030 | }, 1031 | "node_modules/minimist": { 1032 | "version": "1.2.8", 1033 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1034 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1035 | "dev": true, 1036 | "license": "MIT", 1037 | "funding": { 1038 | "url": "https://github.com/sponsors/ljharb" 1039 | } 1040 | }, 1041 | "node_modules/ms": { 1042 | "version": "2.1.3", 1043 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1044 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1045 | "license": "MIT" 1046 | }, 1047 | "node_modules/negotiator": { 1048 | "version": "1.0.0", 1049 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", 1050 | "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", 1051 | "license": "MIT", 1052 | "engines": { 1053 | "node": ">= 0.6" 1054 | } 1055 | }, 1056 | "node_modules/nice-try": { 1057 | "version": "1.0.5", 1058 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1059 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1060 | "dev": true, 1061 | "license": "MIT" 1062 | }, 1063 | "node_modules/nodemon": { 1064 | "version": "3.1.9", 1065 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz", 1066 | "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==", 1067 | "dev": true, 1068 | "license": "MIT", 1069 | "dependencies": { 1070 | "chokidar": "^3.5.2", 1071 | "debug": "^4", 1072 | "ignore-by-default": "^1.0.1", 1073 | "minimatch": "^3.1.2", 1074 | "pstree.remy": "^1.1.8", 1075 | "semver": "^7.5.3", 1076 | "simple-update-notifier": "^2.0.0", 1077 | "supports-color": "^5.5.0", 1078 | "touch": "^3.1.0", 1079 | "undefsafe": "^2.0.5" 1080 | }, 1081 | "bin": { 1082 | "nodemon": "bin/nodemon.js" 1083 | }, 1084 | "engines": { 1085 | "node": ">=10" 1086 | }, 1087 | "funding": { 1088 | "type": "opencollective", 1089 | "url": "https://opencollective.com/nodemon" 1090 | } 1091 | }, 1092 | "node_modules/nodemon/node_modules/semver": { 1093 | "version": "7.7.1", 1094 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", 1095 | "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", 1096 | "dev": true, 1097 | "license": "ISC", 1098 | "bin": { 1099 | "semver": "bin/semver.js" 1100 | }, 1101 | "engines": { 1102 | "node": ">=10" 1103 | } 1104 | }, 1105 | "node_modules/normalize-path": { 1106 | "version": "3.0.0", 1107 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1108 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1109 | "dev": true, 1110 | "license": "MIT", 1111 | "engines": { 1112 | "node": ">=0.10.0" 1113 | } 1114 | }, 1115 | "node_modules/npm-run-path": { 1116 | "version": "2.0.2", 1117 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1118 | "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", 1119 | "dev": true, 1120 | "license": "MIT", 1121 | "dependencies": { 1122 | "path-key": "^2.0.0" 1123 | }, 1124 | "engines": { 1125 | "node": ">=4" 1126 | } 1127 | }, 1128 | "node_modules/npm-run-path/node_modules/path-key": { 1129 | "version": "2.0.1", 1130 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1131 | "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", 1132 | "dev": true, 1133 | "license": "MIT", 1134 | "engines": { 1135 | "node": ">=4" 1136 | } 1137 | }, 1138 | "node_modules/object-assign": { 1139 | "version": "4.1.1", 1140 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1141 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1142 | "license": "MIT", 1143 | "engines": { 1144 | "node": ">=0.10.0" 1145 | } 1146 | }, 1147 | "node_modules/object-inspect": { 1148 | "version": "1.13.4", 1149 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", 1150 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", 1151 | "license": "MIT", 1152 | "engines": { 1153 | "node": ">= 0.4" 1154 | }, 1155 | "funding": { 1156 | "url": "https://github.com/sponsors/ljharb" 1157 | } 1158 | }, 1159 | "node_modules/on-finished": { 1160 | "version": "2.4.1", 1161 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1162 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1163 | "license": "MIT", 1164 | "dependencies": { 1165 | "ee-first": "1.1.1" 1166 | }, 1167 | "engines": { 1168 | "node": ">= 0.8" 1169 | } 1170 | }, 1171 | "node_modules/once": { 1172 | "version": "1.4.0", 1173 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1174 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1175 | "license": "ISC", 1176 | "dependencies": { 1177 | "wrappy": "1" 1178 | } 1179 | }, 1180 | "node_modules/p-finally": { 1181 | "version": "1.0.0", 1182 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1183 | "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", 1184 | "dev": true, 1185 | "license": "MIT", 1186 | "engines": { 1187 | "node": ">=4" 1188 | } 1189 | }, 1190 | "node_modules/parseurl": { 1191 | "version": "1.3.3", 1192 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1193 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1194 | "license": "MIT", 1195 | "engines": { 1196 | "node": ">= 0.8" 1197 | } 1198 | }, 1199 | "node_modules/path-key": { 1200 | "version": "3.1.1", 1201 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1202 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1203 | "license": "MIT", 1204 | "engines": { 1205 | "node": ">=8" 1206 | } 1207 | }, 1208 | "node_modules/path-parse": { 1209 | "version": "1.0.7", 1210 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1211 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1212 | "dev": true, 1213 | "license": "MIT" 1214 | }, 1215 | "node_modules/path-to-regexp": { 1216 | "version": "8.2.0", 1217 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", 1218 | "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", 1219 | "license": "MIT", 1220 | "engines": { 1221 | "node": ">=16" 1222 | } 1223 | }, 1224 | "node_modules/picomatch": { 1225 | "version": "2.3.1", 1226 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1227 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1228 | "dev": true, 1229 | "license": "MIT", 1230 | "engines": { 1231 | "node": ">=8.6" 1232 | }, 1233 | "funding": { 1234 | "url": "https://github.com/sponsors/jonschlinkert" 1235 | } 1236 | }, 1237 | "node_modules/pkce-challenge": { 1238 | "version": "5.0.0", 1239 | "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", 1240 | "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", 1241 | "license": "MIT", 1242 | "engines": { 1243 | "node": ">=16.20.0" 1244 | } 1245 | }, 1246 | "node_modules/proxy-addr": { 1247 | "version": "2.0.7", 1248 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1249 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1250 | "license": "MIT", 1251 | "dependencies": { 1252 | "forwarded": "0.2.0", 1253 | "ipaddr.js": "1.9.1" 1254 | }, 1255 | "engines": { 1256 | "node": ">= 0.10" 1257 | } 1258 | }, 1259 | "node_modules/pstree.remy": { 1260 | "version": "1.1.8", 1261 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 1262 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 1263 | "dev": true, 1264 | "license": "MIT" 1265 | }, 1266 | "node_modules/pump": { 1267 | "version": "3.0.2", 1268 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", 1269 | "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", 1270 | "dev": true, 1271 | "license": "MIT", 1272 | "dependencies": { 1273 | "end-of-stream": "^1.1.0", 1274 | "once": "^1.3.1" 1275 | } 1276 | }, 1277 | "node_modules/qs": { 1278 | "version": "6.14.0", 1279 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", 1280 | "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", 1281 | "license": "BSD-3-Clause", 1282 | "dependencies": { 1283 | "side-channel": "^1.1.0" 1284 | }, 1285 | "engines": { 1286 | "node": ">=0.6" 1287 | }, 1288 | "funding": { 1289 | "url": "https://github.com/sponsors/ljharb" 1290 | } 1291 | }, 1292 | "node_modules/queue-microtask": { 1293 | "version": "1.2.3", 1294 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1295 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1296 | "dev": true, 1297 | "funding": [ 1298 | { 1299 | "type": "github", 1300 | "url": "https://github.com/sponsors/feross" 1301 | }, 1302 | { 1303 | "type": "patreon", 1304 | "url": "https://www.patreon.com/feross" 1305 | }, 1306 | { 1307 | "type": "consulting", 1308 | "url": "https://feross.org/support" 1309 | } 1310 | ], 1311 | "license": "MIT" 1312 | }, 1313 | "node_modules/range-parser": { 1314 | "version": "1.2.1", 1315 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1316 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1317 | "license": "MIT", 1318 | "engines": { 1319 | "node": ">= 0.6" 1320 | } 1321 | }, 1322 | "node_modules/raw-body": { 1323 | "version": "3.0.0", 1324 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", 1325 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", 1326 | "license": "MIT", 1327 | "dependencies": { 1328 | "bytes": "3.1.2", 1329 | "http-errors": "2.0.0", 1330 | "iconv-lite": "0.6.3", 1331 | "unpipe": "1.0.0" 1332 | }, 1333 | "engines": { 1334 | "node": ">= 0.8" 1335 | } 1336 | }, 1337 | "node_modules/readdirp": { 1338 | "version": "3.6.0", 1339 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1340 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1341 | "dev": true, 1342 | "license": "MIT", 1343 | "dependencies": { 1344 | "picomatch": "^2.2.1" 1345 | }, 1346 | "engines": { 1347 | "node": ">=8.10.0" 1348 | } 1349 | }, 1350 | "node_modules/rechoir": { 1351 | "version": "0.6.2", 1352 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 1353 | "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", 1354 | "dev": true, 1355 | "dependencies": { 1356 | "resolve": "^1.1.6" 1357 | }, 1358 | "engines": { 1359 | "node": ">= 0.10" 1360 | } 1361 | }, 1362 | "node_modules/resolve": { 1363 | "version": "1.22.10", 1364 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", 1365 | "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", 1366 | "dev": true, 1367 | "license": "MIT", 1368 | "dependencies": { 1369 | "is-core-module": "^2.16.0", 1370 | "path-parse": "^1.0.7", 1371 | "supports-preserve-symlinks-flag": "^1.0.0" 1372 | }, 1373 | "bin": { 1374 | "resolve": "bin/resolve" 1375 | }, 1376 | "engines": { 1377 | "node": ">= 0.4" 1378 | }, 1379 | "funding": { 1380 | "url": "https://github.com/sponsors/ljharb" 1381 | } 1382 | }, 1383 | "node_modules/reusify": { 1384 | "version": "1.1.0", 1385 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", 1386 | "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", 1387 | "dev": true, 1388 | "license": "MIT", 1389 | "engines": { 1390 | "iojs": ">=1.0.0", 1391 | "node": ">=0.10.0" 1392 | } 1393 | }, 1394 | "node_modules/router": { 1395 | "version": "2.2.0", 1396 | "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", 1397 | "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", 1398 | "license": "MIT", 1399 | "dependencies": { 1400 | "debug": "^4.4.0", 1401 | "depd": "^2.0.0", 1402 | "is-promise": "^4.0.0", 1403 | "parseurl": "^1.3.3", 1404 | "path-to-regexp": "^8.0.0" 1405 | }, 1406 | "engines": { 1407 | "node": ">= 18" 1408 | } 1409 | }, 1410 | "node_modules/run-parallel": { 1411 | "version": "1.2.0", 1412 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1413 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1414 | "dev": true, 1415 | "funding": [ 1416 | { 1417 | "type": "github", 1418 | "url": "https://github.com/sponsors/feross" 1419 | }, 1420 | { 1421 | "type": "patreon", 1422 | "url": "https://www.patreon.com/feross" 1423 | }, 1424 | { 1425 | "type": "consulting", 1426 | "url": "https://feross.org/support" 1427 | } 1428 | ], 1429 | "license": "MIT", 1430 | "dependencies": { 1431 | "queue-microtask": "^1.2.2" 1432 | } 1433 | }, 1434 | "node_modules/safe-buffer": { 1435 | "version": "5.2.1", 1436 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1437 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1438 | "funding": [ 1439 | { 1440 | "type": "github", 1441 | "url": "https://github.com/sponsors/feross" 1442 | }, 1443 | { 1444 | "type": "patreon", 1445 | "url": "https://www.patreon.com/feross" 1446 | }, 1447 | { 1448 | "type": "consulting", 1449 | "url": "https://feross.org/support" 1450 | } 1451 | ], 1452 | "license": "MIT" 1453 | }, 1454 | "node_modules/safer-buffer": { 1455 | "version": "2.1.2", 1456 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1457 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1458 | "license": "MIT" 1459 | }, 1460 | "node_modules/semver": { 1461 | "version": "5.7.2", 1462 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", 1463 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 1464 | "dev": true, 1465 | "license": "ISC", 1466 | "bin": { 1467 | "semver": "bin/semver" 1468 | } 1469 | }, 1470 | "node_modules/send": { 1471 | "version": "1.2.0", 1472 | "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", 1473 | "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", 1474 | "license": "MIT", 1475 | "dependencies": { 1476 | "debug": "^4.3.5", 1477 | "encodeurl": "^2.0.0", 1478 | "escape-html": "^1.0.3", 1479 | "etag": "^1.8.1", 1480 | "fresh": "^2.0.0", 1481 | "http-errors": "^2.0.0", 1482 | "mime-types": "^3.0.1", 1483 | "ms": "^2.1.3", 1484 | "on-finished": "^2.4.1", 1485 | "range-parser": "^1.2.1", 1486 | "statuses": "^2.0.1" 1487 | }, 1488 | "engines": { 1489 | "node": ">= 18" 1490 | } 1491 | }, 1492 | "node_modules/serve-static": { 1493 | "version": "2.2.0", 1494 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", 1495 | "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", 1496 | "license": "MIT", 1497 | "dependencies": { 1498 | "encodeurl": "^2.0.0", 1499 | "escape-html": "^1.0.3", 1500 | "parseurl": "^1.3.3", 1501 | "send": "^1.2.0" 1502 | }, 1503 | "engines": { 1504 | "node": ">= 18" 1505 | } 1506 | }, 1507 | "node_modules/setprototypeof": { 1508 | "version": "1.2.0", 1509 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1510 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 1511 | "license": "ISC" 1512 | }, 1513 | "node_modules/shebang-command": { 1514 | "version": "2.0.0", 1515 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1516 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1517 | "license": "MIT", 1518 | "dependencies": { 1519 | "shebang-regex": "^3.0.0" 1520 | }, 1521 | "engines": { 1522 | "node": ">=8" 1523 | } 1524 | }, 1525 | "node_modules/shebang-regex": { 1526 | "version": "3.0.0", 1527 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1528 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1529 | "license": "MIT", 1530 | "engines": { 1531 | "node": ">=8" 1532 | } 1533 | }, 1534 | "node_modules/shelljs": { 1535 | "version": "0.9.2", 1536 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz", 1537 | "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", 1538 | "dev": true, 1539 | "license": "BSD-3-Clause", 1540 | "dependencies": { 1541 | "execa": "^1.0.0", 1542 | "fast-glob": "^3.3.2", 1543 | "interpret": "^1.0.0", 1544 | "rechoir": "^0.6.2" 1545 | }, 1546 | "bin": { 1547 | "shjs": "bin/shjs" 1548 | }, 1549 | "engines": { 1550 | "node": ">=18" 1551 | } 1552 | }, 1553 | "node_modules/shx": { 1554 | "version": "0.4.0", 1555 | "resolved": "https://registry.npmjs.org/shx/-/shx-0.4.0.tgz", 1556 | "integrity": "sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==", 1557 | "dev": true, 1558 | "license": "MIT", 1559 | "dependencies": { 1560 | "minimist": "^1.2.8", 1561 | "shelljs": "^0.9.2" 1562 | }, 1563 | "bin": { 1564 | "shx": "lib/cli.js" 1565 | }, 1566 | "engines": { 1567 | "node": ">=18" 1568 | } 1569 | }, 1570 | "node_modules/side-channel": { 1571 | "version": "1.1.0", 1572 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", 1573 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 1574 | "license": "MIT", 1575 | "dependencies": { 1576 | "es-errors": "^1.3.0", 1577 | "object-inspect": "^1.13.3", 1578 | "side-channel-list": "^1.0.0", 1579 | "side-channel-map": "^1.0.1", 1580 | "side-channel-weakmap": "^1.0.2" 1581 | }, 1582 | "engines": { 1583 | "node": ">= 0.4" 1584 | }, 1585 | "funding": { 1586 | "url": "https://github.com/sponsors/ljharb" 1587 | } 1588 | }, 1589 | "node_modules/side-channel-list": { 1590 | "version": "1.0.0", 1591 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", 1592 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 1593 | "license": "MIT", 1594 | "dependencies": { 1595 | "es-errors": "^1.3.0", 1596 | "object-inspect": "^1.13.3" 1597 | }, 1598 | "engines": { 1599 | "node": ">= 0.4" 1600 | }, 1601 | "funding": { 1602 | "url": "https://github.com/sponsors/ljharb" 1603 | } 1604 | }, 1605 | "node_modules/side-channel-map": { 1606 | "version": "1.0.1", 1607 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", 1608 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 1609 | "license": "MIT", 1610 | "dependencies": { 1611 | "call-bound": "^1.0.2", 1612 | "es-errors": "^1.3.0", 1613 | "get-intrinsic": "^1.2.5", 1614 | "object-inspect": "^1.13.3" 1615 | }, 1616 | "engines": { 1617 | "node": ">= 0.4" 1618 | }, 1619 | "funding": { 1620 | "url": "https://github.com/sponsors/ljharb" 1621 | } 1622 | }, 1623 | "node_modules/side-channel-weakmap": { 1624 | "version": "1.0.2", 1625 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", 1626 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 1627 | "license": "MIT", 1628 | "dependencies": { 1629 | "call-bound": "^1.0.2", 1630 | "es-errors": "^1.3.0", 1631 | "get-intrinsic": "^1.2.5", 1632 | "object-inspect": "^1.13.3", 1633 | "side-channel-map": "^1.0.1" 1634 | }, 1635 | "engines": { 1636 | "node": ">= 0.4" 1637 | }, 1638 | "funding": { 1639 | "url": "https://github.com/sponsors/ljharb" 1640 | } 1641 | }, 1642 | "node_modules/signal-exit": { 1643 | "version": "3.0.7", 1644 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1645 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1646 | "dev": true, 1647 | "license": "ISC" 1648 | }, 1649 | "node_modules/simple-update-notifier": { 1650 | "version": "2.0.0", 1651 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", 1652 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", 1653 | "dev": true, 1654 | "license": "MIT", 1655 | "dependencies": { 1656 | "semver": "^7.5.3" 1657 | }, 1658 | "engines": { 1659 | "node": ">=10" 1660 | } 1661 | }, 1662 | "node_modules/simple-update-notifier/node_modules/semver": { 1663 | "version": "7.7.1", 1664 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", 1665 | "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", 1666 | "dev": true, 1667 | "license": "ISC", 1668 | "bin": { 1669 | "semver": "bin/semver.js" 1670 | }, 1671 | "engines": { 1672 | "node": ">=10" 1673 | } 1674 | }, 1675 | "node_modules/statuses": { 1676 | "version": "2.0.1", 1677 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1678 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1679 | "license": "MIT", 1680 | "engines": { 1681 | "node": ">= 0.8" 1682 | } 1683 | }, 1684 | "node_modules/strip-eof": { 1685 | "version": "1.0.0", 1686 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 1687 | "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", 1688 | "dev": true, 1689 | "license": "MIT", 1690 | "engines": { 1691 | "node": ">=0.10.0" 1692 | } 1693 | }, 1694 | "node_modules/supports-color": { 1695 | "version": "5.5.0", 1696 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1697 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1698 | "dev": true, 1699 | "license": "MIT", 1700 | "dependencies": { 1701 | "has-flag": "^3.0.0" 1702 | }, 1703 | "engines": { 1704 | "node": ">=4" 1705 | } 1706 | }, 1707 | "node_modules/supports-preserve-symlinks-flag": { 1708 | "version": "1.0.0", 1709 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1710 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1711 | "dev": true, 1712 | "license": "MIT", 1713 | "engines": { 1714 | "node": ">= 0.4" 1715 | }, 1716 | "funding": { 1717 | "url": "https://github.com/sponsors/ljharb" 1718 | } 1719 | }, 1720 | "node_modules/to-regex-range": { 1721 | "version": "5.0.1", 1722 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1723 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1724 | "dev": true, 1725 | "license": "MIT", 1726 | "dependencies": { 1727 | "is-number": "^7.0.0" 1728 | }, 1729 | "engines": { 1730 | "node": ">=8.0" 1731 | } 1732 | }, 1733 | "node_modules/toidentifier": { 1734 | "version": "1.0.1", 1735 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1736 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1737 | "license": "MIT", 1738 | "engines": { 1739 | "node": ">=0.6" 1740 | } 1741 | }, 1742 | "node_modules/touch": { 1743 | "version": "3.1.1", 1744 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", 1745 | "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", 1746 | "dev": true, 1747 | "license": "ISC", 1748 | "bin": { 1749 | "nodetouch": "bin/nodetouch.js" 1750 | } 1751 | }, 1752 | "node_modules/type-is": { 1753 | "version": "2.0.1", 1754 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", 1755 | "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", 1756 | "license": "MIT", 1757 | "dependencies": { 1758 | "content-type": "^1.0.5", 1759 | "media-typer": "^1.1.0", 1760 | "mime-types": "^3.0.0" 1761 | }, 1762 | "engines": { 1763 | "node": ">= 0.6" 1764 | } 1765 | }, 1766 | "node_modules/typescript": { 1767 | "version": "5.8.3", 1768 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", 1769 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 1770 | "dev": true, 1771 | "license": "Apache-2.0", 1772 | "bin": { 1773 | "tsc": "bin/tsc", 1774 | "tsserver": "bin/tsserver" 1775 | }, 1776 | "engines": { 1777 | "node": ">=14.17" 1778 | } 1779 | }, 1780 | "node_modules/undefsafe": { 1781 | "version": "2.0.5", 1782 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 1783 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 1784 | "dev": true, 1785 | "license": "MIT" 1786 | }, 1787 | "node_modules/undici-types": { 1788 | "version": "6.21.0", 1789 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", 1790 | "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", 1791 | "dev": true, 1792 | "license": "MIT" 1793 | }, 1794 | "node_modules/unpipe": { 1795 | "version": "1.0.0", 1796 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1797 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1798 | "license": "MIT", 1799 | "engines": { 1800 | "node": ">= 0.8" 1801 | } 1802 | }, 1803 | "node_modules/vary": { 1804 | "version": "1.1.2", 1805 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1806 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1807 | "license": "MIT", 1808 | "engines": { 1809 | "node": ">= 0.8" 1810 | } 1811 | }, 1812 | "node_modules/which": { 1813 | "version": "2.0.2", 1814 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1815 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1816 | "license": "ISC", 1817 | "dependencies": { 1818 | "isexe": "^2.0.0" 1819 | }, 1820 | "bin": { 1821 | "node-which": "bin/node-which" 1822 | }, 1823 | "engines": { 1824 | "node": ">= 8" 1825 | } 1826 | }, 1827 | "node_modules/wrappy": { 1828 | "version": "1.0.2", 1829 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1830 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1831 | "license": "ISC" 1832 | }, 1833 | "node_modules/zod": { 1834 | "version": "3.24.2", 1835 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", 1836 | "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", 1837 | "license": "MIT", 1838 | "funding": { 1839 | "url": "https://github.com/sponsors/colinhacks" 1840 | } 1841 | }, 1842 | "node_modules/zod-to-json-schema": { 1843 | "version": "3.24.5", 1844 | "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", 1845 | "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", 1846 | "license": "ISC", 1847 | "peerDependencies": { 1848 | "zod": "^3.24.1" 1849 | } 1850 | } 1851 | } 1852 | } 1853 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@magicuidesign/mcp", 3 | "version": "1.0.6", 4 | "description": "Official MCP server for Magic UI.", 5 | "homepage": "https://magicui.design", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/magicuidesign/mcp.git" 9 | }, 10 | "scripts": { 11 | "build": "tsc && shx chmod +x dist/*.js", 12 | "start": "node dist/server.js", 13 | "dev": "nodemon --watch src --ext ts,json --exec \"npm run build\"" 14 | }, 15 | "type": "module", 16 | "main": "./dist/server.js", 17 | "module": "./dist/server.js", 18 | "types": "./dist/server.d.ts", 19 | "bin": { 20 | "mcp": "./dist/server.js" 21 | }, 22 | "files": [ 23 | "dist" 24 | ], 25 | "dependencies": { 26 | "@modelcontextprotocol/sdk": "^1.9.0", 27 | "zod": "^3.24.2" 28 | }, 29 | "devDependencies": { 30 | "@types/node": "^22.14.1", 31 | "nodemon": "^3.1.0", 32 | "shx": "^0.4.0", 33 | "typescript": "^5.8.3" 34 | }, 35 | "author": "Beau Hayes-Pollard ", 36 | "license": "ISC" 37 | } 38 | -------------------------------------------------------------------------------- /public/mcp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/magicuidesign/mcp/46393a5a16368f7d62b5d6722f46c0a7538d997e/public/mcp.png -------------------------------------------------------------------------------- /src/server.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; 4 | import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; 5 | import { 6 | IndividualComponentSchema, 7 | fetchComponentDetails, 8 | fetchExampleComponents, 9 | fetchExampleDetails, 10 | fetchUIComponents, 11 | } from "./utils/index.js"; 12 | import { formatComponentName } from "./utils/formatters.js"; 13 | 14 | // Initialize the MCP Server 15 | const server = new McpServer({ 16 | name: "Magic UI MCP", 17 | version: "1.0.4", 18 | }); 19 | 20 | // Register the main tool for getting all components 21 | server.tool( 22 | "getUIComponents", 23 | "Provides a comprehensive list of all Magic UI components.", 24 | {}, 25 | async () => { 26 | try { 27 | const uiComponents = await fetchUIComponents(); 28 | 29 | return { 30 | content: [ 31 | { 32 | type: "text", 33 | text: JSON.stringify(uiComponents, null, 2), 34 | }, 35 | ], 36 | }; 37 | } catch (error) { 38 | return { 39 | content: [ 40 | { 41 | type: "text", 42 | text: "Failed to fetch MagicUI components", 43 | }, 44 | ], 45 | isError: true, 46 | }; 47 | } 48 | }, 49 | ); 50 | 51 | // Maps component names to their example implementations 52 | function buildExampleComponentMap( 53 | allExampleComponents: Array<{ 54 | name: string; 55 | registryDependencies?: string[]; 56 | }>, 57 | ): Map { 58 | const exampleMap = new Map(); 59 | 60 | for (const example of allExampleComponents) { 61 | if ( 62 | example.registryDependencies && 63 | Array.isArray(example.registryDependencies) 64 | ) { 65 | for (const depUrl of example.registryDependencies) { 66 | if (typeof depUrl === "string" && depUrl.includes("magicui.design")) { 67 | const componentNameMatch = depUrl.match(/\/r\/([^\/]+)$/); 68 | if (componentNameMatch && componentNameMatch[1]) { 69 | const componentName = componentNameMatch[1]; 70 | if (!exampleMap.has(componentName)) { 71 | exampleMap.set(componentName, []); 72 | } 73 | if (!exampleMap.get(componentName)?.includes(example.name)) { 74 | exampleMap.get(componentName)?.push(example.name); 75 | } 76 | } 77 | } 78 | } 79 | } 80 | } 81 | return exampleMap; 82 | } 83 | 84 | // Component category definitions 85 | const componentCategories = { 86 | Layout: [ 87 | "bento-grid", 88 | "dock", 89 | "file-tree", 90 | "grid-pattern", 91 | "interactive-grid-pattern", 92 | "dot-pattern", 93 | ], 94 | Media: [ 95 | "hero-video-dialog", 96 | "terminal", 97 | "marquee", 98 | "script-copy-btn", 99 | "code-comparison", 100 | ], 101 | Motion: [ 102 | "blur-fade", 103 | "scroll-progress", 104 | "scroll-based-velocity", 105 | "orbiting-circles", 106 | "animated-circular-progress-bar", 107 | ], 108 | TextReveal: [ 109 | "text-animate", 110 | "line-shadow-text", 111 | "aurora-text", 112 | "animated-shiny-text", 113 | "animated-gradient-text", 114 | "text-reveal", 115 | "typing-animation", 116 | "box-reveal", 117 | "number-ticker", 118 | ], 119 | TextEffects: [ 120 | "word-rotate", 121 | "flip-text", 122 | "hyper-text", 123 | "morphing-text", 124 | "spinning-text", 125 | "sparkles-text", 126 | ], 127 | Buttons: [ 128 | "rainbow-button", 129 | "shimmer-button", 130 | "shiny-button", 131 | "interactive-hover-button", 132 | "animated-subscribe-button", 133 | "pulsating-button", 134 | "ripple-button", 135 | ], 136 | Effects: [ 137 | "animated-beam", 138 | "border-beam", 139 | "shine-border", 140 | "magic-card", 141 | "meteors", 142 | "neon-gradient-card", 143 | "confetti", 144 | "particles", 145 | "cool-mode", 146 | "scratch-to-reveal", 147 | ], 148 | Widgets: [ 149 | "animated-list", 150 | "tweet-card", 151 | "client-tweet-card", 152 | "lens", 153 | "pointer", 154 | "avatar-circles", 155 | "icon-cloud", 156 | "globe", 157 | ], 158 | Backgrounds: [ 159 | "warp-background", 160 | "flickering-grid", 161 | "animated-grid-pattern", 162 | "retro-grid", 163 | "ripple", 164 | ], 165 | Devices: [ 166 | "safari", 167 | "iphone-15-pro", 168 | "android", 169 | ], 170 | }; 171 | 172 | // Fetches detailed information about components in a specific category 173 | async function fetchComponentsByCategory( 174 | categoryComponents: string[], 175 | allComponents: any[], 176 | exampleNamesByComponent: Map, 177 | ) { 178 | const componentResults = []; 179 | 180 | for (const componentName of categoryComponents) { 181 | const component = allComponents.find((c) => c.name === componentName); 182 | if (!component) continue; 183 | 184 | try { 185 | const componentDetails = await fetchComponentDetails(componentName); 186 | const componentContent = componentDetails.files[0]?.content; 187 | 188 | const relevantExampleNames = 189 | exampleNamesByComponent.get(componentName) || []; 190 | 191 | // Generate installation instructions 192 | const installInstructions = `Install the component using the same process as \ 193 | shadcn/ui. If you run into linter or dependency errors, make sure to install the \ 194 | component using these instructions. For example, with npm/npx: npx shadcn@latest add \ 195 | "https://magicui.design/r/${componentName}.json" (Rules: make sure the URL is wrapped in \ 196 | double quotes and use shadcn not shadcn-ui, or the command will fail). After installation, \ 197 | you can import the component like this: import { ${formatComponentName(component.name)} } from \ 198 | "@/components/ui/${componentName}";`; 199 | 200 | const disclaimerText = `The code below is for context only. It helps you understand \ 201 | the component's props, types, and behavior. To actually install and use the \ 202 | component, refer to the install instructions above. After installing, the component \ 203 | will be available for import via: import { ${formatComponentName(component.name)} } \ 204 | from "@/components/ui/${componentName}";`; 205 | 206 | const exampleDetailsList = await Promise.all( 207 | relevantExampleNames.map((name) => fetchExampleDetails(name)), 208 | ); 209 | 210 | const formattedExamples = exampleDetailsList 211 | .filter((details) => details !== null) 212 | .map((details) => ({ 213 | name: details.name, 214 | type: details.type, 215 | description: details.description, 216 | content: details.files[0]?.content, 217 | })); 218 | 219 | const validatedComponent = IndividualComponentSchema.parse({ 220 | name: component.name, 221 | type: component.type, 222 | description: component.description, 223 | install: installInstructions, 224 | content: componentContent && disclaimerText + componentContent, 225 | examples: formattedExamples, 226 | }); 227 | 228 | componentResults.push(validatedComponent); 229 | } catch (error) { 230 | console.error(`Error processing component ${componentName}:`, error); 231 | } 232 | } 233 | 234 | return componentResults; 235 | } 236 | 237 | // Registers tools for each component category 238 | async function registerCategoryTools() { 239 | const [components, allExampleComponents] = await Promise.all([ 240 | fetchUIComponents(), 241 | fetchExampleComponents(), 242 | ]); 243 | 244 | const exampleNamesByComponent = 245 | buildExampleComponentMap(allExampleComponents); 246 | 247 | for (const [category, categoryComponents] of Object.entries( 248 | componentCategories, 249 | )) { 250 | const componentNamesString = categoryComponents.join(", "); 251 | 252 | server.tool( 253 | `get${category}`, 254 | `Provides implementation details for ${componentNamesString} components.`, 255 | {}, 256 | async () => { 257 | try { 258 | const categoryResults = await fetchComponentsByCategory( 259 | categoryComponents, 260 | components, 261 | exampleNamesByComponent, 262 | ); 263 | 264 | return { 265 | content: [ 266 | { 267 | type: "text", 268 | text: JSON.stringify(categoryResults, null, 2), 269 | }, 270 | ], 271 | }; 272 | } catch (error) { 273 | let errorMessage = `Error processing ${category} components`; 274 | if (error instanceof Error) { 275 | errorMessage += `: ${error.message}`; 276 | } 277 | return { 278 | content: [{ type: "text", text: errorMessage }], 279 | isError: true, 280 | }; 281 | } 282 | }, 283 | ); 284 | } 285 | } 286 | 287 | // Initialize category tools before starting the server 288 | registerCategoryTools() 289 | .then(() => { 290 | const transport = new StdioServerTransport(); 291 | server.connect(transport); 292 | }) 293 | .catch((error) => { 294 | console.error("Error registering category tools:", error); 295 | const transport = new StdioServerTransport(); 296 | server.connect(transport); 297 | }); -------------------------------------------------------------------------------- /src/utils/api.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ComponentDetailSchema, 3 | ComponentSchema, 4 | ExampleComponentSchema, 5 | ExampleDetailSchema, 6 | } from "./schemas.js"; 7 | 8 | // Function to fetch UI components 9 | export async function fetchUIComponents() { 10 | try { 11 | const response = await fetch("https://magicui.design/registry.json"); 12 | if (!response.ok) { 13 | throw new Error( 14 | `Failed to fetch registry.json: ${response.statusText} (Status: ${response.status})`, 15 | ); 16 | } 17 | const data = await response.json(); 18 | 19 | return data.items 20 | .filter((item: any) => item.type === "registry:ui") 21 | .map((item: any) => { 22 | try { 23 | return ComponentSchema.parse({ 24 | name: item.name, 25 | type: item.type, 26 | description: item.description, 27 | }); 28 | } catch (parseError) { 29 | return null; 30 | } 31 | }); 32 | } catch (error) { 33 | return []; 34 | } 35 | } 36 | 37 | // Function to fetch individual component details 38 | export async function fetchComponentDetails(name: string) { 39 | try { 40 | const response = await fetch(`https://magicui.design/r/${name}`); 41 | if (!response.ok) { 42 | throw new Error( 43 | `Failed to fetch component ${name}: ${response.statusText}`, 44 | ); 45 | } 46 | const data = await response.json(); 47 | return ComponentDetailSchema.parse(data); 48 | } catch (error) { 49 | console.error(`Error fetching component ${name}:`, error); 50 | throw error; 51 | } 52 | } 53 | 54 | // Function to fetch example components 55 | export async function fetchExampleComponents() { 56 | try { 57 | const response = await fetch("https://magicui.design/registry.json"); 58 | const data = await response.json(); 59 | 60 | return data.items 61 | .filter((item: any) => item.type === "registry:example") 62 | .map((item: any) => { 63 | return ExampleComponentSchema.parse({ 64 | name: item.name, 65 | type: item.type, 66 | description: item.description, 67 | registryDependencies: item.registryDependencies, 68 | }); 69 | }); 70 | } catch (error) { 71 | console.error("Error fetching MagicUI example components:", error); 72 | return []; 73 | } 74 | } 75 | 76 | // Function to fetch details for a specific example 77 | export async function fetchExampleDetails(exampleName: string) { 78 | try { 79 | const response = await fetch(`https://magicui.design/r/${exampleName}`); 80 | if (!response.ok) { 81 | throw new Error( 82 | `Failed to fetch example details for ${exampleName}: ${response.statusText}`, 83 | ); 84 | } 85 | const data = await response.json(); 86 | return ExampleDetailSchema.parse(data); 87 | } catch (error) { 88 | console.error(`Error fetching example details for ${exampleName}:`, error); 89 | throw error; 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/utils/formatters.ts: -------------------------------------------------------------------------------- 1 | // Helper function to format component names 2 | export function formatComponentName(name: string): string { 3 | return name 4 | .split("-") 5 | .map((part) => { 6 | return part.charAt(0).toUpperCase() + part.slice(1); 7 | }) 8 | .join(""); 9 | } 10 | -------------------------------------------------------------------------------- /src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./api.js"; 2 | export * from "./formatters.js"; 3 | export * from "./schemas.js"; 4 | -------------------------------------------------------------------------------- /src/utils/schemas.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod"; 2 | 3 | // Define schema for general component 4 | export const ComponentSchema = z.object({ 5 | name: z.string(), 6 | type: z.string(), 7 | description: z.string().optional(), // Only optional because of interactive-hover-button 8 | }); 9 | 10 | // Define schema for an individual example 11 | const ExampleSchema = z.object({ 12 | name: z.string(), 13 | type: z.string(), 14 | description: z.string(), 15 | content: z.string(), 16 | }); 17 | 18 | // Define schema for individual component with content and examples 19 | export const IndividualComponentSchema = ComponentSchema.extend({ 20 | install: z.string(), 21 | content: z.string(), 22 | examples: z.array(ExampleSchema), 23 | }); 24 | 25 | // Define schema for component detail response 26 | export const ComponentDetailSchema = z.object({ 27 | name: z.string(), 28 | type: z.string(), 29 | files: z.array( 30 | z.object({ 31 | content: z.string(), 32 | }), 33 | ), 34 | }); 35 | 36 | // Define schema for example component 37 | export const ExampleComponentSchema = z.object({ 38 | name: z.string(), 39 | type: z.string(), 40 | description: z.string(), 41 | registryDependencies: z.array(z.string()), 42 | }); 43 | 44 | // Define schema for example detail response 45 | export const ExampleDetailSchema = z.object({ 46 | name: z.string(), 47 | type: z.string(), 48 | description: z.string(), 49 | files: z.array( 50 | z.object({ 51 | content: z.string(), 52 | }), 53 | ), 54 | }); 55 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "esModuleInterop": true, 5 | "skipLibCheck": true, 6 | "target": "ES2022", 7 | "allowJs": true, 8 | "resolveJsonModule": true, 9 | "moduleDetection": "force", 10 | "isolatedModules": true, 11 | "strict": true, 12 | "noUncheckedIndexedAccess": true, 13 | "noImplicitAny": true, 14 | "module": "esnext", 15 | "moduleResolution": "bundler", 16 | "outDir": "dist", 17 | "rootDir": "src", 18 | "sourceMap": true, 19 | "declaration": true, 20 | "incremental": true, 21 | }, 22 | "include": ["**/*.ts"], 23 | "exclude": ["node_modules", "dist"] 24 | } --------------------------------------------------------------------------------