├── .gitignore ├── .vscode ├── launch.json ├── mcp.json └── tasks.json ├── Dockerfile ├── Dockerfile.streamable-http ├── LICENSE ├── README.md ├── images ├── usage-confirm.png └── usage-result.png ├── package-lock.json ├── package.json ├── scripts └── generateUrlForInstallation.js ├── smithery.yaml ├── src ├── cli.ts ├── constants.ts ├── index.ts ├── server.ts ├── stdio.ts └── streamableHttp.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # vitepress build output 108 | **/.vitepress/dist 109 | 110 | # vitepress cache directory 111 | **/.vitepress/cache 112 | 113 | # Docusaurus cache and generated files 114 | .docusaurus 115 | 116 | # Serverless directories 117 | .serverless/ 118 | 119 | # FuseBox cache 120 | .fusebox/ 121 | 122 | # DynamoDB Local files 123 | .dynamodb/ 124 | 125 | # TernJS port file 126 | .tern-port 127 | 128 | # Stores VSCode versions used for testing VSCode extensions 129 | .vscode-test 130 | 131 | # yarn v2 132 | .yarn/cache 133 | .yarn/unplugged 134 | .yarn/build-state.yml 135 | .yarn/install-state.gz 136 | .pnp.* -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "type": "node", 6 | "request": "launch", 7 | "name": "Debug MCP Server", 8 | "skipFiles": [ 9 | "/**" 10 | ], 11 | "outFiles": [ 12 | "${workspaceFolder}/dist/**/*.js" 13 | ], 14 | "runtimeExecutable": "npx", 15 | "runtimeArgs": [ 16 | "-y", 17 | "@modelcontextprotocol/inspector", 18 | "node", 19 | "dist/cli.js" 20 | ], 21 | "console": "integratedTerminal", 22 | "preLaunchTask": "npm: watch", 23 | "serverReadyAction": { 24 | "action": "openExternally", 25 | "pattern": "running at (https?://\\S+)", 26 | "uriFormat": "%s?timeout=60000" 27 | } 28 | } 29 | ] 30 | } -------------------------------------------------------------------------------- /.vscode/mcp.json: -------------------------------------------------------------------------------- 1 | { 2 | "servers": { 3 | "mcp-server-code-runner-stdio": { 4 | "type": "stdio", 5 | "command": "node", 6 | "args": [ 7 | "${workspaceFolder}/dist/cli.js" 8 | ] 9 | }, 10 | // "mcp-server-code-runner-streamable-http": { 11 | // "type": "http", 12 | // "url": "http://localhost:3088/mcp" 13 | // }, 14 | } 15 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "npm", 6 | "script": "watch", 7 | "problemMatcher": [ 8 | "$tsc-watch" 9 | ], 10 | "isBackground": true, 11 | "label": "npm: watch", 12 | "group": { 13 | "kind": "build", 14 | "isDefault": true 15 | } 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Generated by https://smithery.ai. See: https://smithery.ai/docs/config#dockerfile 2 | ## Stage 1: Builder 3 | FROM node:lts-alpine AS builder 4 | 5 | # Set working directory 6 | WORKDIR /app 7 | 8 | # Copy all files into the container 9 | COPY . . 10 | 11 | # Install dependencies without running scripts 12 | RUN npm install --ignore-scripts 13 | 14 | # Build the TypeScript source code 15 | RUN npm run build 16 | 17 | ## Stage 2: Runtime 18 | FROM node:lts-alpine 19 | 20 | WORKDIR /app 21 | 22 | # Install Python and other programming languages 23 | RUN apk add --no-cache \ 24 | python3 \ 25 | go \ 26 | php \ 27 | ruby 28 | 29 | # Copy only the necessary files from the builder stage 30 | COPY --from=builder /app/dist ./dist 31 | COPY package*.json ./ 32 | 33 | # Install only production dependencies 34 | RUN npm install --production --ignore-scripts 35 | 36 | # Use a non-root user for security (optional) 37 | RUN adduser -D mcpuser 38 | USER mcpuser 39 | 40 | # Set the entrypoint command 41 | CMD ["node", "./dist/cli.js"] 42 | -------------------------------------------------------------------------------- /Dockerfile.streamable-http: -------------------------------------------------------------------------------- 1 | # Generated by https://smithery.ai. See: https://smithery.ai/docs/config#dockerfile 2 | ## Stage 1: Builder 3 | FROM node:lts-alpine AS builder 4 | 5 | # Set working directory 6 | WORKDIR /app 7 | 8 | # Copy all files into the container 9 | COPY . . 10 | 11 | # Install dependencies without running scripts 12 | RUN npm install --ignore-scripts 13 | 14 | # Build the TypeScript source code 15 | RUN npm run build 16 | 17 | ## Stage 2: Runtime 18 | FROM node:lts-alpine 19 | 20 | WORKDIR /app 21 | 22 | # Install Python and other programming languages 23 | RUN apk add --no-cache \ 24 | python3 \ 25 | go \ 26 | php \ 27 | ruby 28 | 29 | # Copy only the necessary files from the builder stage 30 | COPY --from=builder /app/dist ./dist 31 | COPY package*.json ./ 32 | 33 | # Install only production dependencies 34 | RUN npm install --production --ignore-scripts 35 | 36 | # Use a non-root user for security (optional) 37 | RUN adduser -D mcpuser 38 | USER mcpuser 39 | 40 | # Set the entrypoint command 41 | CMD ["node", "./dist/cli.js", "--transport", "http"] 42 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Jun Han 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 | # Code Runner MCP Server 2 | [![NPM Downloads](https://img.shields.io/npm/d18m/mcp-server-code-runner)](https://www.npmjs.com/package/mcp-server-code-runner) [![smithery badge](https://smithery.ai/badge/@formulahendry/mcp-server-code-runner)](https://smithery.ai/server/@formulahendry/mcp-server-code-runner) [![Docker Pulls](https://img.shields.io/docker/pulls/formulahendry/mcp-server-code-runner)](https://hub.docker.com/r/formulahendry/mcp-server-code-runner) 3 | 4 | MCP Server for running code snippet and show the result. 5 | 6 | It supports running multiple programming languages: **JavaScript, PHP, Python, Perl, Perl 6, Ruby, Go, Lua, Groovy, PowerShell, BAT/CMD, BASH/SH, F# Script, C# Script, VBScript, TypeScript, CoffeeScript, Scala, Swift, Julia, Crystal, OCaml Script, R, AppleScript, Elixir, Clojure, Racket, Scheme, AutoHotkey, AutoIt, Kotlin Script, Dart, Haskell, Ni, Lisp, Kit, V, SCSS, Sass**. Full list could be seen here in [constants.ts](https://github.com/formulahendry/mcp-server-code-runner/blob/main/src/constants.ts). 7 | 8 | 9 | mcp-server-code-runner MCP server 10 | 11 | 12 | ## Setup 13 | 14 | ### npx for VS Code 15 | 16 | Install the Code Runner MCP server in VS Code using below buttons: 17 | 18 | [![Install in VS Code](https://img.shields.io/badge/Install_MCP_Server_(npx)-VS_Code-0098FF)](https://vscode.dev/redirect?url=vscode%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522mcp-server-code-runner%2522%252C%2522command%2522%253A%2522npx%2522%252C%2522args%2522%253A%255B%2522-y%2522%252C%2522mcp-server-code-runner%2540latest%2522%255D%257D) [![Install in VS Code Insiders](https://img.shields.io/badge/Install_MCP_Server_(npx)-VS_Code_Insiders-24bfa5)](https://insiders.vscode.dev/redirect?url=vscode-insiders%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522mcp-server-code-runner%2522%252C%2522command%2522%253A%2522npx%2522%252C%2522args%2522%253A%255B%2522-y%2522%252C%2522mcp-server-code-runner%2540latest%2522%255D%257D) 19 | 20 | Alternatively, you can add configuration in `settings.json`: 21 | 22 | ```json 23 | { 24 | "mcp": { 25 | "inputs": [], 26 | "servers": { 27 | "mcp-server-code-runner": { 28 | "command": "npx", 29 | "args": [ 30 | "-y", 31 | "mcp-server-code-runner@latest" 32 | ], 33 | } 34 | } 35 | } 36 | } 37 | ``` 38 | 39 | ### npx for Claude Desktop 40 | 41 | Configuration in `claude_desktop_config.json`: 42 | 43 | ```json 44 | { 45 | "mcpServers": { 46 | "mcp-server-code-runner": { 47 | "command": "npx", 48 | "args": [ 49 | "-y", 50 | "mcp-server-code-runner@latest" 51 | ], 52 | } 53 | } 54 | } 55 | ``` 56 | 57 | ### Docker 58 | 59 | Use VS Code as example. Install the Code Runner MCP server in VS Code using below buttons: 60 | 61 | [![Install in VS Code](https://img.shields.io/badge/Install_MCP_Server_(Docker)-VS_Code-0098FF)](https://vscode.dev/redirect?url=vscode%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522mcp-server-code-runner%2522%252C%2522command%2522%253A%2522docker%2522%252C%2522args%2522%253A%255B%2522run%2522%252C%2522--rm%2522%252C%2522-i%2522%252C%2522formulahendry%252Fmcp-server-code-runner%2522%255D%257D) [![Install in VS Code Insiders](https://img.shields.io/badge/Install_MCP_Server_(Docker)-VS_Code_Insiders-24bfa5)](https://insiders.vscode.dev/redirect?url=vscode-insiders%3Amcp%2Finstall%3F%257B%2522name%2522%253A%2522mcp-server-code-runner%2522%252C%2522command%2522%253A%2522docker%2522%252C%2522args%2522%253A%255B%2522run%2522%252C%2522--rm%2522%252C%2522-i%2522%252C%2522formulahendry%252Fmcp-server-code-runner%2522%255D%257D) 62 | 63 | Alternatively, you can add configuration in `settings.json`: 64 | 65 | ```json 66 | { 67 | "mcp": { 68 | "inputs": [], 69 | "servers": { 70 | "mcp-server-code-runner": { 71 | "command": "docker", 72 | "args": [ 73 | "run", 74 | "--rm", 75 | "-i", 76 | "formulahendry/mcp-server-code-runner" 77 | ] 78 | } 79 | } 80 | } 81 | } 82 | ``` 83 | 84 | ### npx issue on Widnows 85 | 86 | On Windows, [MCP servers may fail to connect with `npx`](https://github.com/modelcontextprotocol/servers/issues/40). 87 | 88 | You could try below two workarounds: 89 | 90 | #### use bunx 91 | 92 | 1. Install [Bun](https://bun.sh/docs/installation). 93 | 2. In configuration, change `npx` with `bunx`. 94 | 95 | #### use cmd 96 | 97 | Below is VS Code configuration in `settings.json`: 98 | 99 | ```json 100 | { 101 | "mcp": { 102 | "inputs": [], 103 | "servers": { 104 | "mcp-server-code-runner": { 105 | "command": "cmd", 106 | "args": [ 107 | "/c", 108 | "npx", 109 | "-y", 110 | "mcp-server-code-runner@latest" 111 | ], 112 | } 113 | } 114 | } 115 | } 116 | ``` 117 | 118 | ## Run with [Streamable HTTP Transport](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http) 119 | 120 | ```shell 121 | npm install -g mcp-server-code-runner@latest 122 | mcp-server-code-runner --transport http 123 | ``` 124 | 125 | ## Usage 126 | 127 | Before using Code Runner MCP Server, please make sure interpreter or compiler of the programming language you want to run is set in `PATH` environment variable. 128 | 129 | Try below prompts in the application which has configured Code Runner MCP Server: 130 | 131 | * `Run the JavaScript Code: console.log(5+6)` 132 | * `Where is temporary folder in my OS? Use run-code tool` 133 | * `How many CPUs do I have in my machine? Use run-code tool` 134 | 135 | ![](./images/usage-confirm.png) 136 | 137 | ![](./images/usage-result.png) 138 | 139 | ## Build your own MCP Server 140 | 141 | Want to build your own MCP Server? Try [Yeoman Generator for MCP Server](https://www.npmjs.com/package/generator-mcp) to create your MCP Server project! 142 | -------------------------------------------------------------------------------- /images/usage-confirm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/formulahendry/mcp-server-code-runner/a3203fb22a080c6013a81ada2457e7239b0ddd05/images/usage-confirm.png -------------------------------------------------------------------------------- /images/usage-result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/formulahendry/mcp-server-code-runner/a3203fb22a080c6013a81ada2457e7239b0ddd05/images/usage-result.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mcp-server-code-runner", 3 | "version": "0.1.7", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "mcp-server-code-runner", 9 | "version": "0.1.7", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@modelcontextprotocol/sdk": "^1.10.1", 13 | "commander": "^13.1.0", 14 | "express": "^5.1.0", 15 | "zod": "^3.24.2" 16 | }, 17 | "bin": { 18 | "mcp-server-code-runner": "dist/cli.js" 19 | }, 20 | "devDependencies": { 21 | "@types/express": "^5.0.1", 22 | "@types/node": "^22.13.10", 23 | "shx": "^0.4.0", 24 | "typescript": "^5.8.2" 25 | } 26 | }, 27 | "node_modules/@modelcontextprotocol/sdk": { 28 | "version": "1.10.1", 29 | "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.10.1.tgz", 30 | "integrity": "sha512-xNYdFdkJqEfIaTVP1gPKoEvluACHZsHZegIoICX8DM1o6Qf3G5u2BQJHmgd0n4YgRPqqK/u1ujQvrgAxxSJT9w==", 31 | "license": "MIT", 32 | "dependencies": { 33 | "content-type": "^1.0.5", 34 | "cors": "^2.8.5", 35 | "cross-spawn": "^7.0.3", 36 | "eventsource": "^3.0.2", 37 | "express": "^5.0.1", 38 | "express-rate-limit": "^7.5.0", 39 | "pkce-challenge": "^5.0.0", 40 | "raw-body": "^3.0.0", 41 | "zod": "^3.23.8", 42 | "zod-to-json-schema": "^3.24.1" 43 | }, 44 | "engines": { 45 | "node": ">=18" 46 | } 47 | }, 48 | "node_modules/@modelcontextprotocol/sdk/node_modules/cross-spawn": { 49 | "version": "7.0.6", 50 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 51 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 52 | "license": "MIT", 53 | "dependencies": { 54 | "path-key": "^3.1.0", 55 | "shebang-command": "^2.0.0", 56 | "which": "^2.0.1" 57 | }, 58 | "engines": { 59 | "node": ">= 8" 60 | } 61 | }, 62 | "node_modules/@modelcontextprotocol/sdk/node_modules/path-key": { 63 | "version": "3.1.1", 64 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 65 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 66 | "license": "MIT", 67 | "engines": { 68 | "node": ">=8" 69 | } 70 | }, 71 | "node_modules/@modelcontextprotocol/sdk/node_modules/shebang-command": { 72 | "version": "2.0.0", 73 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 74 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 75 | "license": "MIT", 76 | "dependencies": { 77 | "shebang-regex": "^3.0.0" 78 | }, 79 | "engines": { 80 | "node": ">=8" 81 | } 82 | }, 83 | "node_modules/@modelcontextprotocol/sdk/node_modules/shebang-regex": { 84 | "version": "3.0.0", 85 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 86 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 87 | "license": "MIT", 88 | "engines": { 89 | "node": ">=8" 90 | } 91 | }, 92 | "node_modules/@modelcontextprotocol/sdk/node_modules/which": { 93 | "version": "2.0.2", 94 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 95 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 96 | "license": "ISC", 97 | "dependencies": { 98 | "isexe": "^2.0.0" 99 | }, 100 | "bin": { 101 | "node-which": "bin/node-which" 102 | }, 103 | "engines": { 104 | "node": ">= 8" 105 | } 106 | }, 107 | "node_modules/@nodelib/fs.scandir": { 108 | "version": "2.1.5", 109 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 110 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 111 | "dev": true, 112 | "license": "MIT", 113 | "dependencies": { 114 | "@nodelib/fs.stat": "2.0.5", 115 | "run-parallel": "^1.1.9" 116 | }, 117 | "engines": { 118 | "node": ">= 8" 119 | } 120 | }, 121 | "node_modules/@nodelib/fs.stat": { 122 | "version": "2.0.5", 123 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 124 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 125 | "dev": true, 126 | "license": "MIT", 127 | "engines": { 128 | "node": ">= 8" 129 | } 130 | }, 131 | "node_modules/@nodelib/fs.walk": { 132 | "version": "1.2.8", 133 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 134 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 135 | "dev": true, 136 | "license": "MIT", 137 | "dependencies": { 138 | "@nodelib/fs.scandir": "2.1.5", 139 | "fastq": "^1.6.0" 140 | }, 141 | "engines": { 142 | "node": ">= 8" 143 | } 144 | }, 145 | "node_modules/@types/body-parser": { 146 | "version": "1.19.5", 147 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", 148 | "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", 149 | "dev": true, 150 | "license": "MIT", 151 | "dependencies": { 152 | "@types/connect": "*", 153 | "@types/node": "*" 154 | } 155 | }, 156 | "node_modules/@types/connect": { 157 | "version": "3.4.38", 158 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", 159 | "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", 160 | "dev": true, 161 | "license": "MIT", 162 | "dependencies": { 163 | "@types/node": "*" 164 | } 165 | }, 166 | "node_modules/@types/express": { 167 | "version": "5.0.1", 168 | "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.1.tgz", 169 | "integrity": "sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==", 170 | "dev": true, 171 | "license": "MIT", 172 | "dependencies": { 173 | "@types/body-parser": "*", 174 | "@types/express-serve-static-core": "^5.0.0", 175 | "@types/serve-static": "*" 176 | } 177 | }, 178 | "node_modules/@types/express-serve-static-core": { 179 | "version": "5.0.6", 180 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", 181 | "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", 182 | "dev": true, 183 | "license": "MIT", 184 | "dependencies": { 185 | "@types/node": "*", 186 | "@types/qs": "*", 187 | "@types/range-parser": "*", 188 | "@types/send": "*" 189 | } 190 | }, 191 | "node_modules/@types/http-errors": { 192 | "version": "2.0.4", 193 | "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", 194 | "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", 195 | "dev": true, 196 | "license": "MIT" 197 | }, 198 | "node_modules/@types/mime": { 199 | "version": "1.3.5", 200 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", 201 | "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", 202 | "dev": true, 203 | "license": "MIT" 204 | }, 205 | "node_modules/@types/node": { 206 | "version": "22.13.10", 207 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", 208 | "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", 209 | "dev": true, 210 | "license": "MIT", 211 | "dependencies": { 212 | "undici-types": "~6.20.0" 213 | } 214 | }, 215 | "node_modules/@types/qs": { 216 | "version": "6.9.18", 217 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", 218 | "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", 219 | "dev": true, 220 | "license": "MIT" 221 | }, 222 | "node_modules/@types/range-parser": { 223 | "version": "1.2.7", 224 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", 225 | "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", 226 | "dev": true, 227 | "license": "MIT" 228 | }, 229 | "node_modules/@types/send": { 230 | "version": "0.17.4", 231 | "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", 232 | "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", 233 | "dev": true, 234 | "license": "MIT", 235 | "dependencies": { 236 | "@types/mime": "^1", 237 | "@types/node": "*" 238 | } 239 | }, 240 | "node_modules/@types/serve-static": { 241 | "version": "1.15.7", 242 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", 243 | "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", 244 | "dev": true, 245 | "license": "MIT", 246 | "dependencies": { 247 | "@types/http-errors": "*", 248 | "@types/node": "*", 249 | "@types/send": "*" 250 | } 251 | }, 252 | "node_modules/accepts": { 253 | "version": "2.0.0", 254 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", 255 | "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", 256 | "license": "MIT", 257 | "dependencies": { 258 | "mime-types": "^3.0.0", 259 | "negotiator": "^1.0.0" 260 | }, 261 | "engines": { 262 | "node": ">= 0.6" 263 | } 264 | }, 265 | "node_modules/body-parser": { 266 | "version": "2.2.0", 267 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", 268 | "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", 269 | "license": "MIT", 270 | "dependencies": { 271 | "bytes": "^3.1.2", 272 | "content-type": "^1.0.5", 273 | "debug": "^4.4.0", 274 | "http-errors": "^2.0.0", 275 | "iconv-lite": "^0.6.3", 276 | "on-finished": "^2.4.1", 277 | "qs": "^6.14.0", 278 | "raw-body": "^3.0.0", 279 | "type-is": "^2.0.0" 280 | }, 281 | "engines": { 282 | "node": ">=18" 283 | } 284 | }, 285 | "node_modules/braces": { 286 | "version": "3.0.3", 287 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 288 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 289 | "dev": true, 290 | "license": "MIT", 291 | "dependencies": { 292 | "fill-range": "^7.1.1" 293 | }, 294 | "engines": { 295 | "node": ">=8" 296 | } 297 | }, 298 | "node_modules/bytes": { 299 | "version": "3.1.2", 300 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 301 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 302 | "license": "MIT", 303 | "engines": { 304 | "node": ">= 0.8" 305 | } 306 | }, 307 | "node_modules/call-bind-apply-helpers": { 308 | "version": "1.0.2", 309 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 310 | "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 311 | "license": "MIT", 312 | "dependencies": { 313 | "es-errors": "^1.3.0", 314 | "function-bind": "^1.1.2" 315 | }, 316 | "engines": { 317 | "node": ">= 0.4" 318 | } 319 | }, 320 | "node_modules/call-bound": { 321 | "version": "1.0.4", 322 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", 323 | "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 324 | "license": "MIT", 325 | "dependencies": { 326 | "call-bind-apply-helpers": "^1.0.2", 327 | "get-intrinsic": "^1.3.0" 328 | }, 329 | "engines": { 330 | "node": ">= 0.4" 331 | }, 332 | "funding": { 333 | "url": "https://github.com/sponsors/ljharb" 334 | } 335 | }, 336 | "node_modules/commander": { 337 | "version": "13.1.0", 338 | "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", 339 | "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", 340 | "license": "MIT", 341 | "engines": { 342 | "node": ">=18" 343 | } 344 | }, 345 | "node_modules/content-disposition": { 346 | "version": "1.0.0", 347 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", 348 | "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", 349 | "license": "MIT", 350 | "dependencies": { 351 | "safe-buffer": "5.2.1" 352 | }, 353 | "engines": { 354 | "node": ">= 0.6" 355 | } 356 | }, 357 | "node_modules/content-type": { 358 | "version": "1.0.5", 359 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 360 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 361 | "license": "MIT", 362 | "engines": { 363 | "node": ">= 0.6" 364 | } 365 | }, 366 | "node_modules/cookie": { 367 | "version": "0.7.1", 368 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", 369 | "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", 370 | "license": "MIT", 371 | "engines": { 372 | "node": ">= 0.6" 373 | } 374 | }, 375 | "node_modules/cookie-signature": { 376 | "version": "1.2.2", 377 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", 378 | "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", 379 | "license": "MIT", 380 | "engines": { 381 | "node": ">=6.6.0" 382 | } 383 | }, 384 | "node_modules/cors": { 385 | "version": "2.8.5", 386 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 387 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 388 | "license": "MIT", 389 | "dependencies": { 390 | "object-assign": "^4", 391 | "vary": "^1" 392 | }, 393 | "engines": { 394 | "node": ">= 0.10" 395 | } 396 | }, 397 | "node_modules/cross-spawn": { 398 | "version": "6.0.6", 399 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", 400 | "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", 401 | "dev": true, 402 | "license": "MIT", 403 | "dependencies": { 404 | "nice-try": "^1.0.4", 405 | "path-key": "^2.0.1", 406 | "semver": "^5.5.0", 407 | "shebang-command": "^1.2.0", 408 | "which": "^1.2.9" 409 | }, 410 | "engines": { 411 | "node": ">=4.8" 412 | } 413 | }, 414 | "node_modules/debug": { 415 | "version": "4.4.0", 416 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 417 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 418 | "license": "MIT", 419 | "dependencies": { 420 | "ms": "^2.1.3" 421 | }, 422 | "engines": { 423 | "node": ">=6.0" 424 | }, 425 | "peerDependenciesMeta": { 426 | "supports-color": { 427 | "optional": true 428 | } 429 | } 430 | }, 431 | "node_modules/depd": { 432 | "version": "2.0.0", 433 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 434 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 435 | "license": "MIT", 436 | "engines": { 437 | "node": ">= 0.8" 438 | } 439 | }, 440 | "node_modules/dunder-proto": { 441 | "version": "1.0.1", 442 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 443 | "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 444 | "license": "MIT", 445 | "dependencies": { 446 | "call-bind-apply-helpers": "^1.0.1", 447 | "es-errors": "^1.3.0", 448 | "gopd": "^1.2.0" 449 | }, 450 | "engines": { 451 | "node": ">= 0.4" 452 | } 453 | }, 454 | "node_modules/ee-first": { 455 | "version": "1.1.1", 456 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 457 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 458 | "license": "MIT" 459 | }, 460 | "node_modules/encodeurl": { 461 | "version": "2.0.0", 462 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 463 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 464 | "license": "MIT", 465 | "engines": { 466 | "node": ">= 0.8" 467 | } 468 | }, 469 | "node_modules/end-of-stream": { 470 | "version": "1.4.4", 471 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 472 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 473 | "dev": true, 474 | "license": "MIT", 475 | "dependencies": { 476 | "once": "^1.4.0" 477 | } 478 | }, 479 | "node_modules/es-define-property": { 480 | "version": "1.0.1", 481 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 482 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 483 | "license": "MIT", 484 | "engines": { 485 | "node": ">= 0.4" 486 | } 487 | }, 488 | "node_modules/es-errors": { 489 | "version": "1.3.0", 490 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 491 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 492 | "license": "MIT", 493 | "engines": { 494 | "node": ">= 0.4" 495 | } 496 | }, 497 | "node_modules/es-object-atoms": { 498 | "version": "1.1.1", 499 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 500 | "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 501 | "license": "MIT", 502 | "dependencies": { 503 | "es-errors": "^1.3.0" 504 | }, 505 | "engines": { 506 | "node": ">= 0.4" 507 | } 508 | }, 509 | "node_modules/escape-html": { 510 | "version": "1.0.3", 511 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 512 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 513 | "license": "MIT" 514 | }, 515 | "node_modules/etag": { 516 | "version": "1.8.1", 517 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 518 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 519 | "license": "MIT", 520 | "engines": { 521 | "node": ">= 0.6" 522 | } 523 | }, 524 | "node_modules/eventsource": { 525 | "version": "3.0.5", 526 | "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.5.tgz", 527 | "integrity": "sha512-LT/5J605bx5SNyE+ITBDiM3FxffBiq9un7Vx0EwMDM3vg8sWKx/tO2zC+LMqZ+smAM0F2hblaDZUVZF0te2pSw==", 528 | "license": "MIT", 529 | "dependencies": { 530 | "eventsource-parser": "^3.0.0" 531 | }, 532 | "engines": { 533 | "node": ">=18.0.0" 534 | } 535 | }, 536 | "node_modules/eventsource-parser": { 537 | "version": "3.0.0", 538 | "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.0.tgz", 539 | "integrity": "sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==", 540 | "license": "MIT", 541 | "engines": { 542 | "node": ">=18.0.0" 543 | } 544 | }, 545 | "node_modules/execa": { 546 | "version": "1.0.0", 547 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 548 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 549 | "dev": true, 550 | "license": "MIT", 551 | "dependencies": { 552 | "cross-spawn": "^6.0.0", 553 | "get-stream": "^4.0.0", 554 | "is-stream": "^1.1.0", 555 | "npm-run-path": "^2.0.0", 556 | "p-finally": "^1.0.0", 557 | "signal-exit": "^3.0.0", 558 | "strip-eof": "^1.0.0" 559 | }, 560 | "engines": { 561 | "node": ">=6" 562 | } 563 | }, 564 | "node_modules/express": { 565 | "version": "5.1.0", 566 | "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", 567 | "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", 568 | "license": "MIT", 569 | "dependencies": { 570 | "accepts": "^2.0.0", 571 | "body-parser": "^2.2.0", 572 | "content-disposition": "^1.0.0", 573 | "content-type": "^1.0.5", 574 | "cookie": "^0.7.1", 575 | "cookie-signature": "^1.2.1", 576 | "debug": "^4.4.0", 577 | "encodeurl": "^2.0.0", 578 | "escape-html": "^1.0.3", 579 | "etag": "^1.8.1", 580 | "finalhandler": "^2.1.0", 581 | "fresh": "^2.0.0", 582 | "http-errors": "^2.0.0", 583 | "merge-descriptors": "^2.0.0", 584 | "mime-types": "^3.0.0", 585 | "on-finished": "^2.4.1", 586 | "once": "^1.4.0", 587 | "parseurl": "^1.3.3", 588 | "proxy-addr": "^2.0.7", 589 | "qs": "^6.14.0", 590 | "range-parser": "^1.2.1", 591 | "router": "^2.2.0", 592 | "send": "^1.1.0", 593 | "serve-static": "^2.2.0", 594 | "statuses": "^2.0.1", 595 | "type-is": "^2.0.1", 596 | "vary": "^1.1.2" 597 | }, 598 | "engines": { 599 | "node": ">= 18" 600 | }, 601 | "funding": { 602 | "type": "opencollective", 603 | "url": "https://opencollective.com/express" 604 | } 605 | }, 606 | "node_modules/express-rate-limit": { 607 | "version": "7.5.0", 608 | "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", 609 | "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", 610 | "license": "MIT", 611 | "engines": { 612 | "node": ">= 16" 613 | }, 614 | "funding": { 615 | "url": "https://github.com/sponsors/express-rate-limit" 616 | }, 617 | "peerDependencies": { 618 | "express": "^4.11 || 5 || ^5.0.0-beta.1" 619 | } 620 | }, 621 | "node_modules/fast-glob": { 622 | "version": "3.3.3", 623 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 624 | "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 625 | "dev": true, 626 | "license": "MIT", 627 | "dependencies": { 628 | "@nodelib/fs.stat": "^2.0.2", 629 | "@nodelib/fs.walk": "^1.2.3", 630 | "glob-parent": "^5.1.2", 631 | "merge2": "^1.3.0", 632 | "micromatch": "^4.0.8" 633 | }, 634 | "engines": { 635 | "node": ">=8.6.0" 636 | } 637 | }, 638 | "node_modules/fastq": { 639 | "version": "1.19.1", 640 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", 641 | "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", 642 | "dev": true, 643 | "license": "ISC", 644 | "dependencies": { 645 | "reusify": "^1.0.4" 646 | } 647 | }, 648 | "node_modules/fill-range": { 649 | "version": "7.1.1", 650 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 651 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 652 | "dev": true, 653 | "license": "MIT", 654 | "dependencies": { 655 | "to-regex-range": "^5.0.1" 656 | }, 657 | "engines": { 658 | "node": ">=8" 659 | } 660 | }, 661 | "node_modules/finalhandler": { 662 | "version": "2.1.0", 663 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", 664 | "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", 665 | "license": "MIT", 666 | "dependencies": { 667 | "debug": "^4.4.0", 668 | "encodeurl": "^2.0.0", 669 | "escape-html": "^1.0.3", 670 | "on-finished": "^2.4.1", 671 | "parseurl": "^1.3.3", 672 | "statuses": "^2.0.1" 673 | }, 674 | "engines": { 675 | "node": ">= 0.8" 676 | } 677 | }, 678 | "node_modules/forwarded": { 679 | "version": "0.2.0", 680 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 681 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 682 | "license": "MIT", 683 | "engines": { 684 | "node": ">= 0.6" 685 | } 686 | }, 687 | "node_modules/fresh": { 688 | "version": "2.0.0", 689 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", 690 | "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", 691 | "license": "MIT", 692 | "engines": { 693 | "node": ">= 0.8" 694 | } 695 | }, 696 | "node_modules/function-bind": { 697 | "version": "1.1.2", 698 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 699 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 700 | "license": "MIT", 701 | "funding": { 702 | "url": "https://github.com/sponsors/ljharb" 703 | } 704 | }, 705 | "node_modules/get-intrinsic": { 706 | "version": "1.3.0", 707 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 708 | "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 709 | "license": "MIT", 710 | "dependencies": { 711 | "call-bind-apply-helpers": "^1.0.2", 712 | "es-define-property": "^1.0.1", 713 | "es-errors": "^1.3.0", 714 | "es-object-atoms": "^1.1.1", 715 | "function-bind": "^1.1.2", 716 | "get-proto": "^1.0.1", 717 | "gopd": "^1.2.0", 718 | "has-symbols": "^1.1.0", 719 | "hasown": "^2.0.2", 720 | "math-intrinsics": "^1.1.0" 721 | }, 722 | "engines": { 723 | "node": ">= 0.4" 724 | }, 725 | "funding": { 726 | "url": "https://github.com/sponsors/ljharb" 727 | } 728 | }, 729 | "node_modules/get-proto": { 730 | "version": "1.0.1", 731 | "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 732 | "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 733 | "license": "MIT", 734 | "dependencies": { 735 | "dunder-proto": "^1.0.1", 736 | "es-object-atoms": "^1.0.0" 737 | }, 738 | "engines": { 739 | "node": ">= 0.4" 740 | } 741 | }, 742 | "node_modules/get-stream": { 743 | "version": "4.1.0", 744 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 745 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 746 | "dev": true, 747 | "license": "MIT", 748 | "dependencies": { 749 | "pump": "^3.0.0" 750 | }, 751 | "engines": { 752 | "node": ">=6" 753 | } 754 | }, 755 | "node_modules/glob-parent": { 756 | "version": "5.1.2", 757 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 758 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 759 | "dev": true, 760 | "license": "ISC", 761 | "dependencies": { 762 | "is-glob": "^4.0.1" 763 | }, 764 | "engines": { 765 | "node": ">= 6" 766 | } 767 | }, 768 | "node_modules/gopd": { 769 | "version": "1.2.0", 770 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 771 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 772 | "license": "MIT", 773 | "engines": { 774 | "node": ">= 0.4" 775 | }, 776 | "funding": { 777 | "url": "https://github.com/sponsors/ljharb" 778 | } 779 | }, 780 | "node_modules/has-symbols": { 781 | "version": "1.1.0", 782 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 783 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 784 | "license": "MIT", 785 | "engines": { 786 | "node": ">= 0.4" 787 | }, 788 | "funding": { 789 | "url": "https://github.com/sponsors/ljharb" 790 | } 791 | }, 792 | "node_modules/hasown": { 793 | "version": "2.0.2", 794 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 795 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 796 | "license": "MIT", 797 | "dependencies": { 798 | "function-bind": "^1.1.2" 799 | }, 800 | "engines": { 801 | "node": ">= 0.4" 802 | } 803 | }, 804 | "node_modules/http-errors": { 805 | "version": "2.0.0", 806 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 807 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 808 | "license": "MIT", 809 | "dependencies": { 810 | "depd": "2.0.0", 811 | "inherits": "2.0.4", 812 | "setprototypeof": "1.2.0", 813 | "statuses": "2.0.1", 814 | "toidentifier": "1.0.1" 815 | }, 816 | "engines": { 817 | "node": ">= 0.8" 818 | } 819 | }, 820 | "node_modules/iconv-lite": { 821 | "version": "0.6.3", 822 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 823 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 824 | "license": "MIT", 825 | "dependencies": { 826 | "safer-buffer": ">= 2.1.2 < 3.0.0" 827 | }, 828 | "engines": { 829 | "node": ">=0.10.0" 830 | } 831 | }, 832 | "node_modules/inherits": { 833 | "version": "2.0.4", 834 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 835 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 836 | "license": "ISC" 837 | }, 838 | "node_modules/interpret": { 839 | "version": "1.4.0", 840 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", 841 | "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", 842 | "dev": true, 843 | "license": "MIT", 844 | "engines": { 845 | "node": ">= 0.10" 846 | } 847 | }, 848 | "node_modules/ipaddr.js": { 849 | "version": "1.9.1", 850 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 851 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 852 | "license": "MIT", 853 | "engines": { 854 | "node": ">= 0.10" 855 | } 856 | }, 857 | "node_modules/is-core-module": { 858 | "version": "2.16.1", 859 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 860 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 861 | "dev": true, 862 | "license": "MIT", 863 | "dependencies": { 864 | "hasown": "^2.0.2" 865 | }, 866 | "engines": { 867 | "node": ">= 0.4" 868 | }, 869 | "funding": { 870 | "url": "https://github.com/sponsors/ljharb" 871 | } 872 | }, 873 | "node_modules/is-extglob": { 874 | "version": "2.1.1", 875 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 876 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 877 | "dev": true, 878 | "license": "MIT", 879 | "engines": { 880 | "node": ">=0.10.0" 881 | } 882 | }, 883 | "node_modules/is-glob": { 884 | "version": "4.0.3", 885 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 886 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 887 | "dev": true, 888 | "license": "MIT", 889 | "dependencies": { 890 | "is-extglob": "^2.1.1" 891 | }, 892 | "engines": { 893 | "node": ">=0.10.0" 894 | } 895 | }, 896 | "node_modules/is-number": { 897 | "version": "7.0.0", 898 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 899 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 900 | "dev": true, 901 | "license": "MIT", 902 | "engines": { 903 | "node": ">=0.12.0" 904 | } 905 | }, 906 | "node_modules/is-promise": { 907 | "version": "4.0.0", 908 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", 909 | "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", 910 | "license": "MIT" 911 | }, 912 | "node_modules/is-stream": { 913 | "version": "1.1.0", 914 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 915 | "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", 916 | "dev": true, 917 | "license": "MIT", 918 | "engines": { 919 | "node": ">=0.10.0" 920 | } 921 | }, 922 | "node_modules/isexe": { 923 | "version": "2.0.0", 924 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 925 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 926 | "license": "ISC" 927 | }, 928 | "node_modules/math-intrinsics": { 929 | "version": "1.1.0", 930 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 931 | "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 932 | "license": "MIT", 933 | "engines": { 934 | "node": ">= 0.4" 935 | } 936 | }, 937 | "node_modules/media-typer": { 938 | "version": "1.1.0", 939 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", 940 | "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", 941 | "license": "MIT", 942 | "engines": { 943 | "node": ">= 0.8" 944 | } 945 | }, 946 | "node_modules/merge-descriptors": { 947 | "version": "2.0.0", 948 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", 949 | "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", 950 | "license": "MIT", 951 | "engines": { 952 | "node": ">=18" 953 | }, 954 | "funding": { 955 | "url": "https://github.com/sponsors/sindresorhus" 956 | } 957 | }, 958 | "node_modules/merge2": { 959 | "version": "1.4.1", 960 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 961 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 962 | "dev": true, 963 | "license": "MIT", 964 | "engines": { 965 | "node": ">= 8" 966 | } 967 | }, 968 | "node_modules/micromatch": { 969 | "version": "4.0.8", 970 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 971 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 972 | "dev": true, 973 | "license": "MIT", 974 | "dependencies": { 975 | "braces": "^3.0.3", 976 | "picomatch": "^2.3.1" 977 | }, 978 | "engines": { 979 | "node": ">=8.6" 980 | } 981 | }, 982 | "node_modules/mime-db": { 983 | "version": "1.54.0", 984 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", 985 | "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", 986 | "license": "MIT", 987 | "engines": { 988 | "node": ">= 0.6" 989 | } 990 | }, 991 | "node_modules/mime-types": { 992 | "version": "3.0.1", 993 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", 994 | "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", 995 | "license": "MIT", 996 | "dependencies": { 997 | "mime-db": "^1.54.0" 998 | }, 999 | "engines": { 1000 | "node": ">= 0.6" 1001 | } 1002 | }, 1003 | "node_modules/minimist": { 1004 | "version": "1.2.8", 1005 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1006 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1007 | "dev": true, 1008 | "license": "MIT", 1009 | "funding": { 1010 | "url": "https://github.com/sponsors/ljharb" 1011 | } 1012 | }, 1013 | "node_modules/ms": { 1014 | "version": "2.1.3", 1015 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1016 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1017 | "license": "MIT" 1018 | }, 1019 | "node_modules/negotiator": { 1020 | "version": "1.0.0", 1021 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", 1022 | "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", 1023 | "license": "MIT", 1024 | "engines": { 1025 | "node": ">= 0.6" 1026 | } 1027 | }, 1028 | "node_modules/nice-try": { 1029 | "version": "1.0.5", 1030 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1031 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1032 | "dev": true, 1033 | "license": "MIT" 1034 | }, 1035 | "node_modules/npm-run-path": { 1036 | "version": "2.0.2", 1037 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1038 | "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", 1039 | "dev": true, 1040 | "license": "MIT", 1041 | "dependencies": { 1042 | "path-key": "^2.0.0" 1043 | }, 1044 | "engines": { 1045 | "node": ">=4" 1046 | } 1047 | }, 1048 | "node_modules/object-assign": { 1049 | "version": "4.1.1", 1050 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1051 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1052 | "license": "MIT", 1053 | "engines": { 1054 | "node": ">=0.10.0" 1055 | } 1056 | }, 1057 | "node_modules/object-inspect": { 1058 | "version": "1.13.4", 1059 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", 1060 | "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", 1061 | "license": "MIT", 1062 | "engines": { 1063 | "node": ">= 0.4" 1064 | }, 1065 | "funding": { 1066 | "url": "https://github.com/sponsors/ljharb" 1067 | } 1068 | }, 1069 | "node_modules/on-finished": { 1070 | "version": "2.4.1", 1071 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1072 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1073 | "license": "MIT", 1074 | "dependencies": { 1075 | "ee-first": "1.1.1" 1076 | }, 1077 | "engines": { 1078 | "node": ">= 0.8" 1079 | } 1080 | }, 1081 | "node_modules/once": { 1082 | "version": "1.4.0", 1083 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1084 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1085 | "license": "ISC", 1086 | "dependencies": { 1087 | "wrappy": "1" 1088 | } 1089 | }, 1090 | "node_modules/p-finally": { 1091 | "version": "1.0.0", 1092 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1093 | "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", 1094 | "dev": true, 1095 | "license": "MIT", 1096 | "engines": { 1097 | "node": ">=4" 1098 | } 1099 | }, 1100 | "node_modules/parseurl": { 1101 | "version": "1.3.3", 1102 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1103 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1104 | "license": "MIT", 1105 | "engines": { 1106 | "node": ">= 0.8" 1107 | } 1108 | }, 1109 | "node_modules/path-key": { 1110 | "version": "2.0.1", 1111 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1112 | "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", 1113 | "dev": true, 1114 | "license": "MIT", 1115 | "engines": { 1116 | "node": ">=4" 1117 | } 1118 | }, 1119 | "node_modules/path-parse": { 1120 | "version": "1.0.7", 1121 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1122 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1123 | "dev": true, 1124 | "license": "MIT" 1125 | }, 1126 | "node_modules/path-to-regexp": { 1127 | "version": "8.2.0", 1128 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", 1129 | "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", 1130 | "license": "MIT", 1131 | "engines": { 1132 | "node": ">=16" 1133 | } 1134 | }, 1135 | "node_modules/picomatch": { 1136 | "version": "2.3.1", 1137 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1138 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1139 | "dev": true, 1140 | "license": "MIT", 1141 | "engines": { 1142 | "node": ">=8.6" 1143 | }, 1144 | "funding": { 1145 | "url": "https://github.com/sponsors/jonschlinkert" 1146 | } 1147 | }, 1148 | "node_modules/pkce-challenge": { 1149 | "version": "5.0.0", 1150 | "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", 1151 | "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", 1152 | "license": "MIT", 1153 | "engines": { 1154 | "node": ">=16.20.0" 1155 | } 1156 | }, 1157 | "node_modules/proxy-addr": { 1158 | "version": "2.0.7", 1159 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1160 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1161 | "license": "MIT", 1162 | "dependencies": { 1163 | "forwarded": "0.2.0", 1164 | "ipaddr.js": "1.9.1" 1165 | }, 1166 | "engines": { 1167 | "node": ">= 0.10" 1168 | } 1169 | }, 1170 | "node_modules/pump": { 1171 | "version": "3.0.2", 1172 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", 1173 | "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", 1174 | "dev": true, 1175 | "license": "MIT", 1176 | "dependencies": { 1177 | "end-of-stream": "^1.1.0", 1178 | "once": "^1.3.1" 1179 | } 1180 | }, 1181 | "node_modules/qs": { 1182 | "version": "6.14.0", 1183 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", 1184 | "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", 1185 | "license": "BSD-3-Clause", 1186 | "dependencies": { 1187 | "side-channel": "^1.1.0" 1188 | }, 1189 | "engines": { 1190 | "node": ">=0.6" 1191 | }, 1192 | "funding": { 1193 | "url": "https://github.com/sponsors/ljharb" 1194 | } 1195 | }, 1196 | "node_modules/queue-microtask": { 1197 | "version": "1.2.3", 1198 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1199 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1200 | "dev": true, 1201 | "funding": [ 1202 | { 1203 | "type": "github", 1204 | "url": "https://github.com/sponsors/feross" 1205 | }, 1206 | { 1207 | "type": "patreon", 1208 | "url": "https://www.patreon.com/feross" 1209 | }, 1210 | { 1211 | "type": "consulting", 1212 | "url": "https://feross.org/support" 1213 | } 1214 | ], 1215 | "license": "MIT" 1216 | }, 1217 | "node_modules/range-parser": { 1218 | "version": "1.2.1", 1219 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1220 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1221 | "license": "MIT", 1222 | "engines": { 1223 | "node": ">= 0.6" 1224 | } 1225 | }, 1226 | "node_modules/raw-body": { 1227 | "version": "3.0.0", 1228 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", 1229 | "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", 1230 | "license": "MIT", 1231 | "dependencies": { 1232 | "bytes": "3.1.2", 1233 | "http-errors": "2.0.0", 1234 | "iconv-lite": "0.6.3", 1235 | "unpipe": "1.0.0" 1236 | }, 1237 | "engines": { 1238 | "node": ">= 0.8" 1239 | } 1240 | }, 1241 | "node_modules/rechoir": { 1242 | "version": "0.6.2", 1243 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 1244 | "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", 1245 | "dev": true, 1246 | "dependencies": { 1247 | "resolve": "^1.1.6" 1248 | }, 1249 | "engines": { 1250 | "node": ">= 0.10" 1251 | } 1252 | }, 1253 | "node_modules/resolve": { 1254 | "version": "1.22.10", 1255 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", 1256 | "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", 1257 | "dev": true, 1258 | "license": "MIT", 1259 | "dependencies": { 1260 | "is-core-module": "^2.16.0", 1261 | "path-parse": "^1.0.7", 1262 | "supports-preserve-symlinks-flag": "^1.0.0" 1263 | }, 1264 | "bin": { 1265 | "resolve": "bin/resolve" 1266 | }, 1267 | "engines": { 1268 | "node": ">= 0.4" 1269 | }, 1270 | "funding": { 1271 | "url": "https://github.com/sponsors/ljharb" 1272 | } 1273 | }, 1274 | "node_modules/reusify": { 1275 | "version": "1.1.0", 1276 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", 1277 | "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", 1278 | "dev": true, 1279 | "license": "MIT", 1280 | "engines": { 1281 | "iojs": ">=1.0.0", 1282 | "node": ">=0.10.0" 1283 | } 1284 | }, 1285 | "node_modules/router": { 1286 | "version": "2.2.0", 1287 | "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", 1288 | "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", 1289 | "license": "MIT", 1290 | "dependencies": { 1291 | "debug": "^4.4.0", 1292 | "depd": "^2.0.0", 1293 | "is-promise": "^4.0.0", 1294 | "parseurl": "^1.3.3", 1295 | "path-to-regexp": "^8.0.0" 1296 | }, 1297 | "engines": { 1298 | "node": ">= 18" 1299 | } 1300 | }, 1301 | "node_modules/run-parallel": { 1302 | "version": "1.2.0", 1303 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1304 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1305 | "dev": true, 1306 | "funding": [ 1307 | { 1308 | "type": "github", 1309 | "url": "https://github.com/sponsors/feross" 1310 | }, 1311 | { 1312 | "type": "patreon", 1313 | "url": "https://www.patreon.com/feross" 1314 | }, 1315 | { 1316 | "type": "consulting", 1317 | "url": "https://feross.org/support" 1318 | } 1319 | ], 1320 | "license": "MIT", 1321 | "dependencies": { 1322 | "queue-microtask": "^1.2.2" 1323 | } 1324 | }, 1325 | "node_modules/safe-buffer": { 1326 | "version": "5.2.1", 1327 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1328 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1329 | "funding": [ 1330 | { 1331 | "type": "github", 1332 | "url": "https://github.com/sponsors/feross" 1333 | }, 1334 | { 1335 | "type": "patreon", 1336 | "url": "https://www.patreon.com/feross" 1337 | }, 1338 | { 1339 | "type": "consulting", 1340 | "url": "https://feross.org/support" 1341 | } 1342 | ], 1343 | "license": "MIT" 1344 | }, 1345 | "node_modules/safer-buffer": { 1346 | "version": "2.1.2", 1347 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1348 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1349 | "license": "MIT" 1350 | }, 1351 | "node_modules/semver": { 1352 | "version": "5.7.2", 1353 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", 1354 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 1355 | "dev": true, 1356 | "license": "ISC", 1357 | "bin": { 1358 | "semver": "bin/semver" 1359 | } 1360 | }, 1361 | "node_modules/send": { 1362 | "version": "1.2.0", 1363 | "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", 1364 | "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", 1365 | "license": "MIT", 1366 | "dependencies": { 1367 | "debug": "^4.3.5", 1368 | "encodeurl": "^2.0.0", 1369 | "escape-html": "^1.0.3", 1370 | "etag": "^1.8.1", 1371 | "fresh": "^2.0.0", 1372 | "http-errors": "^2.0.0", 1373 | "mime-types": "^3.0.1", 1374 | "ms": "^2.1.3", 1375 | "on-finished": "^2.4.1", 1376 | "range-parser": "^1.2.1", 1377 | "statuses": "^2.0.1" 1378 | }, 1379 | "engines": { 1380 | "node": ">= 18" 1381 | } 1382 | }, 1383 | "node_modules/serve-static": { 1384 | "version": "2.2.0", 1385 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", 1386 | "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", 1387 | "license": "MIT", 1388 | "dependencies": { 1389 | "encodeurl": "^2.0.0", 1390 | "escape-html": "^1.0.3", 1391 | "parseurl": "^1.3.3", 1392 | "send": "^1.2.0" 1393 | }, 1394 | "engines": { 1395 | "node": ">= 18" 1396 | } 1397 | }, 1398 | "node_modules/setprototypeof": { 1399 | "version": "1.2.0", 1400 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1401 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 1402 | "license": "ISC" 1403 | }, 1404 | "node_modules/shebang-command": { 1405 | "version": "1.2.0", 1406 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1407 | "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", 1408 | "dev": true, 1409 | "license": "MIT", 1410 | "dependencies": { 1411 | "shebang-regex": "^1.0.0" 1412 | }, 1413 | "engines": { 1414 | "node": ">=0.10.0" 1415 | } 1416 | }, 1417 | "node_modules/shebang-regex": { 1418 | "version": "1.0.0", 1419 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1420 | "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", 1421 | "dev": true, 1422 | "license": "MIT", 1423 | "engines": { 1424 | "node": ">=0.10.0" 1425 | } 1426 | }, 1427 | "node_modules/shelljs": { 1428 | "version": "0.9.2", 1429 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz", 1430 | "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", 1431 | "dev": true, 1432 | "license": "BSD-3-Clause", 1433 | "dependencies": { 1434 | "execa": "^1.0.0", 1435 | "fast-glob": "^3.3.2", 1436 | "interpret": "^1.0.0", 1437 | "rechoir": "^0.6.2" 1438 | }, 1439 | "bin": { 1440 | "shjs": "bin/shjs" 1441 | }, 1442 | "engines": { 1443 | "node": ">=18" 1444 | } 1445 | }, 1446 | "node_modules/shx": { 1447 | "version": "0.4.0", 1448 | "resolved": "https://registry.npmjs.org/shx/-/shx-0.4.0.tgz", 1449 | "integrity": "sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==", 1450 | "dev": true, 1451 | "license": "MIT", 1452 | "dependencies": { 1453 | "minimist": "^1.2.8", 1454 | "shelljs": "^0.9.2" 1455 | }, 1456 | "bin": { 1457 | "shx": "lib/cli.js" 1458 | }, 1459 | "engines": { 1460 | "node": ">=18" 1461 | } 1462 | }, 1463 | "node_modules/side-channel": { 1464 | "version": "1.1.0", 1465 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", 1466 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 1467 | "license": "MIT", 1468 | "dependencies": { 1469 | "es-errors": "^1.3.0", 1470 | "object-inspect": "^1.13.3", 1471 | "side-channel-list": "^1.0.0", 1472 | "side-channel-map": "^1.0.1", 1473 | "side-channel-weakmap": "^1.0.2" 1474 | }, 1475 | "engines": { 1476 | "node": ">= 0.4" 1477 | }, 1478 | "funding": { 1479 | "url": "https://github.com/sponsors/ljharb" 1480 | } 1481 | }, 1482 | "node_modules/side-channel-list": { 1483 | "version": "1.0.0", 1484 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", 1485 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 1486 | "license": "MIT", 1487 | "dependencies": { 1488 | "es-errors": "^1.3.0", 1489 | "object-inspect": "^1.13.3" 1490 | }, 1491 | "engines": { 1492 | "node": ">= 0.4" 1493 | }, 1494 | "funding": { 1495 | "url": "https://github.com/sponsors/ljharb" 1496 | } 1497 | }, 1498 | "node_modules/side-channel-map": { 1499 | "version": "1.0.1", 1500 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", 1501 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 1502 | "license": "MIT", 1503 | "dependencies": { 1504 | "call-bound": "^1.0.2", 1505 | "es-errors": "^1.3.0", 1506 | "get-intrinsic": "^1.2.5", 1507 | "object-inspect": "^1.13.3" 1508 | }, 1509 | "engines": { 1510 | "node": ">= 0.4" 1511 | }, 1512 | "funding": { 1513 | "url": "https://github.com/sponsors/ljharb" 1514 | } 1515 | }, 1516 | "node_modules/side-channel-weakmap": { 1517 | "version": "1.0.2", 1518 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", 1519 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 1520 | "license": "MIT", 1521 | "dependencies": { 1522 | "call-bound": "^1.0.2", 1523 | "es-errors": "^1.3.0", 1524 | "get-intrinsic": "^1.2.5", 1525 | "object-inspect": "^1.13.3", 1526 | "side-channel-map": "^1.0.1" 1527 | }, 1528 | "engines": { 1529 | "node": ">= 0.4" 1530 | }, 1531 | "funding": { 1532 | "url": "https://github.com/sponsors/ljharb" 1533 | } 1534 | }, 1535 | "node_modules/signal-exit": { 1536 | "version": "3.0.7", 1537 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1538 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1539 | "dev": true, 1540 | "license": "ISC" 1541 | }, 1542 | "node_modules/statuses": { 1543 | "version": "2.0.1", 1544 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1545 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1546 | "license": "MIT", 1547 | "engines": { 1548 | "node": ">= 0.8" 1549 | } 1550 | }, 1551 | "node_modules/strip-eof": { 1552 | "version": "1.0.0", 1553 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 1554 | "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", 1555 | "dev": true, 1556 | "license": "MIT", 1557 | "engines": { 1558 | "node": ">=0.10.0" 1559 | } 1560 | }, 1561 | "node_modules/supports-preserve-symlinks-flag": { 1562 | "version": "1.0.0", 1563 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1564 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1565 | "dev": true, 1566 | "license": "MIT", 1567 | "engines": { 1568 | "node": ">= 0.4" 1569 | }, 1570 | "funding": { 1571 | "url": "https://github.com/sponsors/ljharb" 1572 | } 1573 | }, 1574 | "node_modules/to-regex-range": { 1575 | "version": "5.0.1", 1576 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1577 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1578 | "dev": true, 1579 | "license": "MIT", 1580 | "dependencies": { 1581 | "is-number": "^7.0.0" 1582 | }, 1583 | "engines": { 1584 | "node": ">=8.0" 1585 | } 1586 | }, 1587 | "node_modules/toidentifier": { 1588 | "version": "1.0.1", 1589 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1590 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1591 | "license": "MIT", 1592 | "engines": { 1593 | "node": ">=0.6" 1594 | } 1595 | }, 1596 | "node_modules/type-is": { 1597 | "version": "2.0.1", 1598 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", 1599 | "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", 1600 | "license": "MIT", 1601 | "dependencies": { 1602 | "content-type": "^1.0.5", 1603 | "media-typer": "^1.1.0", 1604 | "mime-types": "^3.0.0" 1605 | }, 1606 | "engines": { 1607 | "node": ">= 0.6" 1608 | } 1609 | }, 1610 | "node_modules/typescript": { 1611 | "version": "5.8.2", 1612 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", 1613 | "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", 1614 | "dev": true, 1615 | "license": "Apache-2.0", 1616 | "bin": { 1617 | "tsc": "bin/tsc", 1618 | "tsserver": "bin/tsserver" 1619 | }, 1620 | "engines": { 1621 | "node": ">=14.17" 1622 | } 1623 | }, 1624 | "node_modules/undici-types": { 1625 | "version": "6.20.0", 1626 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", 1627 | "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", 1628 | "dev": true, 1629 | "license": "MIT" 1630 | }, 1631 | "node_modules/unpipe": { 1632 | "version": "1.0.0", 1633 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1634 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1635 | "license": "MIT", 1636 | "engines": { 1637 | "node": ">= 0.8" 1638 | } 1639 | }, 1640 | "node_modules/vary": { 1641 | "version": "1.1.2", 1642 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1643 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1644 | "license": "MIT", 1645 | "engines": { 1646 | "node": ">= 0.8" 1647 | } 1648 | }, 1649 | "node_modules/which": { 1650 | "version": "1.3.1", 1651 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1652 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1653 | "dev": true, 1654 | "license": "ISC", 1655 | "dependencies": { 1656 | "isexe": "^2.0.0" 1657 | }, 1658 | "bin": { 1659 | "which": "bin/which" 1660 | } 1661 | }, 1662 | "node_modules/wrappy": { 1663 | "version": "1.0.2", 1664 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1665 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1666 | "license": "ISC" 1667 | }, 1668 | "node_modules/zod": { 1669 | "version": "3.24.2", 1670 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", 1671 | "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", 1672 | "license": "MIT", 1673 | "funding": { 1674 | "url": "https://github.com/sponsors/colinhacks" 1675 | } 1676 | }, 1677 | "node_modules/zod-to-json-schema": { 1678 | "version": "3.24.4", 1679 | "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.4.tgz", 1680 | "integrity": "sha512-0uNlcvgabyrni9Ag8Vghj21drk7+7tp7VTwwR7KxxXXc/3pbXz2PHlDgj3cICahgF1kHm4dExBFj7BXrZJXzig==", 1681 | "license": "ISC", 1682 | "peerDependencies": { 1683 | "zod": "^3.24.1" 1684 | } 1685 | } 1686 | } 1687 | } 1688 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mcp-server-code-runner", 3 | "version": "0.1.7", 4 | "type": "module", 5 | "main": "dist/index.js", 6 | "bin": { 7 | "mcp-server-code-runner": "dist/cli.js" 8 | }, 9 | "exports": { 10 | ".": "./dist/index.js" 11 | }, 12 | "scripts": { 13 | "build": "tsc && shx chmod +x dist/index.js dist/cli.js", 14 | "watch": "tsc --watch", 15 | "start": "node ./dist/cli.js" 16 | }, 17 | "files": [ 18 | "dist" 19 | ], 20 | "keywords": [ 21 | "mcp", 22 | "code-runner", 23 | "server" 24 | ], 25 | "repository": { 26 | "type": "git", 27 | "url": "https://github.com/formulahendry/mcp-server-code-runner.git" 28 | }, 29 | "author": "Jun Han", 30 | "license": "MIT", 31 | "description": "Code Runner MCP Server", 32 | "dependencies": { 33 | "@modelcontextprotocol/sdk": "^1.10.1", 34 | "commander": "^13.1.0", 35 | "express": "^5.1.0", 36 | "zod": "^3.24.2" 37 | }, 38 | "devDependencies": { 39 | "@types/express": "^5.0.1", 40 | "@types/node": "^22.13.10", 41 | "shx": "^0.4.0", 42 | "typescript": "^5.8.2" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /scripts/generateUrlForInstallation.js: -------------------------------------------------------------------------------- 1 | const config = JSON.stringify({ 2 | name: 'mcp-server-code-runner', 3 | command: 'npx', 4 | args: ['-y', 'mcp-server-code-runner@latest'] 5 | }); 6 | 7 | // This is a URL you can link on your website that will trigger an MCP install, similar 8 | // to the "Install Extension" button in the VS Code marketplace. 9 | const urlForWebsites = `vscode-insiders:mcp/install?${encodeURIComponent(config)}`; 10 | 11 | // Github markdown does not allow linking to `vscode:` directly, so you can use redirect: 12 | const urlForGithub = `https://insiders.vscode.dev/redirect?url=${encodeURIComponent(urlForWebsites)}`; 13 | 14 | console.log(urlForGithub); -------------------------------------------------------------------------------- /smithery.yaml: -------------------------------------------------------------------------------- 1 | # Smithery configuration file: https://smithery.ai/docs/config#smitheryyaml 2 | 3 | startCommand: 4 | type: stdio 5 | configSchema: 6 | # JSON Schema defining the configuration options for the MCP. 7 | type: object 8 | properties: {} 9 | description: No configuration is required to run the code-runner MCP server. 10 | commandFunction: 11 | # A JS function that produces the CLI command based on the given config to start the MCP on stdio. 12 | |- 13 | (config) => ({ command: 'node', args: ['./dist/cli.js'] }) 14 | exampleConfig: {} 15 | -------------------------------------------------------------------------------- /src/cli.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import { program } from 'commander'; 3 | import { startMcpServer } from './index.js'; 4 | import { createRequire } from 'module'; 5 | const require = createRequire(import.meta.url); 6 | const pkg = require('../package.json'); 7 | 8 | program 9 | .name('mcp-server-code-runner') 10 | .description(pkg.description) 11 | .version(pkg.version) 12 | .option('-t, --transport ', 'Transport (stdio or http)', 'stdio') 13 | .option('-p, --port ', 'Port number for HTTP server') 14 | .action(async (options) => { 15 | try { 16 | await startMcpServer(options.transport, { port: parseInt(options.port) }); 17 | } catch (error) { 18 | console.error('Error: ', error); 19 | process.exit(1); 20 | } 21 | }); 22 | 23 | program.parse(); 24 | -------------------------------------------------------------------------------- /src/constants.ts: -------------------------------------------------------------------------------- 1 | export const languageIdToExecutorMap = { 2 | javascript: "node", 3 | php: "php", 4 | python: "python -u", 5 | perl: "perl", 6 | perl6: "perl6", 7 | ruby: "ruby", 8 | go: "go run", 9 | lua: "lua", 10 | groovy: "groovy", 11 | powershell: "powershell -ExecutionPolicy ByPass -File", 12 | bat: "cmd /c", 13 | shellscript: "bash", 14 | fsharp: "fsi", 15 | csharp: "scriptcs", 16 | vbscript: "cscript //Nologo", 17 | typescript: "ts-node", 18 | coffeescript: "coffee", 19 | scala: "scala", 20 | swift: "swift", 21 | julia: "julia", 22 | crystal: "crystal", 23 | ocaml: "ocaml", 24 | r: "Rscript", 25 | applescript: "osascript", 26 | clojure: "lein exec", 27 | racket: "racket", 28 | scheme: "csi -script", 29 | ahk: "autohotkey", 30 | autoit: "autoit3", 31 | dart: "dart", 32 | haskell: "runhaskell", 33 | nim: "nim compile --verbosity:0 --hints:off --run", 34 | lisp: "sbcl --script", 35 | kit: "kitc --run", 36 | v: "v run", 37 | sass: "sass --style expanded", 38 | scss: "scss --style expanded", 39 | }; 40 | 41 | export const languageIdToFileExtensionMap = { 42 | javascript: "js", 43 | typescript: "ts", 44 | powershell: "ps1", 45 | }; 46 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { startStdioMcpServer } from "./stdio.js"; 2 | import { startStreamableHttpMcpServer, McpServerEndpoint } from "./streamableHttp.js"; 3 | 4 | export type Transport = 'stdio' | 'http'; 5 | 6 | export interface HttpServerOptions { 7 | port?: number; 8 | } 9 | 10 | export async function startMcpServer(transport: Transport, options?: HttpServerOptions): Promise { 11 | if (transport === 'stdio') { 12 | return startStdioMcpServer(); 13 | } else if (transport === 'http') { 14 | return startStreamableHttpMcpServer(options?.port); 15 | } else { 16 | throw new Error('Invalid transport. Must be either "stdio" or "http"'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/server.ts: -------------------------------------------------------------------------------- 1 | import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; 2 | import { z } from "zod"; 3 | import * as fs from "fs"; 4 | import * as path from "path"; 5 | import * as os from "os"; 6 | import { languageIdToExecutorMap, languageIdToFileExtensionMap } from "./constants.js"; 7 | import { exec } from "child_process"; 8 | 9 | export function createServer(): McpServer { 10 | const server = new McpServer({ 11 | name: "Code Runner", 12 | version: "0.1.0", 13 | }); 14 | 15 | server.tool( 16 | "run-code", 17 | "Run code snippet and return the result.", 18 | { 19 | code: z.string().describe("Code Snippet"), 20 | languageId: z.enum(Object.keys(languageIdToExecutorMap) as [keyof typeof languageIdToExecutorMap]).describe("Language ID"), 21 | }, 22 | async ({ code, languageId }) => { 23 | if (!code) { 24 | throw new Error("Code is required."); 25 | } 26 | 27 | if (!languageId) { 28 | throw new Error("Language ID is required."); 29 | } 30 | 31 | const executor = languageIdToExecutorMap[languageId as keyof typeof languageIdToExecutorMap]; 32 | 33 | if (!executor) { 34 | throw new Error(`Language '${languageId}' is not supported.`); 35 | } 36 | 37 | const filePath = await createTmpFile(code, languageId); 38 | const command = `${executor} "${filePath}"`; 39 | 40 | const result = await executeCommand(command); 41 | 42 | return { 43 | content: [ 44 | { 45 | type: "text", 46 | text: result, 47 | }, 48 | ], 49 | }; 50 | }, 51 | ); 52 | 53 | return server; 54 | } 55 | 56 | async function createTmpFile(content: string, languageId: string) { 57 | const tmpDir = os.tmpdir(); 58 | const fileExtension = getFileExtension(languageId); 59 | const fileName = `tmp.${fileExtension}`; 60 | const filePath = path.join(tmpDir, fileName); 61 | 62 | await fs.promises.writeFile(filePath, content); 63 | 64 | console.debug(`Temporary file created at: ${filePath}`); 65 | 66 | return filePath; 67 | } 68 | 69 | function getFileExtension(languageId: string): string { 70 | const fileExtension = languageIdToFileExtensionMap[languageId as keyof typeof languageIdToFileExtensionMap]; 71 | return fileExtension ?? languageId; 72 | } 73 | 74 | async function executeCommand(command: string): Promise { 75 | return new Promise((resolve, reject) => { 76 | console.debug(`Executing command: ${command}`); 77 | exec(command, (error: any, stdout: string, stderr: string) => { 78 | if (error) { 79 | reject(`Error: ${error.message}`); 80 | } 81 | if (stderr) { 82 | reject(`Stderr: ${stderr}`); 83 | } 84 | resolve(stdout); 85 | }); 86 | }); 87 | } -------------------------------------------------------------------------------- /src/stdio.ts: -------------------------------------------------------------------------------- 1 | import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; 2 | import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; 3 | import { createServer } from "./server.js"; 4 | 5 | export async function startStdioMcpServer(): Promise { 6 | const server: McpServer = createServer(); 7 | const transport = new StdioServerTransport(); 8 | await server.connect(transport); 9 | console.debug("Code Runner MCP Server running on stdio"); 10 | } 11 | -------------------------------------------------------------------------------- /src/streamableHttp.ts: -------------------------------------------------------------------------------- 1 | import express, { Request, Response } from "express"; 2 | import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; 3 | import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; 4 | import { createServer } from "./server.js"; 5 | 6 | export interface McpServerEndpoint { 7 | url: string; 8 | port: number; 9 | } 10 | 11 | export async function startStreamableHttpMcpServer(port?: number): Promise { 12 | const app = express(); 13 | app.use(express.json()); 14 | 15 | const server: McpServer = createServer(); 16 | const transport: StreamableHTTPServerTransport = new StreamableHTTPServerTransport({ 17 | sessionIdGenerator: undefined, // set to undefined for stateless servers 18 | }); 19 | 20 | // Setup routes for the server 21 | await server.connect(transport); 22 | 23 | app.post('/mcp', async (req: Request, res: Response) => { 24 | console.log('Received MCP request:', req.body); 25 | try { 26 | await transport.handleRequest(req, res, req.body); 27 | } catch (error) { 28 | console.error('Error handling MCP request:', error); 29 | if (!res.headersSent) { 30 | res.status(500).json({ 31 | jsonrpc: '2.0', 32 | error: { 33 | code: -32603, 34 | message: 'Internal server error', 35 | }, 36 | id: null, 37 | }); 38 | } 39 | } 40 | }); 41 | 42 | app.get('/mcp', async (req: Request, res: Response) => { 43 | console.log('Received GET MCP request'); 44 | res.writeHead(405).end(JSON.stringify({ 45 | jsonrpc: "2.0", 46 | error: { 47 | code: -32000, 48 | message: "Method not allowed." 49 | }, 50 | id: null 51 | })); 52 | }); 53 | 54 | app.delete('/mcp', async (req: Request, res: Response) => { 55 | console.log('Received DELETE MCP request'); 56 | res.writeHead(405).end(JSON.stringify({ 57 | jsonrpc: "2.0", 58 | error: { 59 | code: -32000, 60 | message: "Method not allowed." 61 | }, 62 | id: null 63 | })); 64 | }); 65 | 66 | // Start the server 67 | const PORT = Number(port || process.env.PORT || 3088); 68 | 69 | return new Promise((resolve, reject) => { 70 | const appServer = app.listen(PORT, (error) => { 71 | if (error) { 72 | console.error('Failed to start server:', error); 73 | reject(error); 74 | return; 75 | } 76 | const endpoint: McpServerEndpoint = { 77 | url: `http://localhost:${PORT}/mcp`, 78 | port: PORT 79 | }; 80 | console.log(`Code Runner Streamable HTTP MCP Server listening at ${endpoint.url}`); 81 | resolve(endpoint); 82 | }); 83 | 84 | // Handle server errors 85 | appServer.on('error', (error) => { 86 | console.error('Server error:', error); 87 | reject(error); 88 | }); 89 | }); 90 | } 91 | 92 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "module": "Node16", 5 | "moduleResolution": "Node16", 6 | "outDir": "./dist", 7 | "rootDir": "./src", 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "skipLibCheck": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "sourceMap": true, 13 | "resolveJsonModule": true, 14 | "declaration": true, 15 | "declarationMap": true 16 | }, 17 | "include": ["src/**/*"], 18 | "exclude": ["node_modules"] 19 | } --------------------------------------------------------------------------------