├── .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 | [](https://badge.fury.io/js/@magicuidesign%2Fmcp)
4 |
5 | Official ModelContextProtocol (MCP) server for [Magic UI](https://magicui.design/).
6 |
7 |
8 |

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 | }
--------------------------------------------------------------------------------