From c201eac3a97cb91f424a9285269540ed19ebd6b3 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 7 Aug 2025 11:29:01 +0100 Subject: [PATCH 01/27] wip test client --- auth-compat/auth-compliance-design.md | 95 ++ auth-compat/package-lock.json | 1626 +++++++++++++++++++++++++ auth-compat/package.json | 17 + auth-compat/test-client.ts | 47 + 4 files changed, 1785 insertions(+) create mode 100644 auth-compat/auth-compliance-design.md create mode 100644 auth-compat/package-lock.json create mode 100644 auth-compat/package.json create mode 100644 auth-compat/test-client.ts diff --git a/auth-compat/auth-compliance-design.md b/auth-compat/auth-compliance-design.md new file mode 100644 index 000000000..e3179ffb1 --- /dev/null +++ b/auth-compat/auth-compliance-design.md @@ -0,0 +1,95 @@ +# MCP Authorization Compliance Checker Design + +## Overview + +A compliance testing system for MCP (Model Context Protocol) clients to validate their authorization implementation against a reference server. The system runs client implementations against a validation server that tests compliance with MCP authorization specifications. + +## System Architecture + +### Core Components + +1. **Test Runner** - Main orchestration script that: + - Accepts a command to run the client implementation + - Spawns the validation server + - Executes the client with the validation server URL + - Collects and reports test results + +2. **Validation Server** - MCP server implementation that: + - Implements test methods for all authorization endpoints + - Tracks client interactions and validates behavior + - Generates compliance reports + +3. **Mock Authorization Server** - OAuth2/OIDC server that: + - Returns static, predictable authorization responses + - Validates PKCE parameters + - Verifies client authorization flow compliance + +## Client Requirements + +Clients being tested must: +- Accept a single command-line argument: the MCP server URL +- Connect to the provided MCP server +- Execute authorization flow if required +- Exit with code 0 on success, 1 on failure + +## Test Flow + +1. Test runner starts validation server on a dynamic port +2. Test runner starts mock authorization server +3. Test runner executes client command with validation server URL +4. Client connects to validation server +5. Validation server presents authorization metadata +6. Client follows authorization flow with mock auth server +7. Client completes MCP initialization +8. Client exits with appropriate status code +9. Test runner collects results from validation server +10. Test runner generates compliance report + + +## Mock Authorization Server Design + +### Static Responses +- Authorization endpoint: Always returns fixed authorization code +- Token endpoint: Returns predictable access/refresh tokens +- JWKS endpoint: Provides static signing keys + +### Validation Features +- PKCE code verifier validation +- State parameter tracking +- Redirect URI validation +- Client ID verification + +### Simplifications +- No persistent storage required +- No real user authentication +- Fixed token expiration times +- Static signing keys + + +### Error Details +- Specific validation failures +- Protocol violations +- Missing required parameters +- Timing information + +## Implementation Phases + +### Phase 1: Basic Framework +- Test runner implementation +- Basic validation server +- Simple pass/fail reporting + +### Phase 2: Authorization Testing +- Mock authorization server +- PKCE validation +- OAuth2 flow testing + +### Phase 3: Advanced Scenarios +- Multiple test suites +- Comprehensive reporting +- Error scenario testing + +### Phase 4: Extensions +- Token refresh testing +- Custom grant types +- Performance metrics diff --git a/auth-compat/package-lock.json b/auth-compat/package-lock.json new file mode 100644 index 000000000..0b1943472 --- /dev/null +++ b/auth-compat/package-lock.json @@ -0,0 +1,1626 @@ +{ + "name": "mcp-auth-compat", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mcp-auth-compat", + "version": "1.0.0", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.0.0" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "tsx": "^4.0.0", + "typescript": "^5.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", + "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/android-arm/-/android-arm-0.25.8.tgz", + "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", + "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/android-x64/-/android-x64-0.25.8.tgz", + "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", + "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", + "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", + "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", + "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", + "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", + "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", + "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", + "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", + "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", + "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", + "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", + "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", + "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", + "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", + "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", + "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", + "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", + "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", + "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", + "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", + "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", + "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.17.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@modelcontextprotocol/sdk/-/sdk-1.17.1.tgz", + "integrity": "sha512-CPle1OQehbWqd25La9Ack5B07StKIxh4+Bf19qnpZKJC1oI22Y0czZHbifjw1UoczIfKBwBDAp/dFxvHG13B5A==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.6", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@types/node": { + "version": "20.19.9", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/node/-/node-20.19.9.tgz", + "integrity": "sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/esbuild/-/esbuild-0.25.8.tgz", + "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.8", + "@esbuild/android-arm": "0.25.8", + "@esbuild/android-arm64": "0.25.8", + "@esbuild/android-x64": "0.25.8", + "@esbuild/darwin-arm64": "0.25.8", + "@esbuild/darwin-x64": "0.25.8", + "@esbuild/freebsd-arm64": "0.25.8", + "@esbuild/freebsd-x64": "0.25.8", + "@esbuild/linux-arm": "0.25.8", + "@esbuild/linux-arm64": "0.25.8", + "@esbuild/linux-ia32": "0.25.8", + "@esbuild/linux-loong64": "0.25.8", + "@esbuild/linux-mips64el": "0.25.8", + "@esbuild/linux-ppc64": "0.25.8", + "@esbuild/linux-riscv64": "0.25.8", + "@esbuild/linux-s390x": "0.25.8", + "@esbuild/linux-x64": "0.25.8", + "@esbuild/netbsd-arm64": "0.25.8", + "@esbuild/netbsd-x64": "0.25.8", + "@esbuild/openbsd-arm64": "0.25.8", + "@esbuild/openbsd-x64": "0.25.8", + "@esbuild/openharmony-arm64": "0.25.8", + "@esbuild/sunos-x64": "0.25.8", + "@esbuild/win32-arm64": "0.25.8", + "@esbuild/win32-ia32": "0.25.8", + "@esbuild/win32-x64": "0.25.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eventsource-parser/-/eventsource-parser-3.0.3.tgz", + "integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/safer-buffer/2.1.2/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "license": "MIT" + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tsx": { + "version": "4.20.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/tsx/-/tsx-4.20.3.tgz", + "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/wrappy/1.0.2/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "license": "ISC" + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + } + } +} diff --git a/auth-compat/package.json b/auth-compat/package.json new file mode 100644 index 000000000..fb9daf188 --- /dev/null +++ b/auth-compat/package.json @@ -0,0 +1,17 @@ +{ + "name": "mcp-auth-compat", + "version": "1.0.0", + "description": "MCP Authorization Compliance Checker", + "type": "module", + "scripts": { + "test-client": "tsx test-client.ts" + }, + "dependencies": { + "@modelcontextprotocol/sdk": "^1.0.0" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "tsx": "^4.0.0", + "typescript": "^5.0.0" + } +} \ No newline at end of file diff --git a/auth-compat/test-client.ts b/auth-compat/test-client.ts new file mode 100644 index 000000000..e87edaaaf --- /dev/null +++ b/auth-compat/test-client.ts @@ -0,0 +1,47 @@ +#!/usr/bin/env node + +import { Client } from '@modelcontextprotocol/sdk/client/index.js'; +import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'; + +async function main(): Promise { + const serverUrl = process.argv[2]; + + if (!serverUrl) { + console.error('Usage: test-client '); + process.exit(1); + } + + console.log(`Connecting to MCP server at: ${serverUrl}`); + + try { + const client = new Client({ + name: 'test-client', + version: '1.0.0' + }, { + capabilities: {} + }); + + const transport = new StreamableHTTPClientTransport( + new URL(serverUrl) + ); + + await client.connect(transport); + console.log('✅ Successfully connected to MCP server'); + + await client.listTools(); + console.log('✅ Successfully listed tools') + + await transport.close(); + console.log('✅ Connection closed successfully'); + + process.exit(0); + } catch (error) { + console.error('❌ Failed to connect to MCP server:', error); + process.exit(1); + } +} + +main().catch((error) => { + console.error('Unhandled error:', error); + process.exit(1); +}); From 3b8d9efd538c95445eb56d8b33c77ffd2a8f69f3 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 7 Aug 2025 11:49:49 +0100 Subject: [PATCH 02/27] wip test client --- auth-compat/auth-compliance-design.md | 36 + .../examples/typescript-client/README.md | 23 + .../typescript-client/package-lock.json | 1626 +++++++++++++++++ .../examples/typescript-client/package.json | 17 + .../typescript-client}/test-client.ts | 0 .../examples/typescript-client/tsconfig.json | 15 + auth-compat/package-lock.json | 832 +++++++-- auth-compat/package.json | 14 +- auth-compat/src/server/validation/index.ts | 227 +++ auth-compat/src/test-validation-server.ts | 86 + auth-compat/src/types.ts | 34 + auth-compat/tsconfig.json | 20 + 12 files changed, 2752 insertions(+), 178 deletions(-) create mode 100644 auth-compat/examples/typescript-client/README.md create mode 100644 auth-compat/examples/typescript-client/package-lock.json create mode 100644 auth-compat/examples/typescript-client/package.json rename auth-compat/{ => examples/typescript-client}/test-client.ts (100%) create mode 100644 auth-compat/examples/typescript-client/tsconfig.json create mode 100644 auth-compat/src/server/validation/index.ts create mode 100644 auth-compat/src/test-validation-server.ts create mode 100644 auth-compat/src/types.ts create mode 100644 auth-compat/tsconfig.json diff --git a/auth-compat/auth-compliance-design.md b/auth-compat/auth-compliance-design.md index e3179ffb1..a99add505 100644 --- a/auth-compat/auth-compliance-design.md +++ b/auth-compat/auth-compliance-design.md @@ -72,6 +72,42 @@ Clients being tested must: - Missing required parameters - Timing information +## Directory Structure + +``` +auth-compat/ +├── package.json # Main package configuration +├── tsconfig.json # TypeScript configuration +├── README.md # Project documentation +├── auth-compliance-design.md # This design document +│ +├── src/ +│ ├── cli/ +│ │ ├── index.ts # CLI entry point & test runner +│ │ ├── commands.ts # CLI command handlers +│ │ ├── config.ts # CLI configuration parser +│ │ └── reporter.ts # Test report generator +│ │ +│ ├── server/ +│ │ ├── validation/ +│ │ │ └── index.ts # Validation server entry +│ │ │ +│ │ └── auth/ +│ │ └── index.ts # Mock auth server entry +│ │ +│ └── types.ts # Shared type definitions +│ +├── examples/ +│ └── typescript-client/ +│ ├── README.md # Example documentation +│ ├── package.json # Example dependencies +│ ├── test-client.ts # Example TypeScript client +│ └── tsconfig.json # Example TS config +│ +└── reports/ # Generated test reports + └── ... +``` + ## Implementation Phases ### Phase 1: Basic Framework diff --git a/auth-compat/examples/typescript-client/README.md b/auth-compat/examples/typescript-client/README.md new file mode 100644 index 000000000..586402f52 --- /dev/null +++ b/auth-compat/examples/typescript-client/README.md @@ -0,0 +1,23 @@ +# TypeScript MCP Client Example + +This is an example TypeScript client that demonstrates how to implement a test client for the MCP Authorization Compliance Checker. + +## Requirements + +The client must: +1. Accept a single command-line argument: the MCP server URL +2. Connect to the provided MCP server +3. Exit with code 0 on success, 1 on failure + +## Usage + +```bash +# Install dependencies +npm install + +# Run the test client +npm run test-client + +# Or run directly with tsx +npx tsx test-client.ts +``` diff --git a/auth-compat/examples/typescript-client/package-lock.json b/auth-compat/examples/typescript-client/package-lock.json new file mode 100644 index 000000000..ebb28b97d --- /dev/null +++ b/auth-compat/examples/typescript-client/package-lock.json @@ -0,0 +1,1626 @@ +{ + "name": "mcp-test-client-example", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mcp-test-client-example", + "version": "1.0.0", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.0.0" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "tsx": "^4.0.0", + "typescript": "^5.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", + "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/android-arm/-/android-arm-0.25.8.tgz", + "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", + "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/android-x64/-/android-x64-0.25.8.tgz", + "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", + "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", + "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", + "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", + "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", + "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", + "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", + "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", + "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", + "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", + "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", + "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", + "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", + "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", + "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", + "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", + "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", + "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", + "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", + "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", + "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", + "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", + "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.17.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@modelcontextprotocol/sdk/-/sdk-1.17.1.tgz", + "integrity": "sha512-CPle1OQehbWqd25La9Ack5B07StKIxh4+Bf19qnpZKJC1oI22Y0czZHbifjw1UoczIfKBwBDAp/dFxvHG13B5A==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.6", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@types/node": { + "version": "20.19.9", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/node/-/node-20.19.9.tgz", + "integrity": "sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/esbuild/-/esbuild-0.25.8.tgz", + "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.8", + "@esbuild/android-arm": "0.25.8", + "@esbuild/android-arm64": "0.25.8", + "@esbuild/android-x64": "0.25.8", + "@esbuild/darwin-arm64": "0.25.8", + "@esbuild/darwin-x64": "0.25.8", + "@esbuild/freebsd-arm64": "0.25.8", + "@esbuild/freebsd-x64": "0.25.8", + "@esbuild/linux-arm": "0.25.8", + "@esbuild/linux-arm64": "0.25.8", + "@esbuild/linux-ia32": "0.25.8", + "@esbuild/linux-loong64": "0.25.8", + "@esbuild/linux-mips64el": "0.25.8", + "@esbuild/linux-ppc64": "0.25.8", + "@esbuild/linux-riscv64": "0.25.8", + "@esbuild/linux-s390x": "0.25.8", + "@esbuild/linux-x64": "0.25.8", + "@esbuild/netbsd-arm64": "0.25.8", + "@esbuild/netbsd-x64": "0.25.8", + "@esbuild/openbsd-arm64": "0.25.8", + "@esbuild/openbsd-x64": "0.25.8", + "@esbuild/openharmony-arm64": "0.25.8", + "@esbuild/sunos-x64": "0.25.8", + "@esbuild/win32-arm64": "0.25.8", + "@esbuild/win32-ia32": "0.25.8", + "@esbuild/win32-x64": "0.25.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eventsource-parser/-/eventsource-parser-3.0.3.tgz", + "integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/safer-buffer/2.1.2/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "license": "MIT" + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tsx": { + "version": "4.20.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/tsx/-/tsx-4.20.3.tgz", + "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/wrappy/1.0.2/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "license": "ISC" + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + } + } +} diff --git a/auth-compat/examples/typescript-client/package.json b/auth-compat/examples/typescript-client/package.json new file mode 100644 index 000000000..0213e2476 --- /dev/null +++ b/auth-compat/examples/typescript-client/package.json @@ -0,0 +1,17 @@ +{ + "name": "mcp-test-client-example", + "version": "1.0.0", + "description": "Example TypeScript client for MCP authorization compliance testing", + "type": "module", + "scripts": { + "test-client": "tsx test-client.ts" + }, + "dependencies": { + "@modelcontextprotocol/sdk": "^1.0.0" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "tsx": "^4.0.0", + "typescript": "^5.0.0" + } +} \ No newline at end of file diff --git a/auth-compat/test-client.ts b/auth-compat/examples/typescript-client/test-client.ts similarity index 100% rename from auth-compat/test-client.ts rename to auth-compat/examples/typescript-client/test-client.ts diff --git a/auth-compat/examples/typescript-client/tsconfig.json b/auth-compat/examples/typescript-client/tsconfig.json new file mode 100644 index 000000000..2209c3cc8 --- /dev/null +++ b/auth-compat/examples/typescript-client/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ES2022", + "lib": ["ES2022"], + "moduleResolution": "node", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true + }, + "include": ["*.ts"], + "exclude": ["node_modules"] +} \ No newline at end of file diff --git a/auth-compat/package-lock.json b/auth-compat/package-lock.json index 0b1943472..7150c9dd3 100644 --- a/auth-compat/package-lock.json +++ b/auth-compat/package-lock.json @@ -8,9 +8,16 @@ "name": "mcp-auth-compat", "version": "1.0.0", "dependencies": { - "@modelcontextprotocol/sdk": "^1.0.0" + "@modelcontextprotocol/sdk": "^1.0.0", + "commander": "^11.0.0", + "express": "^4.18.0", + "zod": "^3.22.0" + }, + "bin": { + "mcp-auth-compat": "dist/cli/index.js" }, "devDependencies": { + "@types/express": "^4.17.0", "@types/node": "^20.0.0", "tsx": "^4.0.0", "typescript": "^5.0.0" @@ -481,6 +488,329 @@ "node": ">=18" } }, + "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/express": { + "version": "5.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/qs": { + "version": "6.14.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/send": { + "version": "1.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/body-parser/1.19.5/body-parser-1.19.5.tgz", + "integrity": "sha1-BM6aO2d9yL1oGhfaGrmDXcnT7eQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.23", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/http-errors/2.0.4/http-errors-2.0.4.tgz", + "integrity": "sha1-frR3JsORtzRabsNa1/TeRpz1uk8=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/mime/1.3.5/mime-1.3.5.tgz", + "integrity": "sha1-HvMC4Bz30rWg+lJnkMkSO/HQZpA=", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "20.19.9", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/node/-/node-20.19.9.tgz", @@ -491,53 +821,127 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/qs": { + "version": "6.9.18", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/range-parser/1.2.7/range-parser-1.2.7.tgz", + "integrity": "sha1-UK5DU+qt3AQEQnmBL1LIxlhX28s=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/send/0.17.4/send-0.17.4.tgz", + "integrity": "sha1-ZhnNJOcnB5NwLk5qS5WKkBDPxXo=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/serve-static/1.15.7/serve-static-1.15.7.tgz", + "integrity": "sha1-IhdLvXT7l/4wMQlzjptcLzBk9xQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "version": "1.3.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "safer-buffer": ">= 2.1.2 < 3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "license": "MIT", "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">=18" + "node": ">= 0.8" } }, "node_modules/bytes": { @@ -578,10 +982,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/commander/11.1.0/commander-11.1.0.tgz", + "integrity": "sha1-Yv3OdgBqaOXBqzMU3JLoAOuD2QY=", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "version": "0.5.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -600,22 +1013,19 @@ } }, "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "version": "0.7.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } + "version": "1.0.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" }, "node_modules/cors": { "version": "2.8.5", @@ -645,20 +1055,12 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "2.6.9", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "ms": "2.0.0" } }, "node_modules/depd": { @@ -670,6 +1072,16 @@ "node": ">= 0.8" } }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -808,41 +1220,45 @@ } }, "node_modules/express": { - "version": "5.1.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "version": "4.21.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "license": "MIT", "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": ">= 18" + "node": ">= 0.10.0" }, "funding": { "type": "opencollective", @@ -877,17 +1293,18 @@ "license": "MIT" }, "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "version": "1.3.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "license": "MIT", "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" @@ -903,12 +1320,12 @@ } }, "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "version": "0.5.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, "node_modules/fsevents": { @@ -1036,15 +1453,6 @@ "node": ">= 0.8" } }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -1100,57 +1508,75 @@ } }, "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "version": "0.3.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "version": "1.0.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "license": "MIT", - "engines": { - "node": ">=18" - }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "version": "1.52.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "version": "2.1.35", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { - "mime-db": "^1.54.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "version": "0.6.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -1217,13 +1643,10 @@ } }, "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } + "version": "0.1.12", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" }, "node_modules/pkce-challenge": { "version": "5.0.0", @@ -1257,12 +1680,12 @@ } }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.13.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.1.0" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -1321,6 +1744,38 @@ "node": ">= 18" } }, + "node_modules/router/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/router/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1348,40 +1803,57 @@ "license": "MIT" }, "node_modules/send": { - "version": "1.2.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "version": "0.19.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "license": "MIT", "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": ">= 18" + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "version": "1.16.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "license": "MIT", "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" }, "engines": { - "node": ">= 18" + "node": ">= 0.8.0" } }, "node_modules/setprototypeof": { @@ -1484,9 +1956,9 @@ } }, "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "version": "2.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -1522,14 +1994,13 @@ } }, "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "version": "1.6.18", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "license": "MIT", "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { "node": ">= 0.6" @@ -1574,6 +2045,15 @@ "punycode": "^2.1.0" } }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/vary/-/vary-1.1.2.tgz", diff --git a/auth-compat/package.json b/auth-compat/package.json index fb9daf188..8765d58e9 100644 --- a/auth-compat/package.json +++ b/auth-compat/package.json @@ -3,13 +3,23 @@ "version": "1.0.0", "description": "MCP Authorization Compliance Checker", "type": "module", + "main": "dist/cli/index.js", + "bin": { + "mcp-auth-compat": "dist/cli/index.js" + }, "scripts": { - "test-client": "tsx test-client.ts" + "build": "tsc", + "dev": "tsx src/cli/index.ts", + "test-validation-server": "tsx src/test-validation-server.ts" }, "dependencies": { - "@modelcontextprotocol/sdk": "^1.0.0" + "@modelcontextprotocol/sdk": "^1.0.0", + "commander": "^11.0.0", + "express": "^4.18.0", + "zod": "^3.22.0" }, "devDependencies": { + "@types/express": "^4.17.0", "@types/node": "^20.0.0", "tsx": "^4.0.0", "typescript": "^5.0.0" diff --git a/auth-compat/src/server/validation/index.ts b/auth-compat/src/server/validation/index.ts new file mode 100644 index 000000000..6cfeebfee --- /dev/null +++ b/auth-compat/src/server/validation/index.ts @@ -0,0 +1,227 @@ +import express, { Request, Response } from 'express'; +import { Server } from 'http'; +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; +import { ClientBehavior, TestResult, ValidationServerConfig } from '../../types.js'; +import { z } from 'zod'; + +export class ValidationServer { + private app: express.Application; + private server: Server | null = null; + private mcpServer: McpServer; + private transport: StreamableHTTPServerTransport | null = null; + private clientBehavior: ClientBehavior; + private config: ValidationServerConfig; + + constructor(config: ValidationServerConfig = {}) { + this.config = { + port: config.port || 0, // 0 means random port + authRequired: config.authRequired || false, + metadataLocation: config.metadataLocation || '/.well-known/oauth-authorization-server', + mockAuthServerUrl: config.mockAuthServerUrl || 'http://localhost:3001' + }; + + this.app = express(); + this.app.use(express.json()); + + // Initialize client behavior tracking + this.clientBehavior = { + connected: false, + initialized: false, + requestsMade: [], + authMetadataRequested: false, + authFlowCompleted: false, + errors: [] + }; + + // Create MCP server + this.mcpServer = new McpServer({ + name: 'validation-server', + version: '1.0.0' + }, { + capabilities: { + tools: {} + } + }); + + this.setupMCPHandlers(); + this.setupRoutes(); + } + + private setupMCPHandlers(): void { + // Register a test tool + this.mcpServer.registerTool( + 'test-tool', + { + title: 'Test Tool', + description: 'A simple test tool for validation', + inputSchema: { + message: z.string().describe('Test message') + } + }, + async ({ message }) => { + this.clientBehavior.requestsMade.push('tools/call:test-tool'); + return { + content: [{ + type: 'text', + text: `Test response: ${message}` + }] + }; + } + ); + + // We'll track tool listing through the transport message handler instead + } + + private setupRoutes(): void { + // Health check endpoint + this.app.get('/health', (req, res) => { + res.json({ status: 'ok' }); + }); + + // OAuth metadata endpoint (if auth is required) + if (this.config.authRequired) { + this.app.get(this.config.metadataLocation!, (req, res) => { + this.clientBehavior.authMetadataRequested = true; + res.json({ + issuer: this.config.mockAuthServerUrl, + authorization_endpoint: `${this.config.mockAuthServerUrl}/authorize`, + token_endpoint: `${this.config.mockAuthServerUrl}/token`, + jwks_uri: `${this.config.mockAuthServerUrl}/jwks`, + response_types_supported: ['code'], + grant_types_supported: ['authorization_code', 'refresh_token'], + code_challenge_methods_supported: ['S256'], + token_endpoint_auth_methods_supported: ['client_secret_post', 'client_secret_basic'] + }); + }); + } + + // Create transport once at startup + this.transport = new StreamableHTTPServerTransport( + this.config.authRequired ? { + requireAuth: true, + authMetadataUrl: `http://localhost:${this.config.port || 3000}${this.config.metadataLocation}` + } : {} + ); + + // Connect MCP server to transport + this.mcpServer.connect(this.transport).catch(console.error); + + // MCP endpoint + this.app.post('/mcp', async (req: Request, res: Response) => { + // Track the incoming message + if (req.body) { + const message = req.body; + if (message.method === 'initialize') { + this.clientBehavior.connected = true; + this.clientBehavior.initialized = true; + this.clientBehavior.protocolVersion = message.params?.protocolVersion; + this.clientBehavior.clientInfo = message.params?.clientInfo; + this.clientBehavior.requestsMade.push('initialize'); + } else if (message.method === 'tools/list') { + this.clientBehavior.requestsMade.push('tools/list'); + } else if (message.method === 'tools/call') { + this.clientBehavior.requestsMade.push(`tools/call:${message.params?.name}`); + } + } + + // Handle the request through transport + try { + await this.transport!.handleRequest(req, res); + } catch (error) { + this.clientBehavior.errors.push(`Request error: ${error}`); + console.error('Transport error:', error); + res.status(500).json({ error: 'Internal server error' }); + } + }); + + // Endpoint to retrieve client behavior for reporting + this.app.get('/validation/report', (req, res) => { + res.json(this.getValidationResults()); + }); + } + + async start(): Promise { + return new Promise((resolve) => { + this.server = this.app.listen(this.config.port, () => { + const port = this.getPort(); + console.log(`Validation server started on port ${port}`); + resolve(port); + }); + }); + } + + async stop(): Promise { + if (this.transport) { + await this.transport.close(); + } + return new Promise((resolve) => { + if (this.server) { + this.server.close(() => { + console.log('Validation server stopped'); + resolve(); + }); + } else { + resolve(); + } + }); + } + + getPort(): number { + if (!this.server) { + throw new Error('Server not started'); + } + const address = this.server.address(); + if (typeof address === 'object' && address !== null) { + return address.port; + } + throw new Error('Unable to get server port'); + } + + getValidationResults(): TestResult[] { + const results: TestResult[] = []; + + // Test: MCP Initialization + results.push({ + name: 'mcp_initialization', + result: this.clientBehavior.initialized ? 'PASS' : 'FAIL', + details: { + connected: this.clientBehavior.connected, + initialized: this.clientBehavior.initialized, + protocol_version: this.clientBehavior.protocolVersion, + client_info: this.clientBehavior.clientInfo + }, + errors: this.clientBehavior.initialized ? undefined : ['Client did not complete initialization'] + }); + + // Test: Auth metadata discovery (if auth required) + if (this.config.authRequired) { + results.push({ + name: 'auth_metadata_discovery', + result: this.clientBehavior.authMetadataRequested ? 'PASS' : 'FAIL', + details: { + metadata_requested: this.clientBehavior.authMetadataRequested, + metadata_location: this.config.metadataLocation + }, + errors: this.clientBehavior.authMetadataRequested ? undefined : ['Client did not request auth metadata'] + }); + } + + // Test: Basic functionality + const madeRequests = this.clientBehavior.requestsMade.length > 1; // More than just initialize + results.push({ + name: 'basic_functionality', + result: madeRequests ? 'PASS' : 'FAIL', + details: { + requests_made: this.clientBehavior.requestsMade + }, + errors: madeRequests ? undefined : ['Client did not make any requests beyond initialization'] + }); + + return results; + } + + getClientBehavior(): ClientBehavior { + return this.clientBehavior; + } +} \ No newline at end of file diff --git a/auth-compat/src/test-validation-server.ts b/auth-compat/src/test-validation-server.ts new file mode 100644 index 000000000..30ce52ac4 --- /dev/null +++ b/auth-compat/src/test-validation-server.ts @@ -0,0 +1,86 @@ +#!/usr/bin/env node + +import { ValidationServer } from './server/validation/index.js'; +import { spawn } from 'child_process'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +async function testValidationServer() { + console.log('🚀 Starting validation server test...\n'); + + // Start validation server + const server = new ValidationServer({ + authRequired: false // Start with no auth for basic testing + }); + + const port = await server.start(); + const serverUrl = `http://localhost:${port}/mcp`; + + console.log(`✅ Validation server started at: ${serverUrl}\n`); + + // Path to the example client + const clientPath = path.join(__dirname, '..', 'examples', 'typescript-client', 'test-client.ts'); + + console.log('🔧 Running test client...\n'); + + // Run the test client + const clientProcess = spawn('npx', ['tsx', clientPath, serverUrl], { + cwd: path.join(__dirname, '..', 'examples', 'typescript-client'), + stdio: 'inherit' + }); + + // Wait for client to finish + const clientExitCode = await new Promise((resolve) => { + clientProcess.on('exit', (code) => { + resolve(code || 0); + }); + }); + + console.log(`\n📊 Client exit code: ${clientExitCode}`); + + // Get validation results + const results = server.getValidationResults(); + const behavior = server.getClientBehavior(); + + console.log('\n📋 Validation Results:'); + console.log('===================='); + + results.forEach(result => { + const icon = result.result === 'PASS' ? '✅' : '❌'; + console.log(`\n${icon} ${result.name}: ${result.result}`); + console.log(' Details:', JSON.stringify(result.details, null, 2)); + if (result.errors) { + console.log(' Errors:', result.errors); + } + }); + + console.log('\n🔍 Client Behavior:'); + console.log('=================='); + console.log(JSON.stringify(behavior, null, 2)); + + // Calculate overall result + const passed = results.filter(r => r.result === 'PASS').length; + const failed = results.filter(r => r.result === 'FAIL').length; + const overallResult = failed === 0 ? 'PASS' : 'FAIL'; + + console.log('\n📊 Summary:'); + console.log('=========='); + console.log(`Tests Passed: ${passed}`); + console.log(`Tests Failed: ${failed}`); + console.log(`Overall Result: ${overallResult}`); + console.log(`Client Exit Code: ${clientExitCode}`); + + // Stop server + await server.stop(); + + // Exit with appropriate code + process.exit(overallResult === 'PASS' && clientExitCode === 0 ? 0 : 1); +} + +testValidationServer().catch((error) => { + console.error('Test failed:', error); + process.exit(1); +}); \ No newline at end of file diff --git a/auth-compat/src/types.ts b/auth-compat/src/types.ts new file mode 100644 index 000000000..7b6807f3e --- /dev/null +++ b/auth-compat/src/types.ts @@ -0,0 +1,34 @@ +export interface TestResult { + name: string; + result: 'PASS' | 'FAIL'; + details: Record; + errors?: string[]; +} + +export interface ComplianceReport { + overall_result: 'PASS' | 'FAIL'; + test_suite: string; + timestamp: string; + client_command: string; + tests_passed: number; + tests_failed: number; + tests: TestResult[]; +} + +export interface ClientBehavior { + connected: boolean; + initialized: boolean; + protocolVersion?: string; + clientInfo?: Record; + requestsMade: string[]; + authMetadataRequested: boolean; + authFlowCompleted: boolean; + errors: string[]; +} + +export interface ValidationServerConfig { + port?: number; + authRequired?: boolean; + metadataLocation?: string; + mockAuthServerUrl?: string; +} \ No newline at end of file diff --git a/auth-compat/tsconfig.json b/auth-compat/tsconfig.json new file mode 100644 index 000000000..9ba0c8687 --- /dev/null +++ b/auth-compat/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ES2022", + "lib": ["ES2022"], + "moduleResolution": "node", + "outDir": "./dist", + "rootDir": "./src", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "examples"] +} \ No newline at end of file From c9f0e3ed8d8777d76336cd55c3f26673399c4274 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 7 Aug 2025 12:12:11 +0100 Subject: [PATCH 03/27] working simple validation --- auth-compat/src/server/validation/index.ts | 98 ++++++++++++++-------- 1 file changed, 65 insertions(+), 33 deletions(-) diff --git a/auth-compat/src/server/validation/index.ts b/auth-compat/src/server/validation/index.ts index 6cfeebfee..ff393c0f1 100644 --- a/auth-compat/src/server/validation/index.ts +++ b/auth-compat/src/server/validation/index.ts @@ -8,8 +8,6 @@ import { z } from 'zod'; export class ValidationServer { private app: express.Application; private server: Server | null = null; - private mcpServer: McpServer; - private transport: StreamableHTTPServerTransport | null = null; private clientBehavior: ClientBehavior; private config: ValidationServerConfig; @@ -34,8 +32,12 @@ export class ValidationServer { errors: [] }; - // Create MCP server - this.mcpServer = new McpServer({ + this.setupRoutes(); + } + + private createMCPServer(): McpServer { + // Create a new MCP server instance for each request + const mcpServer = new McpServer({ name: 'validation-server', version: '1.0.0' }, { @@ -44,13 +46,8 @@ export class ValidationServer { } }); - this.setupMCPHandlers(); - this.setupRoutes(); - } - - private setupMCPHandlers(): void { // Register a test tool - this.mcpServer.registerTool( + mcpServer.registerTool( 'test-tool', { title: 'Test Tool', @@ -60,7 +57,6 @@ export class ValidationServer { } }, async ({ message }) => { - this.clientBehavior.requestsMade.push('tools/call:test-tool'); return { content: [{ type: 'text', @@ -70,7 +66,7 @@ export class ValidationServer { } ); - // We'll track tool listing through the transport message handler instead + return mcpServer; } private setupRoutes(): void { @@ -96,18 +92,7 @@ export class ValidationServer { }); } - // Create transport once at startup - this.transport = new StreamableHTTPServerTransport( - this.config.authRequired ? { - requireAuth: true, - authMetadataUrl: `http://localhost:${this.config.port || 3000}${this.config.metadataLocation}` - } : {} - ); - - // Connect MCP server to transport - this.mcpServer.connect(this.transport).catch(console.error); - - // MCP endpoint + // MCP POST endpoint - stateless mode this.app.post('/mcp', async (req: Request, res: Response) => { // Track the incoming message if (req.body) { @@ -121,20 +106,70 @@ export class ValidationServer { } else if (message.method === 'tools/list') { this.clientBehavior.requestsMade.push('tools/list'); } else if (message.method === 'tools/call') { - this.clientBehavior.requestsMade.push(`tools/call:${message.params?.name}`); + const toolName = message.params?.name; + this.clientBehavior.requestsMade.push(`tools/call:${toolName}`); + } else if (message.method) { + this.clientBehavior.requestsMade.push(message.method); } } - // Handle the request through transport + // In stateless mode, create a new instance of transport and server for each request + // to ensure complete isolation try { - await this.transport!.handleRequest(req, res); + const mcpServer = this.createMCPServer(); + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: undefined, // No sessions in stateless mode + }); + + await mcpServer.connect(transport); + await transport.handleRequest(req, res, req.body); + + res.on('close', () => { + transport.close(); + mcpServer.close(); + }); } catch (error) { this.clientBehavior.errors.push(`Request error: ${error}`); - console.error('Transport error:', error); - res.status(500).json({ error: 'Internal server error' }); + console.error('Error handling MCP request:', error); + if (!res.headersSent) { + res.status(500).json({ + jsonrpc: '2.0', + error: { + code: -32603, + message: 'Internal server error', + }, + id: null, + }); + } } }); + // MCP GET endpoint - not supported in stateless mode + this.app.get('/mcp', async (req: Request, res: Response) => { + console.log('Received GET MCP request (not supported in stateless mode)'); + res.writeHead(405).end(JSON.stringify({ + jsonrpc: "2.0", + error: { + code: -32000, + message: "Method not allowed in stateless mode" + }, + id: null + })); + }); + + // MCP DELETE endpoint - not supported in stateless mode + this.app.delete('/mcp', async (req: Request, res: Response) => { + console.log('Received DELETE MCP request (not supported in stateless mode)'); + res.writeHead(405).end(JSON.stringify({ + jsonrpc: "2.0", + error: { + code: -32000, + message: "Method not allowed in stateless mode" + }, + id: null + })); + }); + // Endpoint to retrieve client behavior for reporting this.app.get('/validation/report', (req, res) => { res.json(this.getValidationResults()); @@ -145,16 +180,13 @@ export class ValidationServer { return new Promise((resolve) => { this.server = this.app.listen(this.config.port, () => { const port = this.getPort(); - console.log(`Validation server started on port ${port}`); + console.log(`Validation server started on port ${port} (stateless mode)`); resolve(port); }); }); } async stop(): Promise { - if (this.transport) { - await this.transport.close(); - } return new Promise((resolve) => { if (this.server) { this.server.close(() => { From 73ed0a6d4c101c7d7f45ffb09f211f71de3bccc4 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 7 Aug 2025 12:41:55 +0100 Subject: [PATCH 04/27] super basic cli --- auth-compat/auth-compliance-design.md | 5 + auth-compat/package.json | 3 +- auth-compat/src/cli/index.ts | 172 ++++++++++++++++++++++++++ 3 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 auth-compat/src/cli/index.ts diff --git a/auth-compat/auth-compliance-design.md b/auth-compat/auth-compliance-design.md index a99add505..089328cb5 100644 --- a/auth-compat/auth-compliance-design.md +++ b/auth-compat/auth-compliance-design.md @@ -129,3 +129,8 @@ auth-compat/ - Token refresh testing - Custom grant types - Performance metrics + + +### Future todo + +- Need to handle client info, e.g. what redirect url the client will expect responses on. diff --git a/auth-compat/package.json b/auth-compat/package.json index 8765d58e9..5143983bb 100644 --- a/auth-compat/package.json +++ b/auth-compat/package.json @@ -10,7 +10,8 @@ "scripts": { "build": "tsc", "dev": "tsx src/cli/index.ts", - "test-validation-server": "tsx src/test-validation-server.ts" + "test-validation-server": "tsx src/test-validation-server.ts", + "cli": "tsx src/cli/index.ts" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.0.0", diff --git a/auth-compat/src/cli/index.ts b/auth-compat/src/cli/index.ts new file mode 100644 index 000000000..748f3769f --- /dev/null +++ b/auth-compat/src/cli/index.ts @@ -0,0 +1,172 @@ +#!/usr/bin/env node + +import { Command } from 'commander'; +import { spawn } from 'child_process'; +import { ValidationServer } from '../server/validation/index.js'; +import { ComplianceReport } from '../types.js'; + +const program = new Command(); + +program + .name('mcp-auth-compat') + .description('MCP Authorization Compliance Checker') + .version('1.0.0'); + +program + .argument('', 'Command to run the client (should accept server URL as argument)') + .option('--timeout ', 'Timeout for client execution in milliseconds', '30000') + .option('--json', 'Output results as JSON', false) + .option('--verbose', 'Verbose output', false) + .action(async (clientCommand: string, options) => { + await runComplianceTests(clientCommand, options); + }); + +async function runComplianceTests(clientCommand: string, options: any) { + const verbose = options.verbose; + const timeout = parseInt(options.timeout, 10); + + console.log('Running MCP compliance tests...'); + + const allTestsPassed: boolean[] = []; + + // Run basic test (no auth) + console.log('\n[1/2] Basic compliance test'); + const basicPassed = await runSingleTest(clientCommand, false, timeout, options); + allTestsPassed.push(basicPassed); + + // Run auth test + console.log('\n[2/2] Authorization compliance test'); + const authPassed = await runSingleTest(clientCommand, true, timeout, options); + allTestsPassed.push(authPassed); + + // Overall summary + const overallPass = allTestsPassed.every(p => p); + console.log('\n' + '='.repeat(40)); + if (overallPass) { + console.log('✅ All tests PASSED'); + } else { + console.log('❌ Some tests FAILED'); + } + console.log('='.repeat(40)); + + process.exit(overallPass ? 0 : 1); +} + +async function runSingleTest( + clientCommand: string, + authRequired: boolean, + timeout: number, + options: any +): Promise { + const verbose = options.verbose; + + // Start validation server + const server = new ValidationServer({ authRequired }); + + try { + const serverPort = await server.start(); + const serverUrl = `http://localhost:${serverPort}/mcp`; + + if (verbose) { + console.log(` Server: ${serverUrl}`); + } + + // Parse the client command to separate the executable from its arguments + const commandParts = clientCommand.split(' '); + const executable = commandParts[0]; + const args = [...commandParts.slice(1), serverUrl]; + + // Run the client + const clientProcess = spawn(executable, args, { + stdio: verbose ? 'inherit' : 'pipe', + shell: true, + timeout + }); + + // Wait for client to finish + const clientExitCode = await new Promise((resolve, reject) => { + let timedOut = false; + + const timeoutHandle = setTimeout(() => { + timedOut = true; + clientProcess.kill(); + reject(new Error(`Timeout (${timeout}ms)`)); + }, timeout); + + clientProcess.on('exit', (code) => { + clearTimeout(timeoutHandle); + if (!timedOut) { + resolve(code || 0); + } + }); + + clientProcess.on('error', (error) => { + clearTimeout(timeoutHandle); + reject(error); + }); + }); + + // Get validation results + const results = server.getValidationResults(); + const behavior = server.getClientBehavior(); + + // Generate report + const report: ComplianceReport = { + overall_result: results.every(r => r.result === 'PASS') && clientExitCode === 0 ? 'PASS' : 'FAIL', + test_suite: authRequired ? 'authorization-compliance' : 'basic-compliance', + timestamp: new Date().toISOString(), + client_command: clientCommand, + tests_passed: results.filter(r => r.result === 'PASS').length, + tests_failed: results.filter(r => r.result === 'FAIL').length, + tests: results + }; + + // Output results + if (options.json) { + console.log(JSON.stringify(report, null, 2)); + } else { + printCompactReport(report, verbose ? behavior : null); + } + + // Stop server + await server.stop(); + + return report.overall_result === 'PASS'; + + } catch (error: any) { + console.log(` ❌ FAIL: ${error.message || error}`); + if (server) { + await server.stop(); + } + return false; + } +} + +function printCompactReport(report: ComplianceReport, behavior?: any) { + const passed = report.overall_result === 'PASS'; + const icon = passed ? '✅' : '❌'; + + console.log(` ${icon} ${report.test_suite}: ${report.overall_result}`); + + // Only show failures in compact mode + if (!passed) { + report.tests.forEach(test => { + if (test.result === 'FAIL') { + console.log(` ❌ ${test.name}`); + if (test.errors && test.errors.length > 0) { + test.errors.forEach(error => { + console.log(` - ${error}`); + }); + } + } + }); + } + + // Show detailed behavior only in verbose mode + if (behavior) { + console.log('\n Client Behavior:'); + console.log(' ' + JSON.stringify(behavior, null, 2).split('\n').join('\n ')); + } +} + +program.parse(); \ No newline at end of file From a28e0b38e566454cee91875a9e0f2126399fc2e4 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 7 Aug 2025 14:10:25 +0100 Subject: [PATCH 05/27] some stuff kinda working --- .../typescript-client/oauth-provider.ts | 96 +++++++ .../examples/typescript-client/test-client.ts | 48 +++- auth-compat/src/cli/index.ts | 79 +++++- auth-compat/src/server/auth/index.ts | 236 ++++++++++++++++++ auth-compat/src/server/validation/index.ts | 98 +++++++- auth-compat/src/types.ts | 14 ++ 6 files changed, 556 insertions(+), 15 deletions(-) create mode 100644 auth-compat/examples/typescript-client/oauth-provider.ts create mode 100644 auth-compat/src/server/auth/index.ts diff --git a/auth-compat/examples/typescript-client/oauth-provider.ts b/auth-compat/examples/typescript-client/oauth-provider.ts new file mode 100644 index 000000000..ae1a01aed --- /dev/null +++ b/auth-compat/examples/typescript-client/oauth-provider.ts @@ -0,0 +1,96 @@ +import { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth.js'; +import { + OAuthClientInformation, + OAuthClientInformationFull, + OAuthClientMetadata, + OAuthTokens +} from '@modelcontextprotocol/sdk/shared/auth.js'; + +export class InMemoryOAuthClientProvider implements OAuthClientProvider { + private _clientInformation?: OAuthClientInformationFull; + private _tokens?: OAuthTokens; + private _codeVerifier?: string; + private _authCode?: string; + private _authCodePromise?: Promise; + + constructor( + private readonly _redirectUrl: string | URL, + private readonly _clientMetadata: OAuthClientMetadata, + private readonly _clientMetadataUrl?: string | URL, + ) { + } + + get redirectUrl(): string | URL { + return this._redirectUrl; + } + + get clientMetadata(): OAuthClientMetadata { + return this._clientMetadata; + } + + clientInformation(): OAuthClientInformation | undefined { + if (this._clientMetadataUrl) { + console.log("Using client ID metadata URL"); + return { + client_id: this._clientMetadataUrl.toString(), + } + } + return this._clientInformation; + } + + saveClientInformation(clientInformation: OAuthClientInformationFull): void { + this._clientInformation = clientInformation; + } + + tokens(): OAuthTokens | undefined { + return this._tokens; + } + + saveTokens(tokens: OAuthTokens): void { + this._tokens = tokens; + } + + async redirectToAuthorization(authorizationUrl: URL): Promise { + try { + const response = await fetch(authorizationUrl.toString(), { + redirect: 'manual', // Don't follow redirects automatically + }); + + // Get the Location header which contains the redirect with auth code + const location = response.headers.get('location'); + if (location) { + const redirectUrl = new URL(location); + const code = redirectUrl.searchParams.get('code'); + if (code) { + this._authCode = code; + return; + } else { + throw new Error('No auth code in redirect URL'); + } + } else { + throw new Error('No redirect location received'); + } + } catch (error) { + console.error('Failed to fetch authorization URL:', error); + throw error; + } + } + + async getAuthCode(): Promise { + if (this._authCode) { + return this._authCode; + } + throw new Error('No authorization code'); + } + + saveCodeVerifier(codeVerifier: string): void { + this._codeVerifier = codeVerifier; + } + + codeVerifier(): string { + if (!this._codeVerifier) { + throw new Error('No code verifier saved'); + } + return this._codeVerifier; + } +} diff --git a/auth-compat/examples/typescript-client/test-client.ts b/auth-compat/examples/typescript-client/test-client.ts index e87edaaaf..fc28afb9b 100644 --- a/auth-compat/examples/typescript-client/test-client.ts +++ b/auth-compat/examples/typescript-client/test-client.ts @@ -2,6 +2,9 @@ import { Client } from '@modelcontextprotocol/sdk/client/index.js'; import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'; +import { UnauthorizedError } from '@modelcontextprotocol/sdk/client/auth.js'; +import { OAuthClientMetadata } from '@modelcontextprotocol/sdk/shared/auth.js'; +import { InMemoryOAuthClientProvider } from './oauth-provider.js'; async function main(): Promise { const serverUrl = process.argv[2]; @@ -13,7 +16,24 @@ async function main(): Promise { console.log(`Connecting to MCP server at: ${serverUrl}`); + const CALLBACK_URL = `http://localhost:8090/callback`; + try { + // Set up OAuth provider + const clientMetadata: OAuthClientMetadata = { + client_name: 'Test Client', + redirect_uris: [CALLBACK_URL], + grant_types: ['authorization_code', 'refresh_token'], + response_types: ['code'], + token_endpoint_auth_method: 'none', + scope: 'mcp' + }; + + const oauthProvider = new InMemoryOAuthClientProvider( + CALLBACK_URL, + clientMetadata + ); + const client = new Client({ name: 'test-client', version: '1.0.0' @@ -22,11 +42,33 @@ async function main(): Promise { }); const transport = new StreamableHTTPClientTransport( - new URL(serverUrl) + new URL(serverUrl), + { + authProvider: oauthProvider + } ); - await client.connect(transport); - console.log('✅ Successfully connected to MCP server'); + // Try to connect - handle OAuth if needed + try { + await client.connect(transport); + console.log('✅ Successfully connected to MCP server'); + } catch (error) { + if (error instanceof UnauthorizedError) { + console.log('🔐 OAuth required - handling authorization...'); + + // The provider will automatically fetch the auth code + const authCode = await oauthProvider.getAuthCode(); + + // Complete the auth flow + await transport.finishAuth(authCode); + + // Now reconnect with auth + await client.connect(transport); + console.log('✅ Successfully connected with authentication'); + } else { + throw error; + } + } await client.listTools(); console.log('✅ Successfully listed tools') diff --git a/auth-compat/src/cli/index.ts b/auth-compat/src/cli/index.ts index 748f3769f..e2bf33ac9 100644 --- a/auth-compat/src/cli/index.ts +++ b/auth-compat/src/cli/index.ts @@ -162,11 +162,84 @@ function printCompactReport(report: ComplianceReport, behavior?: any) { }); } - // Show detailed behavior only in verbose mode + // Show HTTP trace and detailed behavior in verbose mode if (behavior) { - console.log('\n Client Behavior:'); - console.log(' ' + JSON.stringify(behavior, null, 2).split('\n').join('\n ')); + // Show HTTP trace in wire format if available + if (behavior.httpTrace && behavior.httpTrace.length > 0) { + console.log('\n ====== HTTP TRACE ======'); + behavior.httpTrace.forEach((trace: any, index: number) => { + console.log(`\n --- Request #${index + 1} ---`); + + // Request line + console.log(` ${trace.method} ${trace.url} HTTP/1.1`); + + // Request headers + if (trace.headers) { + Object.entries(trace.headers).forEach(([key, value]) => { + console.log(` ${key}: ${value}`); + }); + } + + // Request body + if (trace.body) { + console.log(''); + const bodyStr = typeof trace.body === 'string' ? trace.body : JSON.stringify(trace.body); + console.log(` ${bodyStr}`); + } + + // Response + if (trace.response) { + console.log(`\n HTTP/1.1 ${trace.response.status} ${getStatusText(trace.response.status)}`); + + // Response headers + if (trace.response.headers) { + Object.entries(trace.response.headers).forEach(([key, value]) => { + console.log(` ${key}: ${value}`); + }); + } + + // Response body + if (trace.response.body) { + console.log(''); + const bodyStr = typeof trace.response.body === 'string' + ? trace.response.body + : JSON.stringify(trace.response.body); + + // Truncate very long responses + if (bodyStr.length > 1000) { + console.log(` ${bodyStr.substring(0, 1000)}... [truncated]`); + } else { + console.log(` ${bodyStr}`); + } + } + } + console.log(''); + }); + console.log(' ========================\n'); + } + + // Show other behavior details + console.log(' Client Behavior Summary:'); + const summaryBehavior = { ...behavior }; + delete summaryBehavior.httpTrace; // Don't repeat the trace + console.log(' ' + JSON.stringify(summaryBehavior, null, 2).split('\n').join('\n ')); } } +function getStatusText(status: number): string { + const statusTexts: Record = { + 200: 'OK', + 201: 'Created', + 202: 'Accepted', + 302: 'Found', + 400: 'Bad Request', + 401: 'Unauthorized', + 403: 'Forbidden', + 404: 'Not Found', + 405: 'Method Not Allowed', + 500: 'Internal Server Error' + }; + return statusTexts[status] || ''; +} + program.parse(); \ No newline at end of file diff --git a/auth-compat/src/server/auth/index.ts b/auth-compat/src/server/auth/index.ts new file mode 100644 index 000000000..48a97c86d --- /dev/null +++ b/auth-compat/src/server/auth/index.ts @@ -0,0 +1,236 @@ +import express, { Request, Response } from 'express'; +import { Server } from 'http'; +import crypto from 'crypto'; + +interface AuthorizationRequest { + clientId: string; + redirectUri: string; + state: string; + codeChallenge: string; + codeChallengeMethod: string; +} + +export class MockAuthServer { + private app: express.Application; + private server: Server | null = null; + private port: number; + + // Store authorization requests for PKCE validation + private authorizationRequests: Map = new Map(); + + // Static values for simplicity + private readonly FIXED_AUTH_CODE = 'test_auth_code_123'; + private readonly FIXED_ACCESS_TOKEN = 'test_access_token_abc'; + private readonly FIXED_REFRESH_TOKEN = 'test_refresh_token_xyz'; + private readonly TOKEN_EXPIRY = 3600; // 1 hour + + constructor(port: number = 3001) { + this.port = port; + this.app = express(); + this.app.use(express.json()); + this.app.use(express.urlencoded({ extended: true })); + this.setupRoutes(); + } + + private setupRoutes(): void { + // Log all requests to auth server + this.app.use((req, res, next) => { + console.log(`\n[AUTH SERVER] >>> HTTP ${req.method} ${req.url}`); + console.log('[AUTH SERVER] Headers:', JSON.stringify(req.headers, null, 2)); + if (req.body && Object.keys(req.body).length > 0) { + console.log('[AUTH SERVER] Body:', JSON.stringify(req.body, null, 2)); + } + next(); + }); + + // OAuth2 authorization endpoint + this.app.get('/authorize', (req: Request, res: Response) => { + const { + response_type, + client_id, + redirect_uri, + state, + code_challenge, + code_challenge_method, + } = req.query as any; + + // Basic validation + if (response_type !== 'code') { + return res.status(400).json({ + error: 'unsupported_response_type', + error_description: 'Only code response type is supported' + }); + } + + if (!code_challenge || code_challenge_method !== 'S256') { + return res.status(400).json({ + error: 'invalid_request', + error_description: 'PKCE is required with S256 method' + }); + } + + // Store the request for later PKCE validation + this.authorizationRequests.set(this.FIXED_AUTH_CODE, { + clientId: client_id, + redirectUri: redirect_uri, + state: state || '', + codeChallenge: code_challenge, + codeChallengeMethod: code_challenge_method + }); + + // Immediately redirect back with authorization code (no user interaction) + const redirectUrl = new URL(redirect_uri); + redirectUrl.searchParams.set('code', this.FIXED_AUTH_CODE); + if (state) { + redirectUrl.searchParams.set('state', state); + } + + console.log(`Mock auth server: Redirecting to ${redirectUrl.toString()}`); + res.redirect(redirectUrl.toString()); + }); + + // OAuth2 token endpoint + this.app.post('/token', (req: Request, res: Response) => { + const { + grant_type, + code, + redirect_uri, + code_verifier, + client_id, + client_secret, + refresh_token + } = req.body; + + if (grant_type === 'authorization_code') { + // Validate authorization code + if (code !== this.FIXED_AUTH_CODE) { + return res.status(400).json({ + error: 'invalid_grant', + error_description: 'Invalid authorization code' + }); + } + + // Get the stored authorization request + const authRequest = this.authorizationRequests.get(code); + if (!authRequest) { + return res.status(400).json({ + error: 'invalid_grant', + error_description: 'Authorization code not found or expired' + }); + } + + // Validate redirect URI matches + if (redirect_uri !== authRequest.redirectUri) { + return res.status(400).json({ + error: 'invalid_grant', + error_description: 'Redirect URI mismatch' + }); + } + + // Validate PKCE code verifier + if (!this.validatePKCE(code_verifier, authRequest.codeChallenge)) { + return res.status(400).json({ + error: 'invalid_grant', + error_description: 'Invalid PKCE code verifier' + }); + } + + // Clean up used authorization code + this.authorizationRequests.delete(code); + + // Return tokens + res.json({ + access_token: this.FIXED_ACCESS_TOKEN, + token_type: 'Bearer', + expires_in: this.TOKEN_EXPIRY, + refresh_token: this.FIXED_REFRESH_TOKEN, + scope: 'mcp' + }); + + } else if (grant_type === 'refresh_token') { + // Simple refresh token validation + if (refresh_token !== this.FIXED_REFRESH_TOKEN) { + return res.status(400).json({ + error: 'invalid_grant', + error_description: 'Invalid refresh token' + }); + } + + // Return new access token (same static value for simplicity) + res.json({ + access_token: this.FIXED_ACCESS_TOKEN, + token_type: 'Bearer', + expires_in: this.TOKEN_EXPIRY, + refresh_token: this.FIXED_REFRESH_TOKEN, + scope: 'mcp' + }); + + } else { + res.status(400).json({ + error: 'unsupported_grant_type', + error_description: 'Grant type not supported' + }); + } + }); + + // Client registration endpoint (returns static client info) + this.app.post('/register', (req: Request, res: Response) => { + const { client_name, redirect_uris } = req.body; + + // Return a static client configuration + res.status(201).json({ + client_id: 'test_client_id', + client_secret: 'test_client_secret', + client_name: client_name || 'Test Client', + redirect_uris: redirect_uris || [], + grant_types: ['authorization_code', 'refresh_token'], + response_types: ['code'], + token_endpoint_auth_method: 'client_secret_post' + }); + }); + + // Health check + this.app.get('/health', (req: Request, res: Response) => { + res.json({ status: 'ok', server: 'mock-auth-server' }); + }); + } + + private validatePKCE(codeVerifier: string, codeChallenge: string): boolean { + if (!codeVerifier || !codeChallenge) { + return false; + } + + // Compute S256 challenge from verifier + const hash = crypto.createHash('sha256'); + hash.update(codeVerifier); + const computedChallenge = hash.digest('base64url'); + + return computedChallenge === codeChallenge; + } + + async start(): Promise { + return new Promise((resolve) => { + this.server = this.app.listen(this.port, () => { + console.log(`Mock auth server started on port ${this.port}`); + resolve(); + }); + }); + } + + async stop(): Promise { + return new Promise((resolve) => { + if (this.server) { + this.server.close(() => { + console.log('Mock auth server stopped'); + resolve(); + }); + } else { + resolve(); + } + }); + } + + getUrl(): string { + return `http://localhost:${this.port}`; + } +} diff --git a/auth-compat/src/server/validation/index.ts b/auth-compat/src/server/validation/index.ts index ff393c0f1..a33f982d1 100644 --- a/auth-compat/src/server/validation/index.ts +++ b/auth-compat/src/server/validation/index.ts @@ -2,7 +2,10 @@ import express, { Request, Response } from 'express'; import { Server } from 'http'; import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; +import { requireBearerAuth } from '@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js'; + import { ClientBehavior, TestResult, ValidationServerConfig } from '../../types.js'; +import { MockAuthServer } from '../auth/index.js'; import { z } from 'zod'; export class ValidationServer { @@ -10,6 +13,7 @@ export class ValidationServer { private server: Server | null = null; private clientBehavior: ClientBehavior; private config: ValidationServerConfig; + private authServer: MockAuthServer | null = null; constructor(config: ValidationServerConfig = {}) { this.config = { @@ -19,6 +23,11 @@ export class ValidationServer { mockAuthServerUrl: config.mockAuthServerUrl || 'http://localhost:3001' }; + // Start auth server if auth is required + if (this.config.authRequired) { + this.authServer = new MockAuthServer(3001); + } + this.app = express(); this.app.use(express.json()); @@ -29,7 +38,8 @@ export class ValidationServer { requestsMade: [], authMetadataRequested: false, authFlowCompleted: false, - errors: [] + errors: [], + httpTrace: [] }; this.setupRoutes(); @@ -70,11 +80,56 @@ export class ValidationServer { } private setupRoutes(): void { + // Capture all HTTP requests and responses + this.app.use((req, res, next) => { + const trace: any = { + timestamp: new Date().toISOString(), + method: req.method, + url: req.url, + headers: req.headers, + body: req.body && Object.keys(req.body).length > 0 ? req.body : undefined + }; + + // Capture response using Buffer approach + const oldWrite = res.write; + const oldEnd = res.end; + const chunks: Buffer[] = []; + + res.write = function (chunk) { + chunks.push(new Buffer(chunk)); + + oldWrite.apply(res, arguments); + }; + + res.end = function (chunk) { + if (chunk) + chunks.push(new Buffer(chunk)); + + var body = Buffer.concat(chunks).toString('utf8'); + // console.log(req.path, body); + if (!trace.response) { + trace.response = {}; + } + trace.response.body = body; + + + + oldEnd.apply(res, arguments); + }; + + this.clientBehavior.httpTrace.push(trace); + + next(); + }); + // Health check endpoint this.app.get('/health', (req, res) => { res.json({ status: 'ok' }); }); + let bearerMiddleware; + + // OAuth metadata endpoint (if auth is required) if (this.config.authRequired) { this.app.get(this.config.metadataLocation!, (req, res) => { @@ -83,13 +138,18 @@ export class ValidationServer { issuer: this.config.mockAuthServerUrl, authorization_endpoint: `${this.config.mockAuthServerUrl}/authorize`, token_endpoint: `${this.config.mockAuthServerUrl}/token`, - jwks_uri: `${this.config.mockAuthServerUrl}/jwks`, response_types_supported: ['code'], grant_types_supported: ['authorization_code', 'refresh_token'], - code_challenge_methods_supported: ['S256'], - token_endpoint_auth_methods_supported: ['client_secret_post', 'client_secret_basic'] + code_challenge_methods_supported: ['S256'] }); }); + + bearerMiddleware = requireBearerAuth({ + verifier: tokenVerifier, + requiredScopes: [], + // This is for www-authenticate, need to handle disabling this + resourceMetadataUrl: this.config.metadataLocation!, + }); } // MCP POST endpoint - stateless mode @@ -117,13 +177,23 @@ export class ValidationServer { // to ensure complete isolation try { const mcpServer = this.createMCPServer(); - const transport = new StreamableHTTPServerTransport({ + + // Configure transport based on auth requirements + const transportConfig: any = { sessionIdGenerator: undefined, // No sessions in stateless mode - }); - + }; + + // If auth is required, set the auth metadata URL + if (this.config.authRequired) { + const serverPort = this.getPort(); + transportConfig.authMetadataUrl = `http://localhost:${serverPort}${this.config.metadataLocation}`; + } + + const transport = new StreamableHTTPServerTransport(transportConfig); + await mcpServer.connect(transport); await transport.handleRequest(req, res, req.body); - + res.on('close', () => { transport.close(); mcpServer.close(); @@ -177,6 +247,11 @@ export class ValidationServer { } async start(): Promise { + // Start auth server first if needed + if (this.authServer) { + await this.authServer.start(); + } + return new Promise((resolve) => { this.server = this.app.listen(this.config.port, () => { const port = this.getPort(); @@ -187,6 +262,11 @@ export class ValidationServer { } async stop(): Promise { + // Stop auth server if running + if (this.authServer) { + await this.authServer.stop(); + } + return new Promise((resolve) => { if (this.server) { this.server.close(() => { @@ -256,4 +336,4 @@ export class ValidationServer { getClientBehavior(): ClientBehavior { return this.clientBehavior; } -} \ No newline at end of file +} diff --git a/auth-compat/src/types.ts b/auth-compat/src/types.ts index 7b6807f3e..bfb3ed217 100644 --- a/auth-compat/src/types.ts +++ b/auth-compat/src/types.ts @@ -15,6 +15,19 @@ export interface ComplianceReport { tests: TestResult[]; } +export interface HttpTrace { + timestamp: string; + method: string; + url: string; + headers: Record; + body?: any; + response?: { + status: number; + headers?: Record; + body?: any; + }; +} + export interface ClientBehavior { connected: boolean; initialized: boolean; @@ -24,6 +37,7 @@ export interface ClientBehavior { authMetadataRequested: boolean; authFlowCompleted: boolean; errors: string[]; + httpTrace: HttpTrace[]; } export interface ValidationServerConfig { From 68425c61702adb813886edf0a2f92afc39a743ce Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 7 Aug 2025 14:22:08 +0100 Subject: [PATCH 06/27] token verifier --- auth-compat/.gitignore | 1 + auth-compat/src/cli/index.ts | 36 ++++++------ auth-compat/src/server/auth/index.ts | 65 ++++++++++++++++------ auth-compat/src/server/validation/index.ts | 12 ++-- 4 files changed, 72 insertions(+), 42 deletions(-) create mode 100644 auth-compat/.gitignore diff --git a/auth-compat/.gitignore b/auth-compat/.gitignore new file mode 100644 index 000000000..1521c8b76 --- /dev/null +++ b/auth-compat/.gitignore @@ -0,0 +1 @@ +dist diff --git a/auth-compat/src/cli/index.ts b/auth-compat/src/cli/index.ts index e2bf33ac9..48e20d462 100644 --- a/auth-compat/src/cli/index.ts +++ b/auth-compat/src/cli/index.ts @@ -24,7 +24,7 @@ program async function runComplianceTests(clientCommand: string, options: any) { const verbose = options.verbose; const timeout = parseInt(options.timeout, 10); - + console.log('Running MCP compliance tests...'); const allTestsPassed: boolean[] = []; @@ -53,20 +53,20 @@ async function runComplianceTests(clientCommand: string, options: any) { } async function runSingleTest( - clientCommand: string, - authRequired: boolean, + clientCommand: string, + authRequired: boolean, timeout: number, options: any ): Promise { const verbose = options.verbose; - + // Start validation server const server = new ValidationServer({ authRequired }); try { const serverPort = await server.start(); const serverUrl = `http://localhost:${serverPort}/mcp`; - + if (verbose) { console.log(` Server: ${serverUrl}`); } @@ -145,9 +145,9 @@ async function runSingleTest( function printCompactReport(report: ComplianceReport, behavior?: any) { const passed = report.overall_result === 'PASS'; const icon = passed ? '✅' : '❌'; - + console.log(` ${icon} ${report.test_suite}: ${report.overall_result}`); - + // Only show failures in compact mode if (!passed) { report.tests.forEach(test => { @@ -169,42 +169,42 @@ function printCompactReport(report: ComplianceReport, behavior?: any) { console.log('\n ====== HTTP TRACE ======'); behavior.httpTrace.forEach((trace: any, index: number) => { console.log(`\n --- Request #${index + 1} ---`); - + // Request line console.log(` ${trace.method} ${trace.url} HTTP/1.1`); - + // Request headers if (trace.headers) { Object.entries(trace.headers).forEach(([key, value]) => { console.log(` ${key}: ${value}`); }); } - + // Request body if (trace.body) { console.log(''); const bodyStr = typeof trace.body === 'string' ? trace.body : JSON.stringify(trace.body); console.log(` ${bodyStr}`); } - + // Response if (trace.response) { console.log(`\n HTTP/1.1 ${trace.response.status} ${getStatusText(trace.response.status)}`); - + // Response headers if (trace.response.headers) { Object.entries(trace.response.headers).forEach(([key, value]) => { console.log(` ${key}: ${value}`); }); } - + // Response body if (trace.response.body) { console.log(''); - const bodyStr = typeof trace.response.body === 'string' - ? trace.response.body + const bodyStr = typeof trace.response.body === 'string' + ? trace.response.body : JSON.stringify(trace.response.body); - + // Truncate very long responses if (bodyStr.length > 1000) { console.log(` ${bodyStr.substring(0, 1000)}... [truncated]`); @@ -217,7 +217,7 @@ function printCompactReport(report: ComplianceReport, behavior?: any) { }); console.log(' ========================\n'); } - + // Show other behavior details console.log(' Client Behavior Summary:'); const summaryBehavior = { ...behavior }; @@ -242,4 +242,4 @@ function getStatusText(status: number): string { return statusTexts[status] || ''; } -program.parse(); \ No newline at end of file +program.parse(); diff --git a/auth-compat/src/server/auth/index.ts b/auth-compat/src/server/auth/index.ts index 48a97c86d..07dad9a2b 100644 --- a/auth-compat/src/server/auth/index.ts +++ b/auth-compat/src/server/auth/index.ts @@ -1,6 +1,8 @@ import express, { Request, Response } from 'express'; import { Server } from 'http'; import crypto from 'crypto'; +import { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js'; +import { OAuthTokenVerifier } from '@modelcontextprotocol/sdk/server/auth/provider.js'; interface AuthorizationRequest { clientId: string; @@ -10,6 +12,16 @@ interface AuthorizationRequest { codeChallengeMethod: string; } +// Shared constants for the mock auth server +const AUTH_CONSTANTS = { + FIXED_AUTH_CODE: 'test_auth_code_123', + FIXED_ACCESS_TOKEN: 'test_access_token_abc', + FIXED_REFRESH_TOKEN: 'test_refresh_token_xyz', + TOKEN_EXPIRY: 3600, // 1 hour + CLIENT_ID: 'test_client_id', + CLIENT_SECRET: 'test_client_secret', +} as const; + export class MockAuthServer { private app: express.Application; private server: Server | null = null; @@ -18,12 +30,6 @@ export class MockAuthServer { // Store authorization requests for PKCE validation private authorizationRequests: Map = new Map(); - // Static values for simplicity - private readonly FIXED_AUTH_CODE = 'test_auth_code_123'; - private readonly FIXED_ACCESS_TOKEN = 'test_access_token_abc'; - private readonly FIXED_REFRESH_TOKEN = 'test_refresh_token_xyz'; - private readonly TOKEN_EXPIRY = 3600; // 1 hour - constructor(port: number = 3001) { this.port = port; this.app = express(); @@ -70,7 +76,7 @@ export class MockAuthServer { } // Store the request for later PKCE validation - this.authorizationRequests.set(this.FIXED_AUTH_CODE, { + this.authorizationRequests.set(AUTH_CONSTANTS.FIXED_AUTH_CODE, { clientId: client_id, redirectUri: redirect_uri, state: state || '', @@ -80,7 +86,7 @@ export class MockAuthServer { // Immediately redirect back with authorization code (no user interaction) const redirectUrl = new URL(redirect_uri); - redirectUrl.searchParams.set('code', this.FIXED_AUTH_CODE); + redirectUrl.searchParams.set('code', AUTH_CONSTANTS.FIXED_AUTH_CODE); if (state) { redirectUrl.searchParams.set('state', state); } @@ -103,7 +109,7 @@ export class MockAuthServer { if (grant_type === 'authorization_code') { // Validate authorization code - if (code !== this.FIXED_AUTH_CODE) { + if (code !== AUTH_CONSTANTS.FIXED_AUTH_CODE) { return res.status(400).json({ error: 'invalid_grant', error_description: 'Invalid authorization code' @@ -140,16 +146,16 @@ export class MockAuthServer { // Return tokens res.json({ - access_token: this.FIXED_ACCESS_TOKEN, + access_token: AUTH_CONSTANTS.FIXED_ACCESS_TOKEN, token_type: 'Bearer', - expires_in: this.TOKEN_EXPIRY, - refresh_token: this.FIXED_REFRESH_TOKEN, + expires_in: AUTH_CONSTANTS.TOKEN_EXPIRY, + refresh_token: AUTH_CONSTANTS.FIXED_REFRESH_TOKEN, scope: 'mcp' }); } else if (grant_type === 'refresh_token') { // Simple refresh token validation - if (refresh_token !== this.FIXED_REFRESH_TOKEN) { + if (refresh_token !== AUTH_CONSTANTS.FIXED_REFRESH_TOKEN) { return res.status(400).json({ error: 'invalid_grant', error_description: 'Invalid refresh token' @@ -158,10 +164,10 @@ export class MockAuthServer { // Return new access token (same static value for simplicity) res.json({ - access_token: this.FIXED_ACCESS_TOKEN, + access_token: AUTH_CONSTANTS.FIXED_ACCESS_TOKEN, token_type: 'Bearer', - expires_in: this.TOKEN_EXPIRY, - refresh_token: this.FIXED_REFRESH_TOKEN, + expires_in: AUTH_CONSTANTS.TOKEN_EXPIRY, + refresh_token: AUTH_CONSTANTS.FIXED_REFRESH_TOKEN, scope: 'mcp' }); @@ -179,8 +185,8 @@ export class MockAuthServer { // Return a static client configuration res.status(201).json({ - client_id: 'test_client_id', - client_secret: 'test_client_secret', + client_id: AUTH_CONSTANTS.CLIENT_ID, + client_secret: AUTH_CONSTANTS.CLIENT_SECRET, client_name: client_name || 'Test Client', redirect_uris: redirect_uris || [], grant_types: ['authorization_code', 'refresh_token'], @@ -234,3 +240,26 @@ export class MockAuthServer { return `http://localhost:${this.port}`; } } + +/** + * Token verifier implementation for the mock auth server. + * Validates the fixed access token and returns AuthInfo. + */ +export class MockTokenVerifier implements OAuthTokenVerifier { + async verifyAccessToken(token: string): Promise { + if (token !== AUTH_CONSTANTS.FIXED_ACCESS_TOKEN) { + throw new Error('Invalid access token'); + } + + // Return AuthInfo for the valid token + return { + token: token, + clientId: AUTH_CONSTANTS.CLIENT_ID, + scopes: ['mcp'], + expiresAt: Math.floor(Date.now() / 1000) + AUTH_CONSTANTS.TOKEN_EXPIRY, + extra: { + source: 'mock-auth-server' + } + }; + } +} diff --git a/auth-compat/src/server/validation/index.ts b/auth-compat/src/server/validation/index.ts index a33f982d1..47c521b0f 100644 --- a/auth-compat/src/server/validation/index.ts +++ b/auth-compat/src/server/validation/index.ts @@ -5,7 +5,7 @@ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/ import { requireBearerAuth } from '@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js'; import { ClientBehavior, TestResult, ValidationServerConfig } from '../../types.js'; -import { MockAuthServer } from '../auth/index.js'; +import { MockAuthServer, MockTokenVerifier } from '../auth/index.js'; import { z } from 'zod'; export class ValidationServer { @@ -112,8 +112,6 @@ export class ValidationServer { } trace.response.body = body; - - oldEnd.apply(res, arguments); }; @@ -127,8 +125,9 @@ export class ValidationServer { res.json({ status: 'ok' }); }); - let bearerMiddleware; - + let bearerMiddleware = (req, res, next) => { + next() + } // OAuth metadata endpoint (if auth is required) if (this.config.authRequired) { @@ -144,6 +143,7 @@ export class ValidationServer { }); }); + const tokenVerifier = new MockTokenVerifier(); bearerMiddleware = requireBearerAuth({ verifier: tokenVerifier, requiredScopes: [], @@ -153,7 +153,7 @@ export class ValidationServer { } // MCP POST endpoint - stateless mode - this.app.post('/mcp', async (req: Request, res: Response) => { + this.app.post('/mcp', bearerMiddleware, async (req: Request, res: Response) => { // Track the incoming message if (req.body) { const message = req.body; From 0de6e29f97188e0a0a167da5d1e90c3be984bf0f Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 7 Aug 2025 14:25:47 +0100 Subject: [PATCH 07/27] http traces working --- auth-compat/src/server/validation/index.ts | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/auth-compat/src/server/validation/index.ts b/auth-compat/src/server/validation/index.ts index 47c521b0f..ce0ff4f1b 100644 --- a/auth-compat/src/server/validation/index.ts +++ b/auth-compat/src/server/validation/index.ts @@ -96,23 +96,24 @@ export class ValidationServer { const chunks: Buffer[] = []; res.write = function (chunk) { - chunks.push(new Buffer(chunk)); - - oldWrite.apply(res, arguments); + chunks.push(Buffer.from(chunk)); + return oldWrite.apply(res, arguments); }; res.end = function (chunk) { if (chunk) - chunks.push(new Buffer(chunk)); + chunks.push(Buffer.from(chunk)); var body = Buffer.concat(chunks).toString('utf8'); - // console.log(req.path, body); - if (!trace.response) { - trace.response = {}; - } - trace.response.body = body; - oldEnd.apply(res, arguments); + // Capture response details + trace.response = { + status: res.statusCode, + headers: res.getHeaders(), + body: body + }; + + return oldEnd.apply(res, arguments); }; this.clientBehavior.httpTrace.push(trace); From a7c7f86a884f8611748f65f359143244ca5be2ac Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 7 Aug 2025 14:34:06 +0100 Subject: [PATCH 08/27] auth almost working --- auth-compat/src/cli/index.ts | 65 ++++++++++++++++++++-- auth-compat/src/middleware/http-trace.ts | 53 ++++++++++++++++++ auth-compat/src/server/auth/index.ts | 15 ++++- auth-compat/src/server/validation/index.ts | 44 ++------------- 4 files changed, 130 insertions(+), 47 deletions(-) create mode 100644 auth-compat/src/middleware/http-trace.ts diff --git a/auth-compat/src/cli/index.ts b/auth-compat/src/cli/index.ts index 48e20d462..8d3a174b1 100644 --- a/auth-compat/src/cli/index.ts +++ b/auth-compat/src/cli/index.ts @@ -109,6 +109,9 @@ async function runSingleTest( // Get validation results const results = server.getValidationResults(); const behavior = server.getClientBehavior(); + + // Get auth server trace if auth was required + const authServerTrace = authRequired && server.authServer ? server.authServer.getHttpTrace() : []; // Generate report const report: ComplianceReport = { @@ -125,7 +128,7 @@ async function runSingleTest( if (options.json) { console.log(JSON.stringify(report, null, 2)); } else { - printCompactReport(report, verbose ? behavior : null); + printCompactReport(report, verbose ? behavior : null, verbose ? authServerTrace : null); } // Stop server @@ -142,7 +145,7 @@ async function runSingleTest( } } -function printCompactReport(report: ComplianceReport, behavior?: any) { +function printCompactReport(report: ComplianceReport, behavior?: any, authServerTrace?: any[]) { const passed = report.overall_result === 'PASS'; const icon = passed ? '✅' : '❌'; @@ -164,9 +167,9 @@ function printCompactReport(report: ComplianceReport, behavior?: any) { // Show HTTP trace and detailed behavior in verbose mode if (behavior) { - // Show HTTP trace in wire format if available + // Show validation server HTTP trace in wire format if available if (behavior.httpTrace && behavior.httpTrace.length > 0) { - console.log('\n ====== HTTP TRACE ======'); + console.log('\n ====== VALIDATION SERVER HTTP TRACE ======'); behavior.httpTrace.forEach((trace: any, index: number) => { console.log(`\n --- Request #${index + 1} ---`); @@ -217,6 +220,60 @@ function printCompactReport(report: ComplianceReport, behavior?: any) { }); console.log(' ========================\n'); } + + // Show auth server HTTP trace if available + if (authServerTrace && authServerTrace.length > 0) { + console.log('\n ====== AUTH SERVER HTTP TRACE ======'); + authServerTrace.forEach((trace: any, index: number) => { + console.log(`\n --- Request #${index + 1} ---`); + + // Request line + console.log(` ${trace.method} ${trace.url} HTTP/1.1`); + + // Request headers + if (trace.headers) { + Object.entries(trace.headers).forEach(([key, value]) => { + console.log(` ${key}: ${value}`); + }); + } + + // Request body + if (trace.body) { + console.log(''); + const bodyStr = typeof trace.body === 'string' ? trace.body : JSON.stringify(trace.body); + console.log(` ${bodyStr}`); + } + + // Response + if (trace.response) { + console.log(`\n HTTP/1.1 ${trace.response.status} ${getStatusText(trace.response.status)}`); + + // Response headers + if (trace.response.headers) { + Object.entries(trace.response.headers).forEach(([key, value]) => { + console.log(` ${key}: ${value}`); + }); + } + + // Response body + if (trace.response.body) { + console.log(''); + const bodyStr = typeof trace.response.body === 'string' + ? trace.response.body + : JSON.stringify(trace.response.body); + + // Truncate very long responses + if (bodyStr.length > 1000) { + console.log(` ${bodyStr.substring(0, 1000)}... [truncated]`); + } else { + console.log(` ${bodyStr}`); + } + } + } + console.log(''); + }); + console.log(' ========================\n'); + } // Show other behavior details console.log(' Client Behavior Summary:'); diff --git a/auth-compat/src/middleware/http-trace.ts b/auth-compat/src/middleware/http-trace.ts new file mode 100644 index 000000000..487d20827 --- /dev/null +++ b/auth-compat/src/middleware/http-trace.ts @@ -0,0 +1,53 @@ +import { Request, Response, NextFunction } from 'express'; +import { HttpTrace } from '../types.js'; + +export interface HttpTraceCollector { + httpTrace: HttpTrace[]; +} + +/** + * Express middleware that captures HTTP requests and responses in wire format. + * @param collector Object with httpTrace array to store captured traces + */ +export function createHttpTraceMiddleware(collector: HttpTraceCollector) { + return (req: Request, res: Response, next: NextFunction) => { + const trace: HttpTrace = { + timestamp: new Date().toISOString(), + method: req.method, + url: req.url, + headers: req.headers, + body: req.body && Object.keys(req.body).length > 0 ? req.body : undefined + }; + + // Capture response using Buffer approach + const oldWrite = res.write; + const oldEnd = res.end; + const chunks: Buffer[] = []; + + res.write = function (chunk: any) { + chunks.push(Buffer.from(chunk)); + return oldWrite.apply(res, arguments as any); + }; + + res.end = function (chunk?: any) { + if (chunk) { + chunks.push(Buffer.from(chunk)); + } + + const body = Buffer.concat(chunks).toString('utf8'); + + // Capture response details + trace.response = { + status: res.statusCode, + headers: res.getHeaders() as Record, + body: body + }; + + collector.httpTrace.push(trace); + + return oldEnd.apply(res, arguments as any); + }; + + next(); + }; +} \ No newline at end of file diff --git a/auth-compat/src/server/auth/index.ts b/auth-compat/src/server/auth/index.ts index 07dad9a2b..e66f9672b 100644 --- a/auth-compat/src/server/auth/index.ts +++ b/auth-compat/src/server/auth/index.ts @@ -3,6 +3,8 @@ import { Server } from 'http'; import crypto from 'crypto'; import { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js'; import { OAuthTokenVerifier } from '@modelcontextprotocol/sdk/server/auth/provider.js'; +import { createHttpTraceMiddleware, HttpTraceCollector } from '../../middleware/http-trace.js'; +import { HttpTrace } from '../../types.js'; interface AuthorizationRequest { clientId: string; @@ -22,10 +24,11 @@ const AUTH_CONSTANTS = { CLIENT_SECRET: 'test_client_secret', } as const; -export class MockAuthServer { +export class MockAuthServer implements HttpTraceCollector { private app: express.Application; private server: Server | null = null; private port: number; + public httpTrace: HttpTrace[] = []; // Store authorization requests for PKCE validation private authorizationRequests: Map = new Map(); @@ -39,7 +42,10 @@ export class MockAuthServer { } private setupRoutes(): void { - // Log all requests to auth server + // Capture all HTTP requests and responses + this.app.use(createHttpTraceMiddleware(this)); + + // Log all requests to auth server (optional - can be removed if not needed) this.app.use((req, res, next) => { console.log(`\n[AUTH SERVER] >>> HTTP ${req.method} ${req.url}`); console.log('[AUTH SERVER] Headers:', JSON.stringify(req.headers, null, 2)); @@ -186,7 +192,6 @@ export class MockAuthServer { // Return a static client configuration res.status(201).json({ client_id: AUTH_CONSTANTS.CLIENT_ID, - client_secret: AUTH_CONSTANTS.CLIENT_SECRET, client_name: client_name || 'Test Client', redirect_uris: redirect_uris || [], grant_types: ['authorization_code', 'refresh_token'], @@ -239,6 +244,10 @@ export class MockAuthServer { getUrl(): string { return `http://localhost:${this.port}`; } + + getHttpTrace(): HttpTrace[] { + return this.httpTrace; + } } /** diff --git a/auth-compat/src/server/validation/index.ts b/auth-compat/src/server/validation/index.ts index ce0ff4f1b..c09d8e1a5 100644 --- a/auth-compat/src/server/validation/index.ts +++ b/auth-compat/src/server/validation/index.ts @@ -6,6 +6,7 @@ import { requireBearerAuth } from '@modelcontextprotocol/sdk/server/auth/middlew import { ClientBehavior, TestResult, ValidationServerConfig } from '../../types.js'; import { MockAuthServer, MockTokenVerifier } from '../auth/index.js'; +import { createHttpTraceMiddleware } from '../../middleware/http-trace.js'; import { z } from 'zod'; export class ValidationServer { @@ -13,7 +14,7 @@ export class ValidationServer { private server: Server | null = null; private clientBehavior: ClientBehavior; private config: ValidationServerConfig; - private authServer: MockAuthServer | null = null; + public authServer: MockAuthServer | null = null; constructor(config: ValidationServerConfig = {}) { this.config = { @@ -81,45 +82,7 @@ export class ValidationServer { private setupRoutes(): void { // Capture all HTTP requests and responses - this.app.use((req, res, next) => { - const trace: any = { - timestamp: new Date().toISOString(), - method: req.method, - url: req.url, - headers: req.headers, - body: req.body && Object.keys(req.body).length > 0 ? req.body : undefined - }; - - // Capture response using Buffer approach - const oldWrite = res.write; - const oldEnd = res.end; - const chunks: Buffer[] = []; - - res.write = function (chunk) { - chunks.push(Buffer.from(chunk)); - return oldWrite.apply(res, arguments); - }; - - res.end = function (chunk) { - if (chunk) - chunks.push(Buffer.from(chunk)); - - var body = Buffer.concat(chunks).toString('utf8'); - - // Capture response details - trace.response = { - status: res.statusCode, - headers: res.getHeaders(), - body: body - }; - - return oldEnd.apply(res, arguments); - }; - - this.clientBehavior.httpTrace.push(trace); - - next(); - }); + this.app.use(createHttpTraceMiddleware(this.clientBehavior)); // Health check endpoint this.app.get('/health', (req, res) => { @@ -138,6 +101,7 @@ export class ValidationServer { issuer: this.config.mockAuthServerUrl, authorization_endpoint: `${this.config.mockAuthServerUrl}/authorize`, token_endpoint: `${this.config.mockAuthServerUrl}/token`, + registration_endpoint: `${this.config.mockAuthServerUrl}/register`, response_types_supported: ['code'], grant_types_supported: ['authorization_code', 'refresh_token'], code_challenge_methods_supported: ['S256'] From 5a4b3124e92ac2cba6e646eaf28c8442763a29cd Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 7 Aug 2025 14:37:28 +0100 Subject: [PATCH 09/27] cleanup trace printing --- auth-compat/src/cli/index.ts | 139 ++++++++++++++++++++--------------- 1 file changed, 80 insertions(+), 59 deletions(-) diff --git a/auth-compat/src/cli/index.ts b/auth-compat/src/cli/index.ts index 8d3a174b1..acadaf0fc 100644 --- a/auth-compat/src/cli/index.ts +++ b/auth-compat/src/cli/index.ts @@ -109,7 +109,7 @@ async function runSingleTest( // Get validation results const results = server.getValidationResults(); const behavior = server.getClientBehavior(); - + // Get auth server trace if auth was required const authServerTrace = authRequired && server.authServer ? server.authServer.getHttpTrace() : []; @@ -145,6 +145,59 @@ async function runSingleTest( } } +function printHttpTrace(traces: any[], label: string) { + console.log(`\n ====== ${label} ======`); + traces.forEach((trace: any, index: number) => { + console.log(`\n --- Request #${index + 1} ---`); + + // Request line + console.log(` ${trace.method} ${trace.url} HTTP/1.1`); + + // Request headers + if (trace.headers) { + Object.entries(trace.headers).forEach(([key, value]) => { + console.log(` ${key}: ${value}`); + }); + } + + // Request body + if (trace.body) { + console.log(''); + const bodyStr = typeof trace.body === 'string' ? trace.body : JSON.stringify(trace.body); + console.log(` ${bodyStr}`); + } + + // Response + if (trace.response) { + console.log(`\n HTTP/1.1 ${trace.response.status} ${getStatusText(trace.response.status)}`); + + // Response headers + if (trace.response.headers) { + Object.entries(trace.response.headers).forEach(([key, value]) => { + console.log(` ${key}: ${value}`); + }); + } + + // Response body + if (trace.response.body) { + console.log(''); + const bodyStr = typeof trace.response.body === 'string' + ? trace.response.body + : JSON.stringify(trace.response.body); + + // Truncate very long responses + if (bodyStr.length > 1000) { + console.log(` ${bodyStr.substring(0, 1000)}... [truncated]`); + } else { + console.log(` ${bodyStr}`); + } + } + } + console.log(''); + }); + console.log(' ========================\n'); +} + function printCompactReport(report: ComplianceReport, behavior?: any, authServerTrace?: any[]) { const passed = report.overall_result === 'PASS'; const icon = passed ? '✅' : '❌'; @@ -167,11 +220,32 @@ function printCompactReport(report: ComplianceReport, behavior?: any, authServer // Show HTTP trace and detailed behavior in verbose mode if (behavior) { - // Show validation server HTTP trace in wire format if available + // Collect all traces and interleave them by timestamp + const allTraces: any[] = []; + + // Add validation server traces with source label if (behavior.httpTrace && behavior.httpTrace.length > 0) { - console.log('\n ====== VALIDATION SERVER HTTP TRACE ======'); - behavior.httpTrace.forEach((trace: any, index: number) => { - console.log(`\n --- Request #${index + 1} ---`); + behavior.httpTrace.forEach((trace: any) => { + allTraces.push({ ...trace, source: 'VALIDATION' }); + }); + } + + // Add auth server traces with source label + if (authServerTrace && authServerTrace.length > 0) { + authServerTrace.forEach((trace: any) => { + allTraces.push({ ...trace, source: 'AUTH' }); + }); + } + + // Sort all traces by timestamp for interleaved view + if (allTraces.length > 0) { + allTraces.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()); + + // Print interleaved traces + console.log('\n ====== INTERLEAVED HTTP TRACE ======'); + allTraces.forEach((trace: any, index: number) => { + console.log(`\n --- [${trace.source}] Request #${index + 1} ---`); + console.log(` Timestamp: ${trace.timestamp}`); // Request line console.log(` ${trace.method} ${trace.url} HTTP/1.1`); @@ -219,60 +293,7 @@ function printCompactReport(report: ComplianceReport, behavior?: any, authServer console.log(''); }); console.log(' ========================\n'); - } - - // Show auth server HTTP trace if available - if (authServerTrace && authServerTrace.length > 0) { - console.log('\n ====== AUTH SERVER HTTP TRACE ======'); - authServerTrace.forEach((trace: any, index: number) => { - console.log(`\n --- Request #${index + 1} ---`); - - // Request line - console.log(` ${trace.method} ${trace.url} HTTP/1.1`); - - // Request headers - if (trace.headers) { - Object.entries(trace.headers).forEach(([key, value]) => { - console.log(` ${key}: ${value}`); - }); - } - - // Request body - if (trace.body) { - console.log(''); - const bodyStr = typeof trace.body === 'string' ? trace.body : JSON.stringify(trace.body); - console.log(` ${bodyStr}`); - } - - // Response - if (trace.response) { - console.log(`\n HTTP/1.1 ${trace.response.status} ${getStatusText(trace.response.status)}`); - - // Response headers - if (trace.response.headers) { - Object.entries(trace.response.headers).forEach(([key, value]) => { - console.log(` ${key}: ${value}`); - }); - } - - // Response body - if (trace.response.body) { - console.log(''); - const bodyStr = typeof trace.response.body === 'string' - ? trace.response.body - : JSON.stringify(trace.response.body); - - // Truncate very long responses - if (bodyStr.length > 1000) { - console.log(` ${bodyStr.substring(0, 1000)}... [truncated]`); - } else { - console.log(` ${bodyStr}`); - } - } - } - console.log(''); - }); - console.log(' ========================\n'); + } // Show other behavior details From 0b2b08c19a2f710454ff8eabd27da02ac8830673 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 7 Aug 2025 14:49:09 +0100 Subject: [PATCH 10/27] working example --- .../examples/typescript-client/test-client.ts | 20 ++++++++-- auth-compat/src/cli/index.ts | 40 +++++++++++++++++-- auth-compat/src/server/auth/index.ts | 10 ----- 3 files changed, 53 insertions(+), 17 deletions(-) diff --git a/auth-compat/examples/typescript-client/test-client.ts b/auth-compat/examples/typescript-client/test-client.ts index fc28afb9b..292fb8b84 100644 --- a/auth-compat/examples/typescript-client/test-client.ts +++ b/auth-compat/examples/typescript-client/test-client.ts @@ -41,7 +41,7 @@ async function main(): Promise { capabilities: {} }); - const transport = new StreamableHTTPClientTransport( + let transport = new StreamableHTTPClientTransport( new URL(serverUrl), { authProvider: oauthProvider @@ -55,14 +55,25 @@ async function main(): Promise { } catch (error) { if (error instanceof UnauthorizedError) { console.log('🔐 OAuth required - handling authorization...'); - + // The provider will automatically fetch the auth code const authCode = await oauthProvider.getAuthCode(); - + // Complete the auth flow await transport.finishAuth(authCode); - // Now reconnect with auth + // Close the old transport + await transport.close(); + + // Create a new transport with the authenticated provider + transport = new StreamableHTTPClientTransport( + new URL(serverUrl), + { + authProvider: oauthProvider + } + ); + + // Connect with the new transport await client.connect(transport); console.log('✅ Successfully connected with authentication'); } else { @@ -73,6 +84,7 @@ async function main(): Promise { await client.listTools(); console.log('✅ Successfully listed tools') + await transport.close(); console.log('✅ Connection closed successfully'); diff --git a/auth-compat/src/cli/index.ts b/auth-compat/src/cli/index.ts index acadaf0fc..d5a3b9158 100644 --- a/auth-compat/src/cli/index.ts +++ b/auth-compat/src/cli/index.ts @@ -76,6 +76,10 @@ async function runSingleTest( const executable = commandParts[0]; const args = [...commandParts.slice(1), serverUrl]; + // Capture client output when not in verbose mode (verbose mode uses 'inherit') + let clientStdout = ''; + let clientStderr = ''; + // Run the client const clientProcess = spawn(executable, args, { stdio: verbose ? 'inherit' : 'pipe', @@ -83,6 +87,20 @@ async function runSingleTest( timeout }); + // Capture stdout/stderr when not in verbose mode + if (!verbose) { + if (clientProcess.stdout) { + clientProcess.stdout.on('data', (data) => { + clientStdout += data.toString(); + }); + } + if (clientProcess.stderr) { + clientProcess.stderr.on('data', (data) => { + clientStderr += data.toString(); + }); + } + } + // Wait for client to finish const clientExitCode = await new Promise((resolve, reject) => { let timedOut = false; @@ -128,7 +146,8 @@ async function runSingleTest( if (options.json) { console.log(JSON.stringify(report, null, 2)); } else { - printCompactReport(report, verbose ? behavior : null, verbose ? authServerTrace : null); + const clientOutput = { stdout: clientStdout, stderr: clientStderr }; + printCompactReport(report, verbose ? behavior : null, verbose ? authServerTrace : null, clientOutput); } // Stop server @@ -198,7 +217,7 @@ function printHttpTrace(traces: any[], label: string) { console.log(' ========================\n'); } -function printCompactReport(report: ComplianceReport, behavior?: any, authServerTrace?: any[]) { +function printCompactReport(report: ComplianceReport, behavior?: any, authServerTrace?: any[], clientOutput?: { stdout: string, stderr: string }) { const passed = report.overall_result === 'PASS'; const icon = passed ? '✅' : '❌'; @@ -293,7 +312,6 @@ function printCompactReport(report: ComplianceReport, behavior?: any, authServer console.log(''); }); console.log(' ========================\n'); - } // Show other behavior details @@ -302,6 +320,22 @@ function printCompactReport(report: ComplianceReport, behavior?: any, authServer delete summaryBehavior.httpTrace; // Don't repeat the trace console.log(' ' + JSON.stringify(summaryBehavior, null, 2).split('\n').join('\n ')); } + + // Show client output at the very end + // In verbose mode, output was shown directly via 'inherit', but we still captured it for non-verbose mode + if (clientOutput && (clientOutput.stdout || clientOutput.stderr)) { + if (clientOutput.stdout) { + console.log('\n ====== CLIENT STDOUT ======'); + console.log(' ' + clientOutput.stdout.split('\n').join('\n ')); + console.log(' ========================\n'); + } + + if (clientOutput.stderr) { + console.log('\n ====== CLIENT STDERR ======'); + console.log(' ' + clientOutput.stderr.split('\n').join('\n ')); + console.log(' ========================\n'); + } + } } function getStatusText(status: number): string { diff --git a/auth-compat/src/server/auth/index.ts b/auth-compat/src/server/auth/index.ts index e66f9672b..43e334f89 100644 --- a/auth-compat/src/server/auth/index.ts +++ b/auth-compat/src/server/auth/index.ts @@ -45,16 +45,6 @@ export class MockAuthServer implements HttpTraceCollector { // Capture all HTTP requests and responses this.app.use(createHttpTraceMiddleware(this)); - // Log all requests to auth server (optional - can be removed if not needed) - this.app.use((req, res, next) => { - console.log(`\n[AUTH SERVER] >>> HTTP ${req.method} ${req.url}`); - console.log('[AUTH SERVER] Headers:', JSON.stringify(req.headers, null, 2)); - if (req.body && Object.keys(req.body).length > 0) { - console.log('[AUTH SERVER] Body:', JSON.stringify(req.body, null, 2)); - } - next(); - }); - // OAuth2 authorization endpoint this.app.get('/authorize', (req: Request, res: Response) => { const { From beae835ceacfd35e88558818fcb4f40b3e347599 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 7 Aug 2025 14:57:21 +0100 Subject: [PATCH 11/27] log handling --- auth-compat/src/cli/index.ts | 4 ++-- auth-compat/src/server/auth/index.ts | 15 +++++++++++---- auth-compat/src/server/validation/index.ts | 19 +++++++++++++------ 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/auth-compat/src/cli/index.ts b/auth-compat/src/cli/index.ts index d5a3b9158..9c58df02c 100644 --- a/auth-compat/src/cli/index.ts +++ b/auth-compat/src/cli/index.ts @@ -61,7 +61,7 @@ async function runSingleTest( const verbose = options.verbose; // Start validation server - const server = new ValidationServer({ authRequired }); + const server = new ValidationServer({ authRequired }, verbose); try { const serverPort = await server.start(); @@ -146,7 +146,7 @@ async function runSingleTest( if (options.json) { console.log(JSON.stringify(report, null, 2)); } else { - const clientOutput = { stdout: clientStdout, stderr: clientStderr }; + const clientOutput = verbose ? { stdout: clientStdout, stderr: clientStderr } : null; printCompactReport(report, verbose ? behavior : null, verbose ? authServerTrace : null, clientOutput); } diff --git a/auth-compat/src/server/auth/index.ts b/auth-compat/src/server/auth/index.ts index 43e334f89..515b31bb9 100644 --- a/auth-compat/src/server/auth/index.ts +++ b/auth-compat/src/server/auth/index.ts @@ -29,18 +29,26 @@ export class MockAuthServer implements HttpTraceCollector { private server: Server | null = null; private port: number; public httpTrace: HttpTrace[] = []; + private verbose: boolean; // Store authorization requests for PKCE validation private authorizationRequests: Map = new Map(); - constructor(port: number = 3001) { + constructor(port: number = 3001, verbose: boolean = false) { this.port = port; + this.verbose = verbose; this.app = express(); this.app.use(express.json()); this.app.use(express.urlencoded({ extended: true })); this.setupRoutes(); } + private log(...args: any[]): void { + if (this.verbose) { + console.log('[AUTH SERVER]', ...args); + } + } + private setupRoutes(): void { // Capture all HTTP requests and responses this.app.use(createHttpTraceMiddleware(this)); @@ -87,7 +95,6 @@ export class MockAuthServer implements HttpTraceCollector { redirectUrl.searchParams.set('state', state); } - console.log(`Mock auth server: Redirecting to ${redirectUrl.toString()}`); res.redirect(redirectUrl.toString()); }); @@ -212,7 +219,7 @@ export class MockAuthServer implements HttpTraceCollector { async start(): Promise { return new Promise((resolve) => { this.server = this.app.listen(this.port, () => { - console.log(`Mock auth server started on port ${this.port}`); + this.log(`Started on port ${this.port}`); resolve(); }); }); @@ -222,7 +229,7 @@ export class MockAuthServer implements HttpTraceCollector { return new Promise((resolve) => { if (this.server) { this.server.close(() => { - console.log('Mock auth server stopped'); + this.log('Stopped'); resolve(); }); } else { diff --git a/auth-compat/src/server/validation/index.ts b/auth-compat/src/server/validation/index.ts index c09d8e1a5..04f9b08a3 100644 --- a/auth-compat/src/server/validation/index.ts +++ b/auth-compat/src/server/validation/index.ts @@ -15,8 +15,10 @@ export class ValidationServer { private clientBehavior: ClientBehavior; private config: ValidationServerConfig; public authServer: MockAuthServer | null = null; + private verbose: boolean = false; - constructor(config: ValidationServerConfig = {}) { + constructor(config: ValidationServerConfig = {}, verbose: boolean = false) { + this.verbose = verbose; this.config = { port: config.port || 0, // 0 means random port authRequired: config.authRequired || false, @@ -26,7 +28,7 @@ export class ValidationServer { // Start auth server if auth is required if (this.config.authRequired) { - this.authServer = new MockAuthServer(3001); + this.authServer = new MockAuthServer(3001, this.verbose); } this.app = express(); @@ -46,6 +48,12 @@ export class ValidationServer { this.setupRoutes(); } + private log(...args: any[]): void { + if (this.verbose) { + console.log('[VALIDATION SERVER]', ...args); + } + } + private createMCPServer(): McpServer { // Create a new MCP server instance for each request const mcpServer = new McpServer({ @@ -165,7 +173,7 @@ export class ValidationServer { }); } catch (error) { this.clientBehavior.errors.push(`Request error: ${error}`); - console.error('Error handling MCP request:', error); + this.log('Error handling MCP request:', error); if (!res.headersSent) { res.status(500).json({ jsonrpc: '2.0', @@ -181,7 +189,6 @@ export class ValidationServer { // MCP GET endpoint - not supported in stateless mode this.app.get('/mcp', async (req: Request, res: Response) => { - console.log('Received GET MCP request (not supported in stateless mode)'); res.writeHead(405).end(JSON.stringify({ jsonrpc: "2.0", error: { @@ -220,7 +227,7 @@ export class ValidationServer { return new Promise((resolve) => { this.server = this.app.listen(this.config.port, () => { const port = this.getPort(); - console.log(`Validation server started on port ${port} (stateless mode)`); + this.log(`Started on port ${port} (stateless mode)`); resolve(port); }); }); @@ -235,7 +242,7 @@ export class ValidationServer { return new Promise((resolve) => { if (this.server) { this.server.close(() => { - console.log('Validation server stopped'); + this.log('Stopped'); resolve(); }); } else { From 293443dc06f4791fb745c9316350ee463543cefb Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 7 Aug 2025 15:09:36 +0100 Subject: [PATCH 12/27] configurable metadata locations --- auth-compat/src/server/auth/index.ts | 33 ++++++++++++-- auth-compat/src/server/validation/index.ts | 53 ++++++++++++---------- auth-compat/src/types.ts | 4 +- 3 files changed, 62 insertions(+), 28 deletions(-) diff --git a/auth-compat/src/server/auth/index.ts b/auth-compat/src/server/auth/index.ts index 515b31bb9..37b2c2832 100644 --- a/auth-compat/src/server/auth/index.ts +++ b/auth-compat/src/server/auth/index.ts @@ -34,7 +34,7 @@ export class MockAuthServer implements HttpTraceCollector { // Store authorization requests for PKCE validation private authorizationRequests: Map = new Map(); - constructor(port: number = 3001, verbose: boolean = false) { + constructor(port: number = 0, verbose: boolean = false, public metadataLocation: string = '/.well-known/oauth-authorization-server') { this.port = port; this.verbose = verbose; this.app = express(); @@ -53,6 +53,21 @@ export class MockAuthServer implements HttpTraceCollector { // Capture all HTTP requests and responses this.app.use(createHttpTraceMiddleware(this)); + // OAuth Authorization Server Metadata endpoint + this.app.get(this.metadataLocation, (req: Request, res: Response) => { + const serverUrl = this.getUrl(); + res.json({ + issuer: serverUrl, + authorization_endpoint: `${serverUrl}/authorize`, + token_endpoint: `${serverUrl}/token`, + registration_endpoint: `${serverUrl}/register`, + response_types_supported: ['code'], + grant_types_supported: ['authorization_code', 'refresh_token'], + code_challenge_methods_supported: ['S256'], + token_endpoint_auth_methods_supported: ['none', 'client_secret_post'] + }); + }); + // OAuth2 authorization endpoint this.app.get('/authorize', (req: Request, res: Response) => { const { @@ -219,7 +234,8 @@ export class MockAuthServer implements HttpTraceCollector { async start(): Promise { return new Promise((resolve) => { this.server = this.app.listen(this.port, () => { - this.log(`Started on port ${this.port}`); + const actualPort = this.getPort(); + this.log(`Started on port ${actualPort}`); resolve(); }); }); @@ -239,7 +255,18 @@ export class MockAuthServer implements HttpTraceCollector { } getUrl(): string { - return `http://localhost:${this.port}`; + return `http://localhost:${this.getPort()}`; + } + + getPort(): number { + if (!this.server) { + throw new Error('Server not started'); + } + const address = this.server.address(); + if (typeof address === 'object' && address !== null) { + return address.port; + } + throw new Error('Unable to get server port'); } getHttpTrace(): HttpTrace[] { diff --git a/auth-compat/src/server/validation/index.ts b/auth-compat/src/server/validation/index.ts index 04f9b08a3..7701e5ca9 100644 --- a/auth-compat/src/server/validation/index.ts +++ b/auth-compat/src/server/validation/index.ts @@ -22,13 +22,13 @@ export class ValidationServer { this.config = { port: config.port || 0, // 0 means random port authRequired: config.authRequired || false, - metadataLocation: config.metadataLocation || '/.well-known/oauth-authorization-server', - mockAuthServerUrl: config.mockAuthServerUrl || 'http://localhost:3001' + metadataLocation: config.metadataLocation || '/.well-known/oauth-protected-resource', + authServerMetadataLocation: config.authServerMetadataLocation || '/.well-known/oauth-authorization-server' }; // Start auth server if auth is required if (this.config.authRequired) { - this.authServer = new MockAuthServer(3001, this.verbose); + this.authServer = new MockAuthServer(0, this.verbose, this.config.authServerMetadataLocation); } this.app = express(); @@ -97,32 +97,38 @@ export class ValidationServer { res.json({ status: 'ok' }); }); - let bearerMiddleware = (req, res, next) => { - next() - } - - // OAuth metadata endpoint (if auth is required) + // OAuth Protected Resource metadata endpoint (if auth is required) if (this.config.authRequired) { this.app.get(this.config.metadataLocation!, (req, res) => { this.clientBehavior.authMetadataRequested = true; + + // Get the actual port at request time + const serverPort = this.getPort(); + const authServerUrl = this.authServer ? this.authServer.getUrl() : ''; + + // Serve OAuth Protected Resource Metadata (RFC 9728) res.json({ - issuer: this.config.mockAuthServerUrl, - authorization_endpoint: `${this.config.mockAuthServerUrl}/authorize`, - token_endpoint: `${this.config.mockAuthServerUrl}/token`, - registration_endpoint: `${this.config.mockAuthServerUrl}/register`, - response_types_supported: ['code'], - grant_types_supported: ['authorization_code', 'refresh_token'], - code_challenge_methods_supported: ['S256'] + resource: `http://localhost:${serverPort}`, + authorization_servers: authServerUrl ? [authServerUrl] : [] }); }); + } + // Create bearer auth middleware if auth is required + let bearerMiddleware = async (req: Request, res: Response, next: any) => next(); + if (this.config.authRequired) { const tokenVerifier = new MockTokenVerifier(); - bearerMiddleware = requireBearerAuth({ - verifier: tokenVerifier, - requiredScopes: [], - // This is for www-authenticate, need to handle disabling this - resourceMetadataUrl: this.config.metadataLocation!, - }); + // We'll set the full URL dynamically in the middleware + bearerMiddleware = async (req: Request, res: Response, next: any) => { + const serverPort = this.getPort(); + const resourceMetadataUrl = `http://localhost:${serverPort}${this.config.metadataLocation}`; + const middleware = requireBearerAuth({ + verifier: tokenVerifier, + requiredScopes: [], + resourceMetadataUrl: resourceMetadataUrl + }); + return middleware(req, res, next); + }; } // MCP POST endpoint - stateless mode @@ -156,10 +162,10 @@ export class ValidationServer { sessionIdGenerator: undefined, // No sessions in stateless mode }; - // If auth is required, set the auth metadata URL + // If auth is required, set the protected resource metadata URL if (this.config.authRequired) { const serverPort = this.getPort(); - transportConfig.authMetadataUrl = `http://localhost:${serverPort}${this.config.metadataLocation}`; + transportConfig.resourceMetadataUrl = `http://localhost:${serverPort}${this.config.metadataLocation}`; } const transport = new StreamableHTTPServerTransport(transportConfig); @@ -222,6 +228,7 @@ export class ValidationServer { // Start auth server first if needed if (this.authServer) { await this.authServer.start(); + this.log(`Auth server started at ${this.authServer.getUrl()}`); } return new Promise((resolve) => { diff --git a/auth-compat/src/types.ts b/auth-compat/src/types.ts index bfb3ed217..4d54c1431 100644 --- a/auth-compat/src/types.ts +++ b/auth-compat/src/types.ts @@ -43,6 +43,6 @@ export interface ClientBehavior { export interface ValidationServerConfig { port?: number; authRequired?: boolean; - metadataLocation?: string; - mockAuthServerUrl?: string; + metadataLocation?: string; // Location for protected resource metadata + authServerMetadataLocation?: string; // Location for auth server metadata (passed to mock auth server) } \ No newline at end of file From 22fe82ca155a9610ef8d46aaa2a559709db0e4f7 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 7 Aug 2025 15:29:05 +0100 Subject: [PATCH 13/27] fixup trace logic to be shareable --- auth-compat/src/cli/index.ts | 179 +++-------------------- auth-compat/src/middleware/http-trace.ts | 92 +++++++++++- 2 files changed, 109 insertions(+), 162 deletions(-) diff --git a/auth-compat/src/cli/index.ts b/auth-compat/src/cli/index.ts index 9c58df02c..f19d93928 100644 --- a/auth-compat/src/cli/index.ts +++ b/auth-compat/src/cli/index.ts @@ -3,7 +3,8 @@ import { Command } from 'commander'; import { spawn } from 'child_process'; import { ValidationServer } from '../server/validation/index.js'; -import { ComplianceReport } from '../types.js'; +import { ComplianceReport, HttpTrace } from '../types.js'; +import { displayTraces } from '../middleware/http-trace.js'; const program = new Command(); @@ -82,23 +83,21 @@ async function runSingleTest( // Run the client const clientProcess = spawn(executable, args, { - stdio: verbose ? 'inherit' : 'pipe', + stdio: 'pipe', shell: true, timeout }); - // Capture stdout/stderr when not in verbose mode - if (!verbose) { - if (clientProcess.stdout) { - clientProcess.stdout.on('data', (data) => { - clientStdout += data.toString(); - }); - } - if (clientProcess.stderr) { - clientProcess.stderr.on('data', (data) => { - clientStderr += data.toString(); - }); - } + // Capture stdout/stderr + if (clientProcess.stdout) { + clientProcess.stdout.on('data', (data) => { + clientStdout += data.toString(); + }); + } + if (clientProcess.stderr) { + clientProcess.stderr.on('data', (data) => { + clientStderr += data.toString(); + }); } // Wait for client to finish @@ -146,8 +145,8 @@ async function runSingleTest( if (options.json) { console.log(JSON.stringify(report, null, 2)); } else { - const clientOutput = verbose ? { stdout: clientStdout, stderr: clientStderr } : null; - printCompactReport(report, verbose ? behavior : null, verbose ? authServerTrace : null, clientOutput); + const clientOutput = { stdout: clientStdout, stderr: clientStderr }; + printCompactReport(report, verbose ? behavior : null, verbose ? authServerTrace : undefined, clientOutput); } // Stop server @@ -164,60 +163,7 @@ async function runSingleTest( } } -function printHttpTrace(traces: any[], label: string) { - console.log(`\n ====== ${label} ======`); - traces.forEach((trace: any, index: number) => { - console.log(`\n --- Request #${index + 1} ---`); - - // Request line - console.log(` ${trace.method} ${trace.url} HTTP/1.1`); - - // Request headers - if (trace.headers) { - Object.entries(trace.headers).forEach(([key, value]) => { - console.log(` ${key}: ${value}`); - }); - } - - // Request body - if (trace.body) { - console.log(''); - const bodyStr = typeof trace.body === 'string' ? trace.body : JSON.stringify(trace.body); - console.log(` ${bodyStr}`); - } - - // Response - if (trace.response) { - console.log(`\n HTTP/1.1 ${trace.response.status} ${getStatusText(trace.response.status)}`); - - // Response headers - if (trace.response.headers) { - Object.entries(trace.response.headers).forEach(([key, value]) => { - console.log(` ${key}: ${value}`); - }); - } - - // Response body - if (trace.response.body) { - console.log(''); - const bodyStr = typeof trace.response.body === 'string' - ? trace.response.body - : JSON.stringify(trace.response.body); - - // Truncate very long responses - if (bodyStr.length > 1000) { - console.log(` ${bodyStr.substring(0, 1000)}... [truncated]`); - } else { - console.log(` ${bodyStr}`); - } - } - } - console.log(''); - }); - console.log(' ========================\n'); -} - -function printCompactReport(report: ComplianceReport, behavior?: any, authServerTrace?: any[], clientOutput?: { stdout: string, stderr: string }) { +function printCompactReport(report: ComplianceReport, behavior?: any, authServerTrace?: HttpTrace[], clientOutput?: { stdout: string, stderr: string }) { const passed = report.overall_result === 'PASS'; const icon = passed ? '✅' : '❌'; @@ -239,80 +185,7 @@ function printCompactReport(report: ComplianceReport, behavior?: any, authServer // Show HTTP trace and detailed behavior in verbose mode if (behavior) { - // Collect all traces and interleave them by timestamp - const allTraces: any[] = []; - - // Add validation server traces with source label - if (behavior.httpTrace && behavior.httpTrace.length > 0) { - behavior.httpTrace.forEach((trace: any) => { - allTraces.push({ ...trace, source: 'VALIDATION' }); - }); - } - - // Add auth server traces with source label - if (authServerTrace && authServerTrace.length > 0) { - authServerTrace.forEach((trace: any) => { - allTraces.push({ ...trace, source: 'AUTH' }); - }); - } - - // Sort all traces by timestamp for interleaved view - if (allTraces.length > 0) { - allTraces.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()); - - // Print interleaved traces - console.log('\n ====== INTERLEAVED HTTP TRACE ======'); - allTraces.forEach((trace: any, index: number) => { - console.log(`\n --- [${trace.source}] Request #${index + 1} ---`); - console.log(` Timestamp: ${trace.timestamp}`); - - // Request line - console.log(` ${trace.method} ${trace.url} HTTP/1.1`); - - // Request headers - if (trace.headers) { - Object.entries(trace.headers).forEach(([key, value]) => { - console.log(` ${key}: ${value}`); - }); - } - - // Request body - if (trace.body) { - console.log(''); - const bodyStr = typeof trace.body === 'string' ? trace.body : JSON.stringify(trace.body); - console.log(` ${bodyStr}`); - } - - // Response - if (trace.response) { - console.log(`\n HTTP/1.1 ${trace.response.status} ${getStatusText(trace.response.status)}`); - - // Response headers - if (trace.response.headers) { - Object.entries(trace.response.headers).forEach(([key, value]) => { - console.log(` ${key}: ${value}`); - }); - } - - // Response body - if (trace.response.body) { - console.log(''); - const bodyStr = typeof trace.response.body === 'string' - ? trace.response.body - : JSON.stringify(trace.response.body); - - // Truncate very long responses - if (bodyStr.length > 1000) { - console.log(` ${bodyStr.substring(0, 1000)}... [truncated]`); - } else { - console.log(` ${bodyStr}`); - } - } - } - console.log(''); - }); - console.log(' ========================\n'); - } + displayTraces(behavior.httpTrace, authServerTrace || []) // Show other behavior details console.log(' Client Behavior Summary:'); @@ -329,7 +202,7 @@ function printCompactReport(report: ComplianceReport, behavior?: any, authServer console.log(' ' + clientOutput.stdout.split('\n').join('\n ')); console.log(' ========================\n'); } - + if (clientOutput.stderr) { console.log('\n ====== CLIENT STDERR ======'); console.log(' ' + clientOutput.stderr.split('\n').join('\n ')); @@ -338,20 +211,6 @@ function printCompactReport(report: ComplianceReport, behavior?: any, authServer } } -function getStatusText(status: number): string { - const statusTexts: Record = { - 200: 'OK', - 201: 'Created', - 202: 'Accepted', - 302: 'Found', - 400: 'Bad Request', - 401: 'Unauthorized', - 403: 'Forbidden', - 404: 'Not Found', - 405: 'Method Not Allowed', - 500: 'Internal Server Error' - }; - return statusTexts[status] || ''; -} + program.parse(); diff --git a/auth-compat/src/middleware/http-trace.ts b/auth-compat/src/middleware/http-trace.ts index 487d20827..c602faabb 100644 --- a/auth-compat/src/middleware/http-trace.ts +++ b/auth-compat/src/middleware/http-trace.ts @@ -35,7 +35,7 @@ export function createHttpTraceMiddleware(collector: HttpTraceCollector) { } const body = Buffer.concat(chunks).toString('utf8'); - + // Capture response details trace.response = { status: res.statusCode, @@ -50,4 +50,92 @@ export function createHttpTraceMiddleware(collector: HttpTraceCollector) { next(); }; -} \ No newline at end of file +} + +export function displayTraces(serverTrace: HttpTrace[], authServerTrace: HttpTrace[]) { + // Collect all traces and interleave them by timestamp + const allTraces: any[] = []; + + serverTrace.forEach((trace: any) => { + allTraces.push({ ...trace, source: 'MCP SERVER' }); + }); + + authServerTrace.forEach((trace: any) => { + allTraces.push({ ...trace, source: 'AUTH' }); + }); + + // Sort all traces by timestamp for interleaved view + if (allTraces.length > 0) { + allTraces.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()); + + // Print interleaved traces + console.log('\n ====== INTERLEAVED HTTP TRACE ======'); + allTraces.forEach((trace: any, index: number) => { + console.log(`\n --- [${trace.source}] Request #${index + 1} ---`); + console.log(` Timestamp: ${trace.timestamp}`); + + // Request line + console.log(` ${trace.method} ${trace.url} HTTP/1.1`); + + // Request headers + if (trace.headers) { + Object.entries(trace.headers).forEach(([key, value]) => { + console.log(` ${key}: ${value}`); + }); + } + + // Request body + if (trace.body) { + console.log(''); + const bodyStr = typeof trace.body === 'string' ? trace.body : JSON.stringify(trace.body); + console.log(` ${bodyStr}`); + } + + // Response + if (trace.response) { + console.log(`\n HTTP/1.1 ${trace.response.status} ${getStatusText(trace.response.status)}`); + + // Response headers + if (trace.response.headers) { + Object.entries(trace.response.headers).forEach(([key, value]) => { + console.log(` ${key}: ${value}`); + }); + } + + // Response body + if (trace.response.body) { + console.log(''); + const bodyStr = typeof trace.response.body === 'string' + ? trace.response.body + : JSON.stringify(trace.response.body); + + // Truncate very long responses + if (bodyStr.length > 1000) { + console.log(` ${bodyStr.substring(0, 1000)}... [truncated]`); + } else { + console.log(` ${bodyStr}`); + } + } + } + console.log(''); + }); + console.log(' ========================\n'); + } +} + + +function getStatusText(status: number): string { + const statusTexts: Record = { + 200: 'OK', + 201: 'Created', + 202: 'Accepted', + 302: 'Found', + 400: 'Bad Request', + 401: 'Unauthorized', + 403: 'Forbidden', + 404: 'Not Found', + 405: 'Method Not Allowed', + 500: 'Internal Server Error' + }; + return statusTexts[status] || ''; +} From 28e4547866f838e4611c1297a0906caee8baa95a Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 7 Aug 2025 15:43:01 +0100 Subject: [PATCH 14/27] mostly working --- auth-compat/src/server/validation/index.ts | 7 +++++-- auth-compat/src/types.ts | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/auth-compat/src/server/validation/index.ts b/auth-compat/src/server/validation/index.ts index 7701e5ca9..799ced1aa 100644 --- a/auth-compat/src/server/validation/index.ts +++ b/auth-compat/src/server/validation/index.ts @@ -23,7 +23,8 @@ export class ValidationServer { port: config.port || 0, // 0 means random port authRequired: config.authRequired || false, metadataLocation: config.metadataLocation || '/.well-known/oauth-protected-resource', - authServerMetadataLocation: config.authServerMetadataLocation || '/.well-known/oauth-authorization-server' + authServerMetadataLocation: config.authServerMetadataLocation || '/.well-known/oauth-authorization-server', + includeWwwAuthenticate: config.includeWwwAuthenticate !== false // Default true }; // Start auth server if auth is required @@ -121,7 +122,9 @@ export class ValidationServer { // We'll set the full URL dynamically in the middleware bearerMiddleware = async (req: Request, res: Response, next: any) => { const serverPort = this.getPort(); - const resourceMetadataUrl = `http://localhost:${serverPort}${this.config.metadataLocation}`; + const resourceMetadataUrl = this.config.includeWwwAuthenticate + ? `http://localhost:${serverPort}${this.config.metadataLocation}` + : undefined; const middleware = requireBearerAuth({ verifier: tokenVerifier, requiredScopes: [], diff --git a/auth-compat/src/types.ts b/auth-compat/src/types.ts index 4d54c1431..7a049b564 100644 --- a/auth-compat/src/types.ts +++ b/auth-compat/src/types.ts @@ -45,4 +45,5 @@ export interface ValidationServerConfig { authRequired?: boolean; metadataLocation?: string; // Location for protected resource metadata authServerMetadataLocation?: string; // Location for auth server metadata (passed to mock auth server) + includeWwwAuthenticate?: boolean; // Whether to include resource_metadata in WWW-Authenticate header } \ No newline at end of file From 4b1b489577a3b7c616e545ef3c0acf13b3d722d1 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 7 Aug 2025 15:52:26 +0100 Subject: [PATCH 15/27] new runner --- auth-compat/package.json | 5 +- auth-compat/src/cli/test-runner.ts | 162 ++++++++++++ auth-compat/src/test-framework/index.ts | 260 ++++++++++++++++++++ auth-compat/test/all-tests.ts | 168 +++++++++++++ auth-compat/test/metadata-locations.test.ts | 157 ++++++++++++ 5 files changed, 750 insertions(+), 2 deletions(-) create mode 100644 auth-compat/src/cli/test-runner.ts create mode 100644 auth-compat/src/test-framework/index.ts create mode 100644 auth-compat/test/all-tests.ts create mode 100644 auth-compat/test/metadata-locations.test.ts diff --git a/auth-compat/package.json b/auth-compat/package.json index 5143983bb..ec3cf005f 100644 --- a/auth-compat/package.json +++ b/auth-compat/package.json @@ -11,7 +11,8 @@ "build": "tsc", "dev": "tsx src/cli/index.ts", "test-validation-server": "tsx src/test-validation-server.ts", - "cli": "tsx src/cli/index.ts" + "cli": "tsx src/cli/index.ts", + "test": "tsx src/cli/test-runner.ts" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.0.0", @@ -25,4 +26,4 @@ "tsx": "^4.0.0", "typescript": "^5.0.0" } -} \ No newline at end of file +} diff --git a/auth-compat/src/cli/test-runner.ts b/auth-compat/src/cli/test-runner.ts new file mode 100644 index 000000000..6d3537d0c --- /dev/null +++ b/auth-compat/src/cli/test-runner.ts @@ -0,0 +1,162 @@ +#!/usr/bin/env node + +import { Command } from 'commander'; +import { ComplianceTestRunner, TestSuite } from '../test-framework/index.js'; + +const program = new Command(); + +program + .name('mcp-auth-test') + .description('MCP Authorization Compliance Test Runner') + .version('1.0.0'); + +program + .requiredOption('--command ', 'Command to run the client (should accept server URL as argument)') + .option('--suite ', 'Run specific test suite (basic, oauth, metadata, behavior, all)', 'all') + .option('--timeout ', 'Timeout for client execution in milliseconds', '30000') + .option('--json', 'Output results as JSON', false) + .option('--verbose', 'Verbose output', false) + .action(async (clientCommand: string, options) => { + await runTests(clientCommand, options); + }); + +// Test suite definitions +const basicSuite: TestSuite = { + name: 'Basic Compliance', + description: 'Tests basic MCP protocol compliance without authentication', + scenarios: [ + { + name: 'Basic MCP Connection', + description: 'Client can connect and list tools without auth', + serverConfig: { + authRequired: false + }, + expectedResult: 'PASS' + } + ] +}; + +const oauthSuite: TestSuite = { + name: 'OAuth Compliance', + description: 'Tests OAuth2/OIDC authorization flow', + scenarios: [ + { + name: 'Standard OAuth Flow', + description: 'Client completes OAuth flow with default settings', + serverConfig: { + authRequired: true + }, + expectedResult: 'PASS' + } + ] +}; + +const metadataLocationSuite: TestSuite = { + name: 'Metadata Location Tests', + description: 'Tests different OAuth protected resource metadata locations', + scenarios: [ + { + name: 'Standard location with WWW-Authenticate', + serverConfig: { + authRequired: true, + metadataLocation: '/.well-known/oauth-protected-resource', + includeWwwAuthenticate: true + }, + expectedResult: 'PASS' + }, + { + name: 'Non-standard location with WWW-Authenticate', + description: 'Custom metadata path advertised via WWW-Authenticate header', + serverConfig: { + authRequired: true, + metadataLocation: '/custom/oauth/metadata', + includeWwwAuthenticate: true + }, + expectedResult: 'PASS' + }, + { + name: 'Nested well-known path with WWW-Authenticate', + serverConfig: { + authRequired: true, + metadataLocation: '/.well-known/oauth-protected-resource/mcp', + includeWwwAuthenticate: true + }, + expectedResult: 'PASS' + }, + { + name: 'Standard location without WWW-Authenticate', + description: 'Client should find metadata at standard location', + serverConfig: { + authRequired: true, + metadataLocation: '/.well-known/oauth-protected-resource', + includeWwwAuthenticate: false + }, + expectedResult: 'PASS' + }, + { + name: 'Non-standard location without WWW-Authenticate', + description: 'Client cannot find metadata without header hint', + serverConfig: { + authRequired: true, + metadataLocation: '/custom/oauth/metadata', + includeWwwAuthenticate: false + }, + expectedResult: 'FAIL' // Should fail - client won't find non-standard location + } + ] +}; + +const behaviorSuite: TestSuite = { + name: 'Client Behavior Validation', + description: 'Tests specific client behaviors', + scenarios: [ + { + name: 'Client requests metadata', + serverConfig: { + authRequired: true + }, + expectedResult: 'PASS', + validateBehavior: (behavior) => { + const errors = []; + if (!behavior.authMetadataRequested) { + errors.push('Client did not request OAuth metadata'); + } + if (!behavior.initialized) { + errors.push('Client did not complete initialization'); + } + return errors; + } + } + ] +}; + +async function runTests(options: any) { + const verbose = options.verbose; + const runner = new ComplianceTestRunner(options.command, { verbose, json: options.json }); + + console.log('Running MCP compliance tests...'); + + // Select which suites to run + let suitesToRun: TestSuite[] = []; + + const suiteMap: Record = { + 'basic': basicSuite, + 'oauth': oauthSuite, + 'metadata': metadataLocationSuite, + 'behavior': behaviorSuite + }; + + if (options.suite === 'all') { + suitesToRun = [basicSuite, oauthSuite, metadataLocationSuite, behaviorSuite]; + } else if (suiteMap[options.suite]) { + suitesToRun = [suiteMap[options.suite]]; + } else { + console.error(`Unknown suite: ${options.suite}`); + console.error(`Available suites: ${Object.keys(suiteMap).join(', ')}, all`); + process.exit(1); + } + + await runner.runSuites(suitesToRun); +} + +program.parse(); diff --git a/auth-compat/src/test-framework/index.ts b/auth-compat/src/test-framework/index.ts new file mode 100644 index 000000000..14b4a6358 --- /dev/null +++ b/auth-compat/src/test-framework/index.ts @@ -0,0 +1,260 @@ +import { spawn, ChildProcess } from 'child_process'; +import { ValidationServer } from '../server/validation/index.js'; +import { ValidationServerConfig, ComplianceReport, TestResult, HttpTrace } from '../types.js'; +import { displayTraces } from '../middleware/http-trace.js'; + +export interface TestScenario { + name: string; + description?: string; + serverConfig: ValidationServerConfig; + expectedResult: 'PASS' | 'FAIL'; + validateBehavior?: (behavior: any) => string[]; // Returns array of error messages + timeout?: number; +} + +export interface TestSuite { + name: string; + description?: string; + scenarios: TestScenario[]; +} + +export class ComplianceTestRunner { + private verbose: boolean; + private json: boolean; + private clientCommand: string; + + constructor(clientCommand: string, options: { verbose?: boolean; json?: boolean } = {}) { + this.clientCommand = clientCommand; + this.verbose = options.verbose || false; + this.json = options.json || false; + } + + private log(...args: any[]): void { + if (!this.json) { + console.log(...args); + } + } + + private logVerbose(...args: any[]): void { + if (this.verbose && !this.json) { + console.log(...args); + } + } + + async runScenario(scenario: TestScenario): Promise<{ passed: boolean; report?: ComplianceReport; error?: string }> { + const server = new ValidationServer(scenario.serverConfig, this.verbose); + const timeout = scenario.timeout || 30000; + + try { + const serverPort = await server.start(); + const serverUrl = `http://localhost:${serverPort}/mcp`; + + this.logVerbose(` Server started at: ${serverUrl}`); + if (scenario.serverConfig.metadataLocation) { + this.logVerbose(` Metadata URL: http://localhost:${serverPort}${scenario.serverConfig.metadataLocation}`); + } + + // Parse and run the client command + const commandParts = this.clientCommand.split(' '); + const executable = commandParts[0]; + const args = [...commandParts.slice(1), serverUrl]; + + // Capture client output + let clientStdout = ''; + let clientStderr = ''; + + const clientProcess = spawn(executable, args, { + stdio: 'pipe', + shell: true, + timeout + }); + + clientProcess.stdout?.on('data', (data) => { + clientStdout += data.toString(); + }); + clientProcess.stderr?.on('data', (data) => { + clientStderr += data.toString(); + }); + + // Wait for client to finish + const clientExitCode = await new Promise((resolve, reject) => { + let timedOut = false; + + const timeoutHandle = setTimeout(() => { + timedOut = true; + clientProcess.kill(); + reject(new Error(`Timeout (${timeout}ms)`)); + }, timeout); + + clientProcess.on('exit', (code) => { + clearTimeout(timeoutHandle); + if (!timedOut) { + resolve(code || 0); + } + }); + + clientProcess.on('error', (error) => { + clearTimeout(timeoutHandle); + reject(error); + }); + }); + + // Get validation results + const results = server.getValidationResults(); + const behavior = server.getClientBehavior(); + const authServerTrace = scenario.serverConfig.authRequired && server.authServer + ? server.authServer.getHttpTrace() + : []; + + // Validate behavior if custom validator provided + let behaviorErrors: string[] = []; + if (scenario.validateBehavior) { + behaviorErrors = scenario.validateBehavior(behavior); + } + + // Generate report + const report: ComplianceReport = { + overall_result: results.every(r => r.result === 'PASS') && + clientExitCode === 0 && + behaviorErrors.length === 0 ? 'PASS' : 'FAIL', + test_suite: scenario.name, + timestamp: new Date().toISOString(), + client_command: this.clientCommand, + tests_passed: results.filter(r => r.result === 'PASS').length, + tests_failed: results.filter(r => r.result === 'FAIL').length + behaviorErrors.length, + tests: [ + ...results, + ...behaviorErrors.map(error => ({ + name: 'behavior_validation', + result: 'FAIL' as const, + details: {}, + errors: [error] + })) + ] + }; + + await server.stop(); + + const passed = report.overall_result === scenario.expectedResult; + + if (this.verbose && !this.json) { + this.printDetailedReport(report, behavior, authServerTrace, { + stdout: clientStdout, + stderr: clientStderr + }); + } + + return { passed, report }; + + } catch (error: any) { + await server.stop().catch(() => {}); + return { + passed: false, + error: error.message || error + }; + } + } + + async runSuite(suite: TestSuite): Promise { + this.log(`\nRunning test suite: ${suite.name}`); + if (suite.description) { + this.log(`Description: ${suite.description}`); + } + this.log('='.repeat(60)); + + const results: Array<{ scenario: TestScenario; passed: boolean; error?: string }> = []; + + for (const scenario of suite.scenarios) { + this.log(`\n▶ ${scenario.name}`); + if (scenario.description) { + this.logVerbose(` ${scenario.description}`); + } + + const result = await this.runScenario(scenario); + results.push({ scenario, passed: result.passed, error: result.error }); + + if (result.passed) { + this.log(` ✅ PASS`); + } else { + this.log(` ❌ FAIL${result.error ? `: ${result.error}` : ''}`); + } + } + + const passed = results.filter(r => r.passed).length; + const failed = results.filter(r => !r.passed).length; + + this.log('\n' + '='.repeat(60)); + this.log(`Suite Summary: ${suite.name}`); + this.log(` Passed: ${passed}/${results.length}`); + this.log(` Failed: ${failed}/${results.length}`); + + return failed === 0; + } + + async runSuites(suites: TestSuite[]): Promise { + const allResults: boolean[] = []; + + for (const suite of suites) { + const passed = await this.runSuite(suite); + allResults.push(passed); + } + + const totalSuitesPassed = allResults.filter(r => r).length; + const totalSuitesFailed = allResults.filter(r => !r).length; + + this.log('\n' + '='.repeat(60)); + this.log('OVERALL SUMMARY'); + this.log('='.repeat(60)); + this.log(`Total Suites Passed: ${totalSuitesPassed}/${allResults.length}`); + this.log(`Total Suites Failed: ${totalSuitesFailed}/${allResults.length}`); + + if (totalSuitesFailed === 0) { + this.log('\n✅ All test suites passed!'); + process.exit(0); + } else { + this.log('\n❌ Some test suites failed'); + process.exit(1); + } + } + + private printDetailedReport( + report: ComplianceReport, + behavior: any, + authServerTrace: HttpTrace[], + clientOutput: { stdout: string; stderr: string } + ): void { + // This is similar to the CLI's printCompactReport but can be customized + const passed = report.overall_result === 'PASS'; + const icon = passed ? '✅' : '❌'; + + this.log(` ${icon} Result: ${report.overall_result}`); + + if (!passed) { + report.tests.forEach(test => { + if (test.result === 'FAIL') { + this.log(` ❌ ${test.name}`); + if (test.errors && test.errors.length > 0) { + test.errors.forEach(error => { + this.log(` - ${error}`); + }); + } + } + }); + } + + // Show traces and outputs in verbose mode + if (this.verbose) { + displayTraces(behavior.httpTrace || [], authServerTrace) + + if (clientOutput.stdout || clientOutput.stderr) { + this.log('\n [Client Output]'); + if (clientOutput.stdout) { + this.log(' STDOUT:', clientOutput.stdout); + } + if (clientOutput.stderr) { + this.log(' STDERR:', clientOutput.stderr); + } + } + } + } +} diff --git a/auth-compat/test/all-tests.ts b/auth-compat/test/all-tests.ts new file mode 100644 index 000000000..5060aac14 --- /dev/null +++ b/auth-compat/test/all-tests.ts @@ -0,0 +1,168 @@ +#!/usr/bin/env npx tsx + +import { ComplianceTestRunner, TestSuite } from '../src/test-framework/index.js'; + +// Basic compliance tests +const basicSuite: TestSuite = { + name: 'Basic Compliance', + description: 'Tests basic MCP protocol compliance without authentication', + scenarios: [ + { + name: 'Basic MCP Connection', + description: 'Client can connect and list tools without auth', + serverConfig: { + authRequired: false + }, + clientCommand: 'npx tsx examples/typescript-client/test-client.ts', + expectedResult: 'PASS' + } + ] +}; + +// OAuth compliance tests +const oauthSuite: TestSuite = { + name: 'OAuth Compliance', + description: 'Tests OAuth2/OIDC authorization flow', + scenarios: [ + { + name: 'Standard OAuth Flow', + description: 'Client completes OAuth flow with default settings', + serverConfig: { + authRequired: true + }, + clientCommand: 'npx tsx examples/typescript-client/test-client.ts', + expectedResult: 'PASS' + } + ] +}; + +// Metadata location tests +const metadataLocationSuite: TestSuite = { + name: 'Metadata Location Tests', + description: 'Tests different OAuth protected resource metadata locations', + scenarios: [ + { + name: 'Standard location with WWW-Authenticate', + serverConfig: { + authRequired: true, + metadataLocation: '/.well-known/oauth-protected-resource', + includeWwwAuthenticate: true + }, + clientCommand: 'npx tsx examples/typescript-client/test-client.ts', + expectedResult: 'PASS' + }, + { + name: 'Non-standard location with WWW-Authenticate', + description: 'Custom metadata path advertised via WWW-Authenticate header', + serverConfig: { + authRequired: true, + metadataLocation: '/custom/oauth/metadata', + includeWwwAuthenticate: true + }, + clientCommand: 'npx tsx examples/typescript-client/test-client.ts', + expectedResult: 'PASS' + }, + { + name: 'Nested well-known path with WWW-Authenticate', + serverConfig: { + authRequired: true, + metadataLocation: '/.well-known/oauth-protected-resource/mcp', + includeWwwAuthenticate: true + }, + clientCommand: 'npx tsx examples/typescript-client/test-client.ts', + expectedResult: 'PASS' + }, + { + name: 'Standard location without WWW-Authenticate', + description: 'Client should find metadata at standard location', + serverConfig: { + authRequired: true, + metadataLocation: '/.well-known/oauth-protected-resource', + includeWwwAuthenticate: false + }, + clientCommand: 'npx tsx examples/typescript-client/test-client.ts', + expectedResult: 'PASS' + }, + { + name: 'Non-standard location without WWW-Authenticate', + description: 'Client cannot find metadata without header hint', + serverConfig: { + authRequired: true, + metadataLocation: '/custom/oauth/metadata', + includeWwwAuthenticate: false + }, + clientCommand: 'npx tsx examples/typescript-client/test-client.ts', + expectedResult: 'FAIL' // Should fail - client won't find non-standard location + } + ] +}; + +// Behavior validation tests +const behaviorSuite: TestSuite = { + name: 'Client Behavior Validation', + description: 'Tests specific client behaviors', + scenarios: [ + { + name: 'Client requests metadata', + serverConfig: { + authRequired: true + }, + clientCommand: 'npx tsx examples/typescript-client/test-client.ts', + expectedResult: 'PASS', + validateBehavior: (behavior) => { + const errors = []; + if (!behavior.authMetadataRequested) { + errors.push('Client did not request OAuth metadata'); + } + if (!behavior.initialized) { + errors.push('Client did not complete initialization'); + } + return errors; + } + } + ] +}; + +// Main test runner +async function main() { + const args = process.argv.slice(2); + const verbose = args.includes('--verbose') || args.includes('-v'); + const json = args.includes('--json'); + const suite = args.find(arg => arg.startsWith('--suite='))?.split('=')[1]; + + const runner = new ComplianceTestRunner({ verbose, json }); + + // Select which suites to run + let suitesToRun: TestSuite[] = []; + + if (suite) { + // Run specific suite + const suiteMap: Record = { + 'basic': basicSuite, + 'oauth': oauthSuite, + 'metadata': metadataLocationSuite, + 'behavior': behaviorSuite + }; + + if (suiteMap[suite]) { + suitesToRun = [suiteMap[suite]]; + } else { + console.error(`Unknown suite: ${suite}`); + console.error(`Available suites: ${Object.keys(suiteMap).join(', ')}`); + process.exit(1); + } + } else { + // Run all suites + suitesToRun = [basicSuite, oauthSuite, metadataLocationSuite, behaviorSuite]; + } + + console.log('MCP Authorization Compliance Test Suite'); + console.log('=' .repeat(60)); + + await runner.runSuites(suitesToRun); +} + +main().catch((error) => { + console.error('Test runner error:', error); + process.exit(1); +}); \ No newline at end of file diff --git a/auth-compat/test/metadata-locations.test.ts b/auth-compat/test/metadata-locations.test.ts new file mode 100644 index 000000000..09ee9cc48 --- /dev/null +++ b/auth-compat/test/metadata-locations.test.ts @@ -0,0 +1,157 @@ +#!/usr/bin/env npx tsx + +import { spawn } from 'child_process'; +import { ValidationServer } from '../src/server/validation/index.js'; + +interface TestCase { + name: string; + metadataLocation: string; + includeWwwAuthenticate: boolean; + expectedSuccess: boolean; +} + +const testCases: TestCase[] = [ + { + name: 'Standard location with WWW-Authenticate', + metadataLocation: '/.well-known/oauth-protected-resource', + includeWwwAuthenticate: true, + expectedSuccess: true + }, + { + name: 'Non-standard location with WWW-Authenticate', + metadataLocation: '/custom/metadata/location', + includeWwwAuthenticate: true, + expectedSuccess: true + }, + { + name: 'Nested well-known path with WWW-Authenticate', + metadataLocation: '/.well-known/oauth-protected-resource/mcp', + includeWwwAuthenticate: true, + expectedSuccess: true + }, + { + name: 'Standard location without WWW-Authenticate', + metadataLocation: '/.well-known/oauth-protected-resource', + includeWwwAuthenticate: false, + expectedSuccess: true + }, + { + name: 'Nested well-known path without WWW-Authenticate', + metadataLocation: '/.well-known/oauth-protected-resource/mcp/v1', + includeWwwAuthenticate: false, + expectedSuccess: true + } +]; + +async function runTest(testCase: TestCase): Promise { + console.log(`\nTesting: ${testCase.name}`); + console.log(` Metadata location: ${testCase.metadataLocation}`); + console.log(` Include WWW-Authenticate: ${testCase.includeWwwAuthenticate}`); + + const server = new ValidationServer({ + authRequired: true, + metadataLocation: testCase.metadataLocation, + includeWwwAuthenticate: testCase.includeWwwAuthenticate + }, false); + + try { + const serverPort = await server.start(); + const serverUrl = `http://localhost:${serverPort}/mcp`; + + console.log(` Server URL: ${serverUrl}`); + console.log(` Metadata URL: http://localhost:${serverPort}${testCase.metadataLocation}`); + + // Test if metadata endpoint is accessible + const metadataResponse = await fetch(`http://localhost:${serverPort}${testCase.metadataLocation}`); + if (!metadataResponse.ok) { + throw new Error(`Metadata endpoint returned ${metadataResponse.status}`); + } + + const metadata = await metadataResponse.json(); + console.log(` Metadata response:`, JSON.stringify(metadata, null, 2)); + + // Run the client + const clientProcess = spawn('npx', ['tsx', 'examples/typescript-client/test-client.ts', serverUrl], { + stdio: 'pipe', + shell: true, + timeout: 30000 + }); + + let stdout = ''; + let stderr = ''; + + clientProcess.stdout?.on('data', (data) => { + stdout += data.toString(); + }); + + clientProcess.stderr?.on('data', (data) => { + stderr += data.toString(); + }); + + // Wait for client to finish + const clientExitCode = await new Promise((resolve) => { + const timeoutHandle = setTimeout(() => { + clientProcess.kill(); + resolve(1); + }, 30000); + + clientProcess.on('exit', (code) => { + clearTimeout(timeoutHandle); + resolve(code || 0); + }); + }); + + await server.stop(); + + const success = clientExitCode === 0; + const expectedResult = testCase.expectedSuccess; + + if (success === expectedResult) { + console.log(` ✅ Test passed (exit code: ${clientExitCode})`); + return true; + } else { + console.log(` ❌ Test failed (exit code: ${clientExitCode}, expected: ${expectedResult ? 0 : 'non-zero'})`); + if (!success) { + console.log(` Client stderr: ${stderr.slice(-500)}`); + } + return false; + } + + } catch (error: any) { + console.log(` ❌ Test error: ${error.message}`); + await server.stop().catch(() => {}); + return false; + } +} + +async function main() { + console.log('Testing OAuth Protected Resource Metadata Locations'); + console.log('=' .repeat(60)); + + const results: boolean[] = []; + + for (const testCase of testCases) { + const passed = await runTest(testCase); + results.push(passed); + } + + console.log('\n' + '='.repeat(60)); + console.log('Test Summary:'); + const passed = results.filter(r => r).length; + const failed = results.filter(r => !r).length; + console.log(` Passed: ${passed}/${results.length}`); + console.log(` Failed: ${failed}/${results.length}`); + + if (failed === 0) { + console.log('\n✅ All tests passed!'); + process.exit(0); + } else { + console.log('\n❌ Some tests failed'); + process.exit(1); + } +} + +main().catch((error) => { + console.error('Test runner error:', error); + process.exit(1); +}); \ No newline at end of file From 05ea16a020d6ee538693995bfc045512e7aa849b Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 7 Aug 2025 15:53:04 +0100 Subject: [PATCH 16/27] remove old one --- auth-compat/package.json | 3 +- auth-compat/src/cli/index.ts | 316 ++++++++++++----------------- auth-compat/src/cli/test-runner.ts | 162 --------------- 3 files changed, 132 insertions(+), 349 deletions(-) delete mode 100644 auth-compat/src/cli/test-runner.ts diff --git a/auth-compat/package.json b/auth-compat/package.json index ec3cf005f..3845c1966 100644 --- a/auth-compat/package.json +++ b/auth-compat/package.json @@ -11,8 +11,7 @@ "build": "tsc", "dev": "tsx src/cli/index.ts", "test-validation-server": "tsx src/test-validation-server.ts", - "cli": "tsx src/cli/index.ts", - "test": "tsx src/cli/test-runner.ts" + "cli": "tsx src/cli/index.ts" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.0.0", diff --git a/auth-compat/src/cli/index.ts b/auth-compat/src/cli/index.ts index f19d93928..6d3537d0c 100644 --- a/auth-compat/src/cli/index.ts +++ b/auth-compat/src/cli/index.ts @@ -1,216 +1,162 @@ #!/usr/bin/env node import { Command } from 'commander'; -import { spawn } from 'child_process'; -import { ValidationServer } from '../server/validation/index.js'; -import { ComplianceReport, HttpTrace } from '../types.js'; -import { displayTraces } from '../middleware/http-trace.js'; +import { ComplianceTestRunner, TestSuite } from '../test-framework/index.js'; const program = new Command(); program - .name('mcp-auth-compat') - .description('MCP Authorization Compliance Checker') + .name('mcp-auth-test') + .description('MCP Authorization Compliance Test Runner') .version('1.0.0'); program - .argument('', 'Command to run the client (should accept server URL as argument)') + .requiredOption('--command ', 'Command to run the client (should accept server URL as argument)') + .option('--suite ', 'Run specific test suite (basic, oauth, metadata, behavior, all)', 'all') .option('--timeout ', 'Timeout for client execution in milliseconds', '30000') .option('--json', 'Output results as JSON', false) .option('--verbose', 'Verbose output', false) .action(async (clientCommand: string, options) => { - await runComplianceTests(clientCommand, options); + await runTests(clientCommand, options); }); -async function runComplianceTests(clientCommand: string, options: any) { - const verbose = options.verbose; - const timeout = parseInt(options.timeout, 10); - - console.log('Running MCP compliance tests...'); - - const allTestsPassed: boolean[] = []; - - // Run basic test (no auth) - console.log('\n[1/2] Basic compliance test'); - const basicPassed = await runSingleTest(clientCommand, false, timeout, options); - allTestsPassed.push(basicPassed); - - // Run auth test - console.log('\n[2/2] Authorization compliance test'); - const authPassed = await runSingleTest(clientCommand, true, timeout, options); - allTestsPassed.push(authPassed); - - // Overall summary - const overallPass = allTestsPassed.every(p => p); - console.log('\n' + '='.repeat(40)); - if (overallPass) { - console.log('✅ All tests PASSED'); - } else { - console.log('❌ Some tests FAILED'); - } - console.log('='.repeat(40)); - - process.exit(overallPass ? 0 : 1); -} - -async function runSingleTest( - clientCommand: string, - authRequired: boolean, - timeout: number, - options: any -): Promise { - const verbose = options.verbose; - - // Start validation server - const server = new ValidationServer({ authRequired }, verbose); - - try { - const serverPort = await server.start(); - const serverUrl = `http://localhost:${serverPort}/mcp`; - - if (verbose) { - console.log(` Server: ${serverUrl}`); +// Test suite definitions +const basicSuite: TestSuite = { + name: 'Basic Compliance', + description: 'Tests basic MCP protocol compliance without authentication', + scenarios: [ + { + name: 'Basic MCP Connection', + description: 'Client can connect and list tools without auth', + serverConfig: { + authRequired: false + }, + expectedResult: 'PASS' } - - // Parse the client command to separate the executable from its arguments - const commandParts = clientCommand.split(' '); - const executable = commandParts[0]; - const args = [...commandParts.slice(1), serverUrl]; - - // Capture client output when not in verbose mode (verbose mode uses 'inherit') - let clientStdout = ''; - let clientStderr = ''; - - // Run the client - const clientProcess = spawn(executable, args, { - stdio: 'pipe', - shell: true, - timeout - }); - - // Capture stdout/stderr - if (clientProcess.stdout) { - clientProcess.stdout.on('data', (data) => { - clientStdout += data.toString(); - }); + ] +}; + +const oauthSuite: TestSuite = { + name: 'OAuth Compliance', + description: 'Tests OAuth2/OIDC authorization flow', + scenarios: [ + { + name: 'Standard OAuth Flow', + description: 'Client completes OAuth flow with default settings', + serverConfig: { + authRequired: true + }, + expectedResult: 'PASS' } - if (clientProcess.stderr) { - clientProcess.stderr.on('data', (data) => { - clientStderr += data.toString(); - }); + ] +}; + +const metadataLocationSuite: TestSuite = { + name: 'Metadata Location Tests', + description: 'Tests different OAuth protected resource metadata locations', + scenarios: [ + { + name: 'Standard location with WWW-Authenticate', + serverConfig: { + authRequired: true, + metadataLocation: '/.well-known/oauth-protected-resource', + includeWwwAuthenticate: true + }, + expectedResult: 'PASS' + }, + { + name: 'Non-standard location with WWW-Authenticate', + description: 'Custom metadata path advertised via WWW-Authenticate header', + serverConfig: { + authRequired: true, + metadataLocation: '/custom/oauth/metadata', + includeWwwAuthenticate: true + }, + expectedResult: 'PASS' + }, + { + name: 'Nested well-known path with WWW-Authenticate', + serverConfig: { + authRequired: true, + metadataLocation: '/.well-known/oauth-protected-resource/mcp', + includeWwwAuthenticate: true + }, + expectedResult: 'PASS' + }, + { + name: 'Standard location without WWW-Authenticate', + description: 'Client should find metadata at standard location', + serverConfig: { + authRequired: true, + metadataLocation: '/.well-known/oauth-protected-resource', + includeWwwAuthenticate: false + }, + expectedResult: 'PASS' + }, + { + name: 'Non-standard location without WWW-Authenticate', + description: 'Client cannot find metadata without header hint', + serverConfig: { + authRequired: true, + metadataLocation: '/custom/oauth/metadata', + includeWwwAuthenticate: false + }, + expectedResult: 'FAIL' // Should fail - client won't find non-standard location } - - // Wait for client to finish - const clientExitCode = await new Promise((resolve, reject) => { - let timedOut = false; - - const timeoutHandle = setTimeout(() => { - timedOut = true; - clientProcess.kill(); - reject(new Error(`Timeout (${timeout}ms)`)); - }, timeout); - - clientProcess.on('exit', (code) => { - clearTimeout(timeoutHandle); - if (!timedOut) { - resolve(code || 0); + ] +}; + +const behaviorSuite: TestSuite = { + name: 'Client Behavior Validation', + description: 'Tests specific client behaviors', + scenarios: [ + { + name: 'Client requests metadata', + serverConfig: { + authRequired: true + }, + expectedResult: 'PASS', + validateBehavior: (behavior) => { + const errors = []; + if (!behavior.authMetadataRequested) { + errors.push('Client did not request OAuth metadata'); } - }); - - clientProcess.on('error', (error) => { - clearTimeout(timeoutHandle); - reject(error); - }); - }); - - // Get validation results - const results = server.getValidationResults(); - const behavior = server.getClientBehavior(); - - // Get auth server trace if auth was required - const authServerTrace = authRequired && server.authServer ? server.authServer.getHttpTrace() : []; - - // Generate report - const report: ComplianceReport = { - overall_result: results.every(r => r.result === 'PASS') && clientExitCode === 0 ? 'PASS' : 'FAIL', - test_suite: authRequired ? 'authorization-compliance' : 'basic-compliance', - timestamp: new Date().toISOString(), - client_command: clientCommand, - tests_passed: results.filter(r => r.result === 'PASS').length, - tests_failed: results.filter(r => r.result === 'FAIL').length, - tests: results - }; - - // Output results - if (options.json) { - console.log(JSON.stringify(report, null, 2)); - } else { - const clientOutput = { stdout: clientStdout, stderr: clientStderr }; - printCompactReport(report, verbose ? behavior : null, verbose ? authServerTrace : undefined, clientOutput); - } - - // Stop server - await server.stop(); - - return report.overall_result === 'PASS'; - - } catch (error: any) { - console.log(` ❌ FAIL: ${error.message || error}`); - if (server) { - await server.stop(); + if (!behavior.initialized) { + errors.push('Client did not complete initialization'); + } + return errors; + } } - return false; - } -} + ] +}; -function printCompactReport(report: ComplianceReport, behavior?: any, authServerTrace?: HttpTrace[], clientOutput?: { stdout: string, stderr: string }) { - const passed = report.overall_result === 'PASS'; - const icon = passed ? '✅' : '❌'; +async function runTests(options: any) { + const verbose = options.verbose; + const runner = new ComplianceTestRunner(options.command, { verbose, json: options.json }); - console.log(` ${icon} ${report.test_suite}: ${report.overall_result}`); + console.log('Running MCP compliance tests...'); - // Only show failures in compact mode - if (!passed) { - report.tests.forEach(test => { - if (test.result === 'FAIL') { - console.log(` ❌ ${test.name}`); - if (test.errors && test.errors.length > 0) { - test.errors.forEach(error => { - console.log(` - ${error}`); - }); - } - } - }); - } + // Select which suites to run + let suitesToRun: TestSuite[] = []; - // Show HTTP trace and detailed behavior in verbose mode - if (behavior) { - displayTraces(behavior.httpTrace, authServerTrace || []) + const suiteMap: Record = { + 'basic': basicSuite, + 'oauth': oauthSuite, + 'metadata': metadataLocationSuite, + 'behavior': behaviorSuite + }; - // Show other behavior details - console.log(' Client Behavior Summary:'); - const summaryBehavior = { ...behavior }; - delete summaryBehavior.httpTrace; // Don't repeat the trace - console.log(' ' + JSON.stringify(summaryBehavior, null, 2).split('\n').join('\n ')); + if (options.suite === 'all') { + suitesToRun = [basicSuite, oauthSuite, metadataLocationSuite, behaviorSuite]; + } else if (suiteMap[options.suite]) { + suitesToRun = [suiteMap[options.suite]]; + } else { + console.error(`Unknown suite: ${options.suite}`); + console.error(`Available suites: ${Object.keys(suiteMap).join(', ')}, all`); + process.exit(1); } - // Show client output at the very end - // In verbose mode, output was shown directly via 'inherit', but we still captured it for non-verbose mode - if (clientOutput && (clientOutput.stdout || clientOutput.stderr)) { - if (clientOutput.stdout) { - console.log('\n ====== CLIENT STDOUT ======'); - console.log(' ' + clientOutput.stdout.split('\n').join('\n ')); - console.log(' ========================\n'); - } - - if (clientOutput.stderr) { - console.log('\n ====== CLIENT STDERR ======'); - console.log(' ' + clientOutput.stderr.split('\n').join('\n ')); - console.log(' ========================\n'); - } - } + await runner.runSuites(suitesToRun); } - - program.parse(); diff --git a/auth-compat/src/cli/test-runner.ts b/auth-compat/src/cli/test-runner.ts deleted file mode 100644 index 6d3537d0c..000000000 --- a/auth-compat/src/cli/test-runner.ts +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/env node - -import { Command } from 'commander'; -import { ComplianceTestRunner, TestSuite } from '../test-framework/index.js'; - -const program = new Command(); - -program - .name('mcp-auth-test') - .description('MCP Authorization Compliance Test Runner') - .version('1.0.0'); - -program - .requiredOption('--command ', 'Command to run the client (should accept server URL as argument)') - .option('--suite ', 'Run specific test suite (basic, oauth, metadata, behavior, all)', 'all') - .option('--timeout ', 'Timeout for client execution in milliseconds', '30000') - .option('--json', 'Output results as JSON', false) - .option('--verbose', 'Verbose output', false) - .action(async (clientCommand: string, options) => { - await runTests(clientCommand, options); - }); - -// Test suite definitions -const basicSuite: TestSuite = { - name: 'Basic Compliance', - description: 'Tests basic MCP protocol compliance without authentication', - scenarios: [ - { - name: 'Basic MCP Connection', - description: 'Client can connect and list tools without auth', - serverConfig: { - authRequired: false - }, - expectedResult: 'PASS' - } - ] -}; - -const oauthSuite: TestSuite = { - name: 'OAuth Compliance', - description: 'Tests OAuth2/OIDC authorization flow', - scenarios: [ - { - name: 'Standard OAuth Flow', - description: 'Client completes OAuth flow with default settings', - serverConfig: { - authRequired: true - }, - expectedResult: 'PASS' - } - ] -}; - -const metadataLocationSuite: TestSuite = { - name: 'Metadata Location Tests', - description: 'Tests different OAuth protected resource metadata locations', - scenarios: [ - { - name: 'Standard location with WWW-Authenticate', - serverConfig: { - authRequired: true, - metadataLocation: '/.well-known/oauth-protected-resource', - includeWwwAuthenticate: true - }, - expectedResult: 'PASS' - }, - { - name: 'Non-standard location with WWW-Authenticate', - description: 'Custom metadata path advertised via WWW-Authenticate header', - serverConfig: { - authRequired: true, - metadataLocation: '/custom/oauth/metadata', - includeWwwAuthenticate: true - }, - expectedResult: 'PASS' - }, - { - name: 'Nested well-known path with WWW-Authenticate', - serverConfig: { - authRequired: true, - metadataLocation: '/.well-known/oauth-protected-resource/mcp', - includeWwwAuthenticate: true - }, - expectedResult: 'PASS' - }, - { - name: 'Standard location without WWW-Authenticate', - description: 'Client should find metadata at standard location', - serverConfig: { - authRequired: true, - metadataLocation: '/.well-known/oauth-protected-resource', - includeWwwAuthenticate: false - }, - expectedResult: 'PASS' - }, - { - name: 'Non-standard location without WWW-Authenticate', - description: 'Client cannot find metadata without header hint', - serverConfig: { - authRequired: true, - metadataLocation: '/custom/oauth/metadata', - includeWwwAuthenticate: false - }, - expectedResult: 'FAIL' // Should fail - client won't find non-standard location - } - ] -}; - -const behaviorSuite: TestSuite = { - name: 'Client Behavior Validation', - description: 'Tests specific client behaviors', - scenarios: [ - { - name: 'Client requests metadata', - serverConfig: { - authRequired: true - }, - expectedResult: 'PASS', - validateBehavior: (behavior) => { - const errors = []; - if (!behavior.authMetadataRequested) { - errors.push('Client did not request OAuth metadata'); - } - if (!behavior.initialized) { - errors.push('Client did not complete initialization'); - } - return errors; - } - } - ] -}; - -async function runTests(options: any) { - const verbose = options.verbose; - const runner = new ComplianceTestRunner(options.command, { verbose, json: options.json }); - - console.log('Running MCP compliance tests...'); - - // Select which suites to run - let suitesToRun: TestSuite[] = []; - - const suiteMap: Record = { - 'basic': basicSuite, - 'oauth': oauthSuite, - 'metadata': metadataLocationSuite, - 'behavior': behaviorSuite - }; - - if (options.suite === 'all') { - suitesToRun = [basicSuite, oauthSuite, metadataLocationSuite, behaviorSuite]; - } else if (suiteMap[options.suite]) { - suitesToRun = [suiteMap[options.suite]]; - } else { - console.error(`Unknown suite: ${options.suite}`); - console.error(`Available suites: ${Object.keys(suiteMap).join(', ')}, all`); - process.exit(1); - } - - await runner.runSuites(suitesToRun); -} - -program.parse(); From 0adab5f4d8b651901408bebed50d05e7fd0081a9 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Mon, 11 Aug 2025 10:16:25 +0100 Subject: [PATCH 17/27] move around --- auth-compat/src/cli/index.ts | 114 +------------ auth-compat/src/test-framework/index.ts | 5 +- .../test-framework/suites.ts} | 70 +------- auth-compat/test/metadata-locations.test.ts | 157 ------------------ 4 files changed, 14 insertions(+), 332 deletions(-) rename auth-compat/{test/all-tests.ts => src/test-framework/suites.ts} (57%) delete mode 100644 auth-compat/test/metadata-locations.test.ts diff --git a/auth-compat/src/cli/index.ts b/auth-compat/src/cli/index.ts index 6d3537d0c..5974aee71 100644 --- a/auth-compat/src/cli/index.ts +++ b/auth-compat/src/cli/index.ts @@ -2,6 +2,7 @@ import { Command } from 'commander'; import { ComplianceTestRunner, TestSuite } from '../test-framework/index.js'; +import { basicSuite, behaviorSuite, metadataLocationSuite, oauthSuite } from '../test-framework/suites.js'; const program = new Command(); @@ -16,119 +17,10 @@ program .option('--timeout ', 'Timeout for client execution in milliseconds', '30000') .option('--json', 'Output results as JSON', false) .option('--verbose', 'Verbose output', false) - .action(async (clientCommand: string, options) => { - await runTests(clientCommand, options); + .action(async (options) => { + await runTests(options); }); -// Test suite definitions -const basicSuite: TestSuite = { - name: 'Basic Compliance', - description: 'Tests basic MCP protocol compliance without authentication', - scenarios: [ - { - name: 'Basic MCP Connection', - description: 'Client can connect and list tools without auth', - serverConfig: { - authRequired: false - }, - expectedResult: 'PASS' - } - ] -}; - -const oauthSuite: TestSuite = { - name: 'OAuth Compliance', - description: 'Tests OAuth2/OIDC authorization flow', - scenarios: [ - { - name: 'Standard OAuth Flow', - description: 'Client completes OAuth flow with default settings', - serverConfig: { - authRequired: true - }, - expectedResult: 'PASS' - } - ] -}; - -const metadataLocationSuite: TestSuite = { - name: 'Metadata Location Tests', - description: 'Tests different OAuth protected resource metadata locations', - scenarios: [ - { - name: 'Standard location with WWW-Authenticate', - serverConfig: { - authRequired: true, - metadataLocation: '/.well-known/oauth-protected-resource', - includeWwwAuthenticate: true - }, - expectedResult: 'PASS' - }, - { - name: 'Non-standard location with WWW-Authenticate', - description: 'Custom metadata path advertised via WWW-Authenticate header', - serverConfig: { - authRequired: true, - metadataLocation: '/custom/oauth/metadata', - includeWwwAuthenticate: true - }, - expectedResult: 'PASS' - }, - { - name: 'Nested well-known path with WWW-Authenticate', - serverConfig: { - authRequired: true, - metadataLocation: '/.well-known/oauth-protected-resource/mcp', - includeWwwAuthenticate: true - }, - expectedResult: 'PASS' - }, - { - name: 'Standard location without WWW-Authenticate', - description: 'Client should find metadata at standard location', - serverConfig: { - authRequired: true, - metadataLocation: '/.well-known/oauth-protected-resource', - includeWwwAuthenticate: false - }, - expectedResult: 'PASS' - }, - { - name: 'Non-standard location without WWW-Authenticate', - description: 'Client cannot find metadata without header hint', - serverConfig: { - authRequired: true, - metadataLocation: '/custom/oauth/metadata', - includeWwwAuthenticate: false - }, - expectedResult: 'FAIL' // Should fail - client won't find non-standard location - } - ] -}; - -const behaviorSuite: TestSuite = { - name: 'Client Behavior Validation', - description: 'Tests specific client behaviors', - scenarios: [ - { - name: 'Client requests metadata', - serverConfig: { - authRequired: true - }, - expectedResult: 'PASS', - validateBehavior: (behavior) => { - const errors = []; - if (!behavior.authMetadataRequested) { - errors.push('Client did not request OAuth metadata'); - } - if (!behavior.initialized) { - errors.push('Client did not complete initialization'); - } - return errors; - } - } - ] -}; async function runTests(options: any) { const verbose = options.verbose; diff --git a/auth-compat/src/test-framework/index.ts b/auth-compat/src/test-framework/index.ts index 14b4a6358..82cc9aed5 100644 --- a/auth-compat/src/test-framework/index.ts +++ b/auth-compat/src/test-framework/index.ts @@ -87,6 +87,7 @@ export class ComplianceTestRunner { }, timeout); clientProcess.on('exit', (code) => { + console.log(`EXIT CODE: ${code}`); clearTimeout(timeoutHandle); if (!timedOut) { resolve(code || 0); @@ -113,6 +114,8 @@ export class ComplianceTestRunner { } // Generate report + console.log(`EXIT CODE: ${clientExitCode}`); + const report: ComplianceReport = { overall_result: results.every(r => r.result === 'PASS') && clientExitCode === 0 && @@ -186,7 +189,6 @@ export class ComplianceTestRunner { this.log('\n' + '='.repeat(60)); this.log(`Suite Summary: ${suite.name}`); this.log(` Passed: ${passed}/${results.length}`); - this.log(` Failed: ${failed}/${results.length}`); return failed === 0; } @@ -206,7 +208,6 @@ export class ComplianceTestRunner { this.log('OVERALL SUMMARY'); this.log('='.repeat(60)); this.log(`Total Suites Passed: ${totalSuitesPassed}/${allResults.length}`); - this.log(`Total Suites Failed: ${totalSuitesFailed}/${allResults.length}`); if (totalSuitesFailed === 0) { this.log('\n✅ All test suites passed!'); diff --git a/auth-compat/test/all-tests.ts b/auth-compat/src/test-framework/suites.ts similarity index 57% rename from auth-compat/test/all-tests.ts rename to auth-compat/src/test-framework/suites.ts index 5060aac14..426897d12 100644 --- a/auth-compat/test/all-tests.ts +++ b/auth-compat/src/test-framework/suites.ts @@ -1,9 +1,9 @@ -#!/usr/bin/env npx tsx +import { TestSuite } from "."; -import { ComplianceTestRunner, TestSuite } from '../src/test-framework/index.js'; -// Basic compliance tests -const basicSuite: TestSuite = { + +// Test suite definitions +export const basicSuite: TestSuite = { name: 'Basic Compliance', description: 'Tests basic MCP protocol compliance without authentication', scenarios: [ @@ -13,14 +13,12 @@ const basicSuite: TestSuite = { serverConfig: { authRequired: false }, - clientCommand: 'npx tsx examples/typescript-client/test-client.ts', expectedResult: 'PASS' } ] }; -// OAuth compliance tests -const oauthSuite: TestSuite = { +export const oauthSuite: TestSuite = { name: 'OAuth Compliance', description: 'Tests OAuth2/OIDC authorization flow', scenarios: [ @@ -30,14 +28,12 @@ const oauthSuite: TestSuite = { serverConfig: { authRequired: true }, - clientCommand: 'npx tsx examples/typescript-client/test-client.ts', expectedResult: 'PASS' } ] }; -// Metadata location tests -const metadataLocationSuite: TestSuite = { +export const metadataLocationSuite: TestSuite = { name: 'Metadata Location Tests', description: 'Tests different OAuth protected resource metadata locations', scenarios: [ @@ -48,7 +44,6 @@ const metadataLocationSuite: TestSuite = { metadataLocation: '/.well-known/oauth-protected-resource', includeWwwAuthenticate: true }, - clientCommand: 'npx tsx examples/typescript-client/test-client.ts', expectedResult: 'PASS' }, { @@ -59,7 +54,6 @@ const metadataLocationSuite: TestSuite = { metadataLocation: '/custom/oauth/metadata', includeWwwAuthenticate: true }, - clientCommand: 'npx tsx examples/typescript-client/test-client.ts', expectedResult: 'PASS' }, { @@ -69,7 +63,6 @@ const metadataLocationSuite: TestSuite = { metadataLocation: '/.well-known/oauth-protected-resource/mcp', includeWwwAuthenticate: true }, - clientCommand: 'npx tsx examples/typescript-client/test-client.ts', expectedResult: 'PASS' }, { @@ -80,7 +73,6 @@ const metadataLocationSuite: TestSuite = { metadataLocation: '/.well-known/oauth-protected-resource', includeWwwAuthenticate: false }, - clientCommand: 'npx tsx examples/typescript-client/test-client.ts', expectedResult: 'PASS' }, { @@ -91,14 +83,13 @@ const metadataLocationSuite: TestSuite = { metadataLocation: '/custom/oauth/metadata', includeWwwAuthenticate: false }, - clientCommand: 'npx tsx examples/typescript-client/test-client.ts', expectedResult: 'FAIL' // Should fail - client won't find non-standard location } ] }; -// Behavior validation tests -const behaviorSuite: TestSuite = { +// TODO: this is busted +export const behaviorSuite: TestSuite = { name: 'Client Behavior Validation', description: 'Tests specific client behaviors', scenarios: [ @@ -107,7 +98,6 @@ const behaviorSuite: TestSuite = { serverConfig: { authRequired: true }, - clientCommand: 'npx tsx examples/typescript-client/test-client.ts', expectedResult: 'PASS', validateBehavior: (behavior) => { const errors = []; @@ -122,47 +112,3 @@ const behaviorSuite: TestSuite = { } ] }; - -// Main test runner -async function main() { - const args = process.argv.slice(2); - const verbose = args.includes('--verbose') || args.includes('-v'); - const json = args.includes('--json'); - const suite = args.find(arg => arg.startsWith('--suite='))?.split('=')[1]; - - const runner = new ComplianceTestRunner({ verbose, json }); - - // Select which suites to run - let suitesToRun: TestSuite[] = []; - - if (suite) { - // Run specific suite - const suiteMap: Record = { - 'basic': basicSuite, - 'oauth': oauthSuite, - 'metadata': metadataLocationSuite, - 'behavior': behaviorSuite - }; - - if (suiteMap[suite]) { - suitesToRun = [suiteMap[suite]]; - } else { - console.error(`Unknown suite: ${suite}`); - console.error(`Available suites: ${Object.keys(suiteMap).join(', ')}`); - process.exit(1); - } - } else { - // Run all suites - suitesToRun = [basicSuite, oauthSuite, metadataLocationSuite, behaviorSuite]; - } - - console.log('MCP Authorization Compliance Test Suite'); - console.log('=' .repeat(60)); - - await runner.runSuites(suitesToRun); -} - -main().catch((error) => { - console.error('Test runner error:', error); - process.exit(1); -}); \ No newline at end of file diff --git a/auth-compat/test/metadata-locations.test.ts b/auth-compat/test/metadata-locations.test.ts deleted file mode 100644 index 09ee9cc48..000000000 --- a/auth-compat/test/metadata-locations.test.ts +++ /dev/null @@ -1,157 +0,0 @@ -#!/usr/bin/env npx tsx - -import { spawn } from 'child_process'; -import { ValidationServer } from '../src/server/validation/index.js'; - -interface TestCase { - name: string; - metadataLocation: string; - includeWwwAuthenticate: boolean; - expectedSuccess: boolean; -} - -const testCases: TestCase[] = [ - { - name: 'Standard location with WWW-Authenticate', - metadataLocation: '/.well-known/oauth-protected-resource', - includeWwwAuthenticate: true, - expectedSuccess: true - }, - { - name: 'Non-standard location with WWW-Authenticate', - metadataLocation: '/custom/metadata/location', - includeWwwAuthenticate: true, - expectedSuccess: true - }, - { - name: 'Nested well-known path with WWW-Authenticate', - metadataLocation: '/.well-known/oauth-protected-resource/mcp', - includeWwwAuthenticate: true, - expectedSuccess: true - }, - { - name: 'Standard location without WWW-Authenticate', - metadataLocation: '/.well-known/oauth-protected-resource', - includeWwwAuthenticate: false, - expectedSuccess: true - }, - { - name: 'Nested well-known path without WWW-Authenticate', - metadataLocation: '/.well-known/oauth-protected-resource/mcp/v1', - includeWwwAuthenticate: false, - expectedSuccess: true - } -]; - -async function runTest(testCase: TestCase): Promise { - console.log(`\nTesting: ${testCase.name}`); - console.log(` Metadata location: ${testCase.metadataLocation}`); - console.log(` Include WWW-Authenticate: ${testCase.includeWwwAuthenticate}`); - - const server = new ValidationServer({ - authRequired: true, - metadataLocation: testCase.metadataLocation, - includeWwwAuthenticate: testCase.includeWwwAuthenticate - }, false); - - try { - const serverPort = await server.start(); - const serverUrl = `http://localhost:${serverPort}/mcp`; - - console.log(` Server URL: ${serverUrl}`); - console.log(` Metadata URL: http://localhost:${serverPort}${testCase.metadataLocation}`); - - // Test if metadata endpoint is accessible - const metadataResponse = await fetch(`http://localhost:${serverPort}${testCase.metadataLocation}`); - if (!metadataResponse.ok) { - throw new Error(`Metadata endpoint returned ${metadataResponse.status}`); - } - - const metadata = await metadataResponse.json(); - console.log(` Metadata response:`, JSON.stringify(metadata, null, 2)); - - // Run the client - const clientProcess = spawn('npx', ['tsx', 'examples/typescript-client/test-client.ts', serverUrl], { - stdio: 'pipe', - shell: true, - timeout: 30000 - }); - - let stdout = ''; - let stderr = ''; - - clientProcess.stdout?.on('data', (data) => { - stdout += data.toString(); - }); - - clientProcess.stderr?.on('data', (data) => { - stderr += data.toString(); - }); - - // Wait for client to finish - const clientExitCode = await new Promise((resolve) => { - const timeoutHandle = setTimeout(() => { - clientProcess.kill(); - resolve(1); - }, 30000); - - clientProcess.on('exit', (code) => { - clearTimeout(timeoutHandle); - resolve(code || 0); - }); - }); - - await server.stop(); - - const success = clientExitCode === 0; - const expectedResult = testCase.expectedSuccess; - - if (success === expectedResult) { - console.log(` ✅ Test passed (exit code: ${clientExitCode})`); - return true; - } else { - console.log(` ❌ Test failed (exit code: ${clientExitCode}, expected: ${expectedResult ? 0 : 'non-zero'})`); - if (!success) { - console.log(` Client stderr: ${stderr.slice(-500)}`); - } - return false; - } - - } catch (error: any) { - console.log(` ❌ Test error: ${error.message}`); - await server.stop().catch(() => {}); - return false; - } -} - -async function main() { - console.log('Testing OAuth Protected Resource Metadata Locations'); - console.log('=' .repeat(60)); - - const results: boolean[] = []; - - for (const testCase of testCases) { - const passed = await runTest(testCase); - results.push(passed); - } - - console.log('\n' + '='.repeat(60)); - console.log('Test Summary:'); - const passed = results.filter(r => r).length; - const failed = results.filter(r => !r).length; - console.log(` Passed: ${passed}/${results.length}`); - console.log(` Failed: ${failed}/${results.length}`); - - if (failed === 0) { - console.log('\n✅ All tests passed!'); - process.exit(0); - } else { - console.log('\n❌ Some tests failed'); - process.exit(1); - } -} - -main().catch((error) => { - console.error('Test runner error:', error); - process.exit(1); -}); \ No newline at end of file From a305edc8a463edbaebbe66798f57392e4d2e1bc9 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Mon, 11 Aug 2025 17:41:49 +0100 Subject: [PATCH 18/27] single test option --- auth-compat/src/cli/index.ts | 54 +++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/auth-compat/src/cli/index.ts b/auth-compat/src/cli/index.ts index 5974aee71..2a145ac8b 100644 --- a/auth-compat/src/cli/index.ts +++ b/auth-compat/src/cli/index.ts @@ -14,6 +14,8 @@ program program .requiredOption('--command ', 'Command to run the client (should accept server URL as argument)') .option('--suite ', 'Run specific test suite (basic, oauth, metadata, behavior, all)', 'all') + .option('--test ', 'Run specific test by name (partial match supported)') + .option('--list', 'List all available tests', false) .option('--timeout ', 'Timeout for client execution in milliseconds', '30000') .option('--json', 'Output results as JSON', false) .option('--verbose', 'Verbose output', false) @@ -23,11 +25,61 @@ program async function runTests(options: any) { + const allSuites = [basicSuite, oauthSuite, metadataLocationSuite, behaviorSuite]; + + // List mode - show all available tests + if (options.list) { + console.log('Available test suites and scenarios:\n'); + allSuites.forEach(suite => { + console.log(`Suite: ${suite.name}`); + if (suite.description) { + console.log(` ${suite.description}`); + } + suite.scenarios.forEach((scenario, index) => { + console.log(` ${index + 1}. ${scenario.name}`); + if (scenario.description) { + console.log(` ${scenario.description}`); + } + }); + console.log(); + }); + process.exit(0); + } + const verbose = options.verbose; const runner = new ComplianceTestRunner(options.command, { verbose, json: options.json }); console.log('Running MCP compliance tests...'); + // If specific test is requested, filter to just that test + if (options.test) { + const testName = options.test.toLowerCase(); + let foundScenarios: TestSuite[] = []; + + allSuites.forEach(suite => { + const matchingScenarios = suite.scenarios.filter(scenario => + scenario.name.toLowerCase().includes(testName) + ); + + if (matchingScenarios.length > 0) { + foundScenarios.push({ + ...suite, + scenarios: matchingScenarios + }); + } + }); + + if (foundScenarios.length === 0) { + console.error(`No test found matching: ${options.test}`); + console.log('\nUse --list to see all available tests'); + process.exit(1); + } + + console.log(`Found ${foundScenarios.reduce((acc, s) => acc + s.scenarios.length, 0)} test(s) matching "${options.test}"\n`); + await runner.runSuites(foundScenarios); + return; + } + // Select which suites to run let suitesToRun: TestSuite[] = []; @@ -39,7 +91,7 @@ async function runTests(options: any) { }; if (options.suite === 'all') { - suitesToRun = [basicSuite, oauthSuite, metadataLocationSuite, behaviorSuite]; + suitesToRun = allSuites; } else if (suiteMap[options.suite]) { suitesToRun = [suiteMap[options.suite]]; } else { From 23cffec9993f61e8fd8299022b8891279bdeb770 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Mon, 11 Aug 2025 18:06:11 +0100 Subject: [PATCH 19/27] try jest --- auth-compat/JEST_USAGE.md | 77 + auth-compat/jest.config.js | 31 + auth-compat/package-lock.json | 5586 ++++++++++++++--- auth-compat/package.json | 14 +- .../src/__tests__/basic-compliance.test.ts | 35 + .../src/__tests__/client-behavior.test.ts | 108 + .../src/__tests__/helpers/test-utils.ts | 275 + .../src/__tests__/metadata-location.test.ts | 128 + .../src/__tests__/oauth-compliance.test.ts | 40 + 9 files changed, 5354 insertions(+), 940 deletions(-) create mode 100644 auth-compat/JEST_USAGE.md create mode 100644 auth-compat/jest.config.js create mode 100644 auth-compat/src/__tests__/basic-compliance.test.ts create mode 100644 auth-compat/src/__tests__/client-behavior.test.ts create mode 100644 auth-compat/src/__tests__/helpers/test-utils.ts create mode 100644 auth-compat/src/__tests__/metadata-location.test.ts create mode 100644 auth-compat/src/__tests__/oauth-compliance.test.ts diff --git a/auth-compat/JEST_USAGE.md b/auth-compat/JEST_USAGE.md new file mode 100644 index 000000000..3d82cde54 --- /dev/null +++ b/auth-compat/JEST_USAGE.md @@ -0,0 +1,77 @@ +# Jest Test Suite Usage + +## Running Tests with Jest + +The MCP Auth Compliance tests are now available as Jest test suites, providing a standard testing experience with better IDE integration and reporting. + +### Basic Usage + +```bash +# Run all tests with default client +npm test + +# Run specific test suite +npm run test:basic # Basic MCP connection tests +npm run test:oauth # OAuth compliance tests +npm run test:metadata # Metadata location tests +npm run test:behavior # Client behavior validation tests + +# Run with verbose output +npm run test:verbose + +# Run with coverage report +npm run test:coverage + +# Watch mode for development +npm run test:watch +``` + +### Using Custom Client Commands + +By default, tests use the example TypeScript client. To test your own client implementation: + +```bash +# Set CLIENT_COMMAND environment variable +CLIENT_COMMAND="node my-client.js" npm test + +# Or use the test:with-client script +npm run test:with-client --client="python my-client.py" +``` + +### Environment Variables + +- `CLIENT_COMMAND`: Command to execute your MCP client (receives server URL as last argument) +- `VERBOSE`: Set to `true` for detailed output including HTTP traces + +### Test Structure + +Each test suite corresponds to the original compliance test scenarios: + +1. **basic-compliance.test.ts**: Tests basic MCP protocol compliance without authentication +2. **oauth-compliance.test.ts**: Tests OAuth2/OIDC authorization flow +3. **metadata-location.test.ts**: Tests different OAuth metadata discovery scenarios +4. **client-behavior.test.ts**: Validates specific client behaviors and error handling + +### Jest Features + +The Jest implementation provides: +- Parallel test execution for faster runs +- Built-in coverage reporting +- Better error messages and stack traces +- IDE integration for debugging +- Watch mode for test-driven development +- Custom matchers like `toHavePassedCompliance()` + +### Comparison with CLI Runner + +Both testing methods are maintained: +- **Jest**: Better for development, CI/CD integration, and detailed reporting +- **CLI Runner**: Better for standalone validation and specific scenario testing + +```bash +# Jest approach +npm test + +# CLI approach (still available) +npm run cli -- --command "node my-client.js" --suite all +``` \ No newline at end of file diff --git a/auth-compat/jest.config.js b/auth-compat/jest.config.js new file mode 100644 index 000000000..57f50e18c --- /dev/null +++ b/auth-compat/jest.config.js @@ -0,0 +1,31 @@ +/** @type {import('jest').Config} */ +export default { + preset: 'ts-jest', + testEnvironment: 'node', + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + tsconfig: { + module: 'commonjs', + target: 'es2022', + esModuleInterop: true, + allowSyntheticDefaultImports: true, + }, + }, + ], + }, + testMatch: ['**/__tests__/**/*.test.ts'], + testTimeout: 60000, // 60 seconds for long-running compliance tests + collectCoverageFrom: [ + 'src/**/*.ts', + '!src/**/*.d.ts', + '!src/__tests__/**', + ], + coverageDirectory: 'coverage', + coverageReporters: ['text', 'lcov', 'html'], + verbose: true, +}; \ No newline at end of file diff --git a/auth-compat/package-lock.json b/auth-compat/package-lock.json index 7150c9dd3..ed88cd0d0 100644 --- a/auth-compat/package-lock.json +++ b/auth-compat/package-lock.json @@ -18,338 +18,612 @@ }, "devDependencies": { "@types/express": "^4.17.0", + "@types/jest": "^29.5.0", "@types/node": "^20.0.0", + "jest": "^29.7.0", + "ts-jest": "^29.1.0", "tsx": "^4.0.0", "typescript": "^5.0.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", - "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", - "cpu": [ - "ppc64" - ], + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/android-arm/-/android-arm-0.25.8.tgz", - "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", - "cpu": [ - "arm" - ], + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", - "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/compat-data": { + "version": "7.28.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/android-x64/-/android-x64-0.25.8.tgz", - "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", - "cpu": [ - "x64" - ], + "node_modules/@babel/core": { + "version": "7.28.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/core/-/core-7.28.0.tgz", + "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", - "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/core/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=18" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", - "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", - "cpu": [ - "x64" - ], + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/generator": { + "version": "7.28.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", - "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", - "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", - "cpu": [ - "x64" - ], + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", - "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", - "cpu": [ - "arm" - ], + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", - "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", - "cpu": [ - "arm64" - ], + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", - "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", - "cpu": [ - "ia32" - ], + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", - "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", - "cpu": [ - "loong64" - ], + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", - "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", - "cpu": [ - "mips64el" - ], + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", - "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", - "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", - "cpu": [ - "riscv64" - ], + "node_modules/@babel/helpers": { + "version": "7.28.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/helpers/-/helpers-7.28.2.tgz", + "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", - "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", - "cpu": [ - "s390x" - ], + "node_modules/@babel/parser": { + "version": "7.28.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", - "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", - "cpu": [ - "x64" - ], + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-async-generators/7.8.4/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha1-qYP7Gusuw/btBCohD2QOkOeG/g0=", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", - "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-bigint/7.8.3/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha1-TJpvZp9dDN8bkKFnHpoUa+UwDOo=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-class-properties/7.12.13/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-class-static-block/7.14.5/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha1-GV34mxRrS3izv4l/16JXyEZZ1AY=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-import-meta/7.10.4/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha1-7mATSMNw+jNNIge+FYd3SWUh/VE=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-json-strings/7.8.3/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-logical-assignment-operators/7.10.4/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha1-ypHvRjA1MESLkGZSusLp/plB9pk=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-nullish-coalescing-operator/7.8.3/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-numeric-separator/7.10.4/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-object-rest-spread/7.8.3/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-optional-catch-binding/7.8.3/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha1-YRGiZbz7Ag6579D9/X0mQCue1sE=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-optional-chaining/7.8.3/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-private-property-in-object/7.14.5/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha1-DcZnHsDqIrbpShEU+FeXDNOd4a0=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-top-level-await/7.14.5/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@bcoe/v8-coverage/0.2.3/v8-coverage-0.2.3.tgz", + "integrity": "sha1-daLotRy3WKdVPWgEpZMteqznXDk=", + "dev": true, + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", + "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", "cpu": [ - "arm64" + "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "netbsd" + "aix" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/netbsd-x64": { + "node_modules/@esbuild/android-arm": { "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", - "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/android-arm/-/android-arm-0.25.8.tgz", + "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", "cpu": [ - "x64" + "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "netbsd" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/openbsd-arm64": { + "node_modules/@esbuild/android-arm64": { "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", - "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", + "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", "cpu": [ "arm64" ], @@ -357,16 +631,16 @@ "license": "MIT", "optional": true, "os": [ - "openbsd" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/openbsd-x64": { + "node_modules/@esbuild/android-x64": { "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", - "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/android-x64/-/android-x64-0.25.8.tgz", + "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", "cpu": [ "x64" ], @@ -374,16 +648,16 @@ "license": "MIT", "optional": true, "os": [ - "openbsd" + "android" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/openharmony-arm64": { + "node_modules/@esbuild/darwin-arm64": { "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", - "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", + "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", "cpu": [ "arm64" ], @@ -391,16 +665,16 @@ "license": "MIT", "optional": true, "os": [ - "openharmony" + "darwin" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/sunos-x64": { + "node_modules/@esbuild/darwin-x64": { "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", - "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", + "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", "cpu": [ "x64" ], @@ -408,16 +682,16 @@ "license": "MIT", "optional": true, "os": [ - "sunos" + "darwin" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/win32-arm64": { + "node_modules/@esbuild/freebsd-arm64": { "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", - "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", + "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", "cpu": [ "arm64" ], @@ -425,555 +699,2728 @@ "license": "MIT", "optional": true, "os": [ - "win32" + "freebsd" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/win32-ia32": { + "node_modules/@esbuild/freebsd-x64": { "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", - "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", + "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", "cpu": [ - "ia32" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "freebsd" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/win32-x64": { + "node_modules/@esbuild/linux-arm": { "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", - "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", + "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", "cpu": [ - "x64" + "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.17.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@modelcontextprotocol/sdk/-/sdk-1.17.1.tgz", - "integrity": "sha512-CPle1OQehbWqd25La9Ack5B07StKIxh4+Bf19qnpZKJC1oI22Y0czZHbifjw1UoczIfKBwBDAp/dFxvHG13B5A==", - "license": "MIT", - "dependencies": { + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", + "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", + "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", + "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", + "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", + "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", + "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", + "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", + "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", + "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", + "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", + "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", + "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", + "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", + "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", + "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", + "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", + "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@istanbuljs/load-nyc-config/1.1.0/load-nyc-config-1.1.0.tgz", + "integrity": "sha1-/T2x1Z7PfPEh6AZQu4ZxL5tV7O0=", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@istanbuljs/schema/0.1.3/schema-0.1.3.tgz", + "integrity": "sha1-5F44TkuOwWvOL9kDr3hFD2v37Jg=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jest/console/29.7.0/console-29.7.0.tgz", + "integrity": "sha1-zUgi29uEUpJlxaK9tSmjycyVD/w=", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jest/core/29.7.0/core-29.7.0.tgz", + "integrity": "sha1-tszMI58w/zZglljFpeIpF1fORI8=", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jest/environment/29.7.0/environment-29.7.0.tgz", + "integrity": "sha1-JNYfVP8feG881Ac7S5RBY4O68qc=", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jest/expect/29.7.0/expect-29.7.0.tgz", + "integrity": "sha1-dqPtsMt1O3Dfv+Iyg1ENPUVDK/I=", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jest/expect-utils/29.7.0/expect-utils-29.7.0.tgz", + "integrity": "sha1-Aj7+XSaopw8hZ30KGvwPCkTjocY=", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jest/fake-timers/29.7.0/fake-timers-29.7.0.tgz", + "integrity": "sha1-/ZG/H/+xbX0NJKQmqxpHpJiBpWU=", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jest/globals/29.7.0/globals-29.7.0.tgz", + "integrity": "sha1-jZKQ+exH/3cmB/qGTKHVou+uHU0=", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jest/reporters/29.7.0/reporters-29.7.0.tgz", + "integrity": "sha1-BLJi7LO4+qg7Cz0yFiOXI5Po9Mc=", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jest/source-map/29.6.3/source-map-29.6.3.tgz", + "integrity": "sha1-2Quncglc83o0peuUE/G1YqCFVMQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jest/test-result/29.7.0/test-result-29.7.0.tgz", + "integrity": "sha1-jbmoCqGgl7siYlcmhnNLrtmxZXw=", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jest/test-sequencer/29.7.0/test-sequencer-29.7.0.tgz", + "integrity": "sha1-bO+XfOHTmDSjrqiHoXJmKKbwcs4=", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jest/transform/29.7.0/transform-29.7.0.tgz", + "integrity": "sha1-3y3Zw0bH13aLigZjmZRkDGQuKEw=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.17.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@modelcontextprotocol/sdk/-/sdk-1.17.1.tgz", + "integrity": "sha512-CPle1OQehbWqd25La9Ack5B07StKIxh4+Bf19qnpZKJC1oI22Y0czZHbifjw1UoczIfKBwBDAp/dFxvHG13B5A==", + "license": "MIT", + "dependencies": { "ajv": "^6.12.6", "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.0", - "express": "^5.0.1", - "express-rate-limit": "^7.5.0", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.24.1" + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/express": { + "version": "5.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/qs": { + "version": "6.14.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/send": { + "version": "1.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@sinclair/typebox/0.27.8/typebox-0.27.8.tgz", + "integrity": "sha1-Zmf6wWxDa1Q0o4ejTe2wExmPbm4=", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@sinonjs/commons/3.0.1/commons-3.0.1.tgz", + "integrity": "sha1-ECk1fkTKkBphVYX20nc428iQhM0=", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@sinonjs/fake-timers/10.3.0/fake-timers-10.3.0.tgz", + "integrity": "sha1-Vf3/Hsq581QBkSna9N8N1Nkj6mY=", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/babel__generator/7.6.8/babel__generator-7.6.8.tgz", + "integrity": "sha1-+DbGH0ixNG59Kw2TxtrMW5U106s=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/babel__template/7.4.4/babel__template-7.4.4.tgz", + "integrity": "sha1-VnJRNwHBshmbxtrWNqnXSRWGdm8=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/body-parser/1.19.5/body-parser-1.19.5.tgz", + "integrity": "sha1-BM6aO2d9yL1oGhfaGrmDXcnT7eQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.23", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/http-errors/2.0.4/http-errors-2.0.4.tgz", + "integrity": "sha1-frR3JsORtzRabsNa1/TeRpz1uk8=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/istanbul-lib-report/3.0.3/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha1-UwR2FK5y4Z/AQB2HLeOuK0zjUL8=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/mime/1.3.5/mime-1.3.5.tgz", + "integrity": "sha1-HvMC4Bz30rWg+lJnkMkSO/HQZpA=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.9", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/node/-/node-20.19.9.tgz", + "integrity": "sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/qs": { + "version": "6.9.18", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/range-parser/1.2.7/range-parser-1.2.7.tgz", + "integrity": "sha1-UK5DU+qt3AQEQnmBL1LIxlhX28s=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/send/0.17.4/send-0.17.4.tgz", + "integrity": "sha1-ZhnNJOcnB5NwLk5qS5WKkBDPxXo=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/serve-static/1.15.7/serve-static-1.15.7.tgz", + "integrity": "sha1-IhdLvXT7l/4wMQlzjptcLzBk9xQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/stack-utils/2.0.3/stack-utils-2.0.3.tgz", + "integrity": "sha1-YgkyHrLBcSp+dGZCK4yx/A2d1dg=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/yargs-parser/21.0.3/yargs-parser-21.0.3.tgz", + "integrity": "sha1-gV4wt4bS6PDc2F/VvPXhoE0AjxU=", + "dev": true, + "license": "MIT" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/babel-jest/29.7.0/babel-jest-29.7.0.tgz", + "integrity": "sha1-9DaZGSJbaExWCFmYrGPb0FvgINU=", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/babel-plugin-istanbul/6.1.1/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha1-+ojsWSMv2bTjbbvFQKjsmptH2nM=", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/istanbul-lib-instrument/5.2.1/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha1-0QyIhcISVXThwjHKyt+VVnXhzj0=", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/babel-plugin-jest-hoist/29.6.3/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha1-qtvpQ0ZBgqiSLDySfDBn/0DSRiY=", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/babel-preset-jest/29.6.3/babel-preset-jest-29.6.3.tgz", + "integrity": "sha1-+gX6UQ59STiW17DdIDNgHIQPFxw=", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/camelcase/5.3.1/camelcase-5.3.1.tgz", + "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001727", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", + "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/char-regex/1.0.2/char-regex-1.0.2.tgz", + "integrity": "sha1-10Q1giYhf5ge1Y9Hmx1rzClUXc8=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/co/4.6.0/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/collect-v8-coverage/1.0.2/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha1-wLKbzTO80HeaE0TCE2BR5q/T2ek=", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/commander/11.1.0/commander-11.1.0.tgz", + "integrity": "sha1-Yv3OdgBqaOXBqzMU3JLoAOuD2QY=", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/create-jest/29.7.0/create-jest-29.7.0.tgz", + "integrity": "sha1-o1XFs8seGvAroXf+ev1/7uSaUyA=", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/dedent": { + "version": "1.6.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/dedent/-/dedent-1.6.0.tgz", + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/detect-newline/3.1.0/detect-newline-3.1.0.tgz", + "integrity": "sha1-V29d/GOuGhkv8ZLYrTr2MImRtlE=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/diff-sequences/29.6.3/diff-sequences-29.6.3.tgz", + "integrity": "sha1-Ter4lNEUB8Ue/IQYAS+ecLhOqSE=", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ejs/3.1.10/ejs-3.1.10.tgz", + "integrity": "sha1-aauDWLFOiW+AzDnmIIe4hQDDrDs=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.191", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/electron-to-chromium/-/electron-to-chromium-1.5.191.tgz", + "integrity": "sha512-xcwe9ELcuxYLUFqZZxL19Z6HVKcvNkIwhbHUz7L3us6u12yR+7uY89dSl570f/IqNthx8dAw3tojG7i4Ni4tDA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/emittery/0.13.1/emittery-0.13.1.tgz", + "integrity": "sha1-wEuMNFdJDghHrlH87Tr1LTOOPa0=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/esbuild/-/esbuild-0.25.8.tgz", + "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" }, "engines": { "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.8", + "@esbuild/android-arm": "0.25.8", + "@esbuild/android-arm64": "0.25.8", + "@esbuild/android-x64": "0.25.8", + "@esbuild/darwin-arm64": "0.25.8", + "@esbuild/darwin-x64": "0.25.8", + "@esbuild/freebsd-arm64": "0.25.8", + "@esbuild/freebsd-x64": "0.25.8", + "@esbuild/linux-arm": "0.25.8", + "@esbuild/linux-arm64": "0.25.8", + "@esbuild/linux-ia32": "0.25.8", + "@esbuild/linux-loong64": "0.25.8", + "@esbuild/linux-mips64el": "0.25.8", + "@esbuild/linux-ppc64": "0.25.8", + "@esbuild/linux-riscv64": "0.25.8", + "@esbuild/linux-s390x": "0.25.8", + "@esbuild/linux-x64": "0.25.8", + "@esbuild/netbsd-arm64": "0.25.8", + "@esbuild/netbsd-x64": "0.25.8", + "@esbuild/openbsd-arm64": "0.25.8", + "@esbuild/openbsd-x64": "0.25.8", + "@esbuild/openharmony-arm64": "0.25.8", + "@esbuild/sunos-x64": "0.25.8", + "@esbuild/win32-arm64": "0.25.8", + "@esbuild/win32-ia32": "0.25.8", + "@esbuild/win32-x64": "0.25.8" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { "version": "2.0.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", "license": "MIT", "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" + "eventsource-parser": "^3.0.1" }, "engines": { - "node": ">=18" + "node": ">=18.0.0" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "node_modules/eventsource-parser": { + "version": "3.0.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eventsource-parser/-/eventsource-parser-3.0.3.tgz", + "integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "5.2.1" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/exit/0.1.2/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, "engines": { - "node": ">=6.6.0" + "node": ">= 0.8.0" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/debug": { - "version": "4.4.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/expect/29.7.0/expect-29.7.0.tgz", + "integrity": "sha1-V4h0WQ3LMhRRQITAgRXYruYeEbw=", + "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/express": { - "version": "5.1.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "license": "MIT", "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": ">= 18" + "node": ">= 0.10.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/filelist/1.0.4/filelist-1.0.4.tgz", + "integrity": "sha1-94l4oelEd1/55i50RCTyFeWDUrU=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">=10" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, "engines": { "node": ">= 0.8" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/find-up/4.1.0/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", + "dev": true, "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, "engines": { "node": ">= 0.6" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { + "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 0.6" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/send": { - "version": "1.2.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, "engines": { - "node": ">= 18" + "node": ">=6.9.0" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", "engines": { - "node": ">= 18" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/body-parser/1.19.5/body-parser-1.19.5.tgz", - "integrity": "sha1-BM6aO2d9yL1oGhfaGrmDXcnT7eQ=", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-package-type/0.1.0/get-package-type-0.1.0.tgz", + "integrity": "sha1-jeLYA8/0TfO8bEVuZmizbDkm4Ro=", "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@types/express": { - "version": "4.17.23", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/express/-/express-4.17.23.tgz", - "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", - "dev": true, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "license": "MIT", "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/http-errors/2.0.4/http-errors-2.0.4.tgz", - "integrity": "sha1-frR3JsORtzRabsNa1/TeRpz1uk8=", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/mime/1.3.5/mime-1.3.5.tgz", - "integrity": "sha1-HvMC4Bz30rWg+lJnkMkSO/HQZpA=", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.9", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/node/-/node-20.19.9.tgz", - "integrity": "sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==", + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/qs": { - "version": "6.9.18", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/range-parser/1.2.7/range-parser-1.2.7.tgz", - "integrity": "sha1-UK5DU+qt3AQEQnmBL1LIxlhX28s=", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/send/0.17.4/send-0.17.4.tgz", - "integrity": "sha1-ZhnNJOcnB5NwLk5qS5WKkBDPxXo=", + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@types/mime": "^1", - "@types/node": "*" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/serve-static/1.15.7/serve-static-1.15.7.tgz", - "integrity": "sha1-IhdLvXT7l/4wMQlzjptcLzBk9xQ=", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" + "engines": { + "node": ">=8" } }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, "engines": { - "node": ">= 0.6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "function-bind": "^1.1.2" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">= 0.4" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/html-escaper/2.0.2/html-escaper-2.0.2.tgz", + "integrity": "sha1-39YAJ9o2o238viNiYsAKWCJoFFM=", + "dev": true, "license": "MIT" }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">= 0.8" } }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/body-parser/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">= 0.8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=0.8.19" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "license": "ISC", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">= 0.10" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -982,521 +3429,947 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/commander/11.1.0/commander-11.1.0.tgz", - "integrity": "sha1-Yv3OdgBqaOXBqzMU3JLoAOuD2QY=", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "license": "MIT", "engines": { - "node": ">=16" + "node": ">=8" } }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-generator-fn/2.1.0/is-generator-fn-2.1.0.tgz", + "integrity": "sha1-fRQK3DiarzARqPKipM+m+q3/sRg=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/istanbul-lib-coverage/3.2.2/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha1-LRZsSwZE1Do58Ev2wu3R5YXzF1Y=", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "safe-buffer": "5.2.1" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/istanbul-lib-report/3.0.1/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha1-kIMFusmlvRdaxqdEier9D8JEWn0=", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/istanbul-lib-source-maps/4.0.1/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha1-iV86cJ/PujTG3lpCk5Ai8+Q1hVE=", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">= 0.6" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, "license": "MIT" }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/istanbul-reports/3.1.7/istanbul-reports-3.1.7.tgz", + "integrity": "sha1-2u0SueHcpRjhXAVuHlN+dBKA+gs=", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "object-assign": "^4", - "vary": "^1" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">=8" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" }, "engines": { - "node": ">= 8" + "node": ">=10" } }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-changed-files/29.7.0/jest-changed-files-29.7.0.tgz", + "integrity": "sha1-HAbQfnfHjhWF0CBCTe3BDW4XrDo=", + "dev": true, "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, "engines": { - "node": ">= 0.8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-circus/29.7.0/jest-circus-29.7.0.tgz", + "integrity": "sha1-toF6RfzINdixbVli0MAmRz7jZoo=", + "dev": true, "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-cli/29.7.0/jest-cli-29.7.0.tgz", + "integrity": "sha1-VZLJQHmODK5nfuwWkmTy2DmjeZU=", + "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-config/29.7.0/jest-config-29.7.0.tgz", + "integrity": "sha1-vL2ogG28wBseMWpGu3QIWoSwJF8=", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">= 0.8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-diff/29.7.0/jest-diff-29.7.0.tgz", + "integrity": "sha1-AXk0pm67fs9vIF6EaZvhCv1wRYo=", + "dev": true, "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-docblock/29.7.0/jest-docblock-29.7.0.tgz", + "integrity": "sha1-j922rcPNyVXJPiqH9hz9NQ1dEZo=", + "dev": true, "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-each/29.7.0/jest-each-29.7.0.tgz", + "integrity": "sha1-FiqbPyMovdmRvqq/+7dHReVld9E=", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0" + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/esbuild": { - "version": "0.25.8", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/esbuild/-/esbuild-0.25.8.tgz", - "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-environment-node/29.7.0/jest-environment-node-29.7.0.tgz", + "integrity": "sha1-C5PhEd2o7BILyDAObR+5V24WQ3Y=", "dev": true, - "hasInstallScript": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.8", - "@esbuild/android-arm": "0.25.8", - "@esbuild/android-arm64": "0.25.8", - "@esbuild/android-x64": "0.25.8", - "@esbuild/darwin-arm64": "0.25.8", - "@esbuild/darwin-x64": "0.25.8", - "@esbuild/freebsd-arm64": "0.25.8", - "@esbuild/freebsd-x64": "0.25.8", - "@esbuild/linux-arm": "0.25.8", - "@esbuild/linux-arm64": "0.25.8", - "@esbuild/linux-ia32": "0.25.8", - "@esbuild/linux-loong64": "0.25.8", - "@esbuild/linux-mips64el": "0.25.8", - "@esbuild/linux-ppc64": "0.25.8", - "@esbuild/linux-riscv64": "0.25.8", - "@esbuild/linux-s390x": "0.25.8", - "@esbuild/linux-x64": "0.25.8", - "@esbuild/netbsd-arm64": "0.25.8", - "@esbuild/netbsd-x64": "0.25.8", - "@esbuild/openbsd-arm64": "0.25.8", - "@esbuild/openbsd-x64": "0.25.8", - "@esbuild/openharmony-arm64": "0.25.8", - "@esbuild/sunos-x64": "0.25.8", - "@esbuild/win32-arm64": "0.25.8", - "@esbuild/win32-ia32": "0.25.8", - "@esbuild/win32-x64": "0.25.8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/eventsource": { - "version": "3.0.7", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, "license": "MIT", "dependencies": { - "eventsource-parser": "^3.0.1" + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/eventsource-parser": { - "version": "3.0.3", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eventsource-parser/-/eventsource-parser-3.0.3.tgz", - "integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==", - "license": "MIT", - "engines": { - "node": ">=20.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-leak-detector/29.7.0/jest-leak-detector-29.7.0.tgz", + "integrity": "sha1-W37A2t/f7Ayjg9yaoBbTa16kxyg=", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-matcher-utils/29.7.0/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha1-ro/sef8kn9WSzoDj7kdOg6bETxI=", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/express-rate-limit": { - "version": "7.5.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/express-rate-limit/-/express-rate-limit-7.5.1.tgz", - "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-message-util/29.7.0/jest-message-util-29.7.0.tgz", + "integrity": "sha1-i8OS4gTpXf51ZKu+cqQE4o5R9/M=", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, "engines": { - "node": ">= 16" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-mock/29.7.0/jest-mock-29.7.0.tgz", + "integrity": "sha1-ToNs9g6Zxvz6vp+Z0Bfz/dUKY0c=", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" }, "peerDependencies": { - "express": ">= 4.11" + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-resolve-dependencies/29.7.0/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha1-GwTywJXzf8d2/0CAPckpIbHohCg=", + "dev": true, "license": "MIT", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": ">= 0.8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-runner/29.7.0/jest-runner-29.7.0.tgz", + "integrity": "sha1-gJrwctQIpT3P0uhJpMl20xMvcY4=", + "dev": true, "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, "engines": { - "node": ">= 0.6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-runtime/29.7.0/jest-runtime-29.7.0.tgz", + "integrity": "sha1-7+yzFBz303Z6OgzI98mZBYfT2Bc=", + "dev": true, "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, "engines": { - "node": ">= 0.6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-snapshot/29.7.0/jest-snapshot-29.7.0.tgz", + "integrity": "sha1-wsV0w/UYZdobsykDZ3imm/iKa+U=", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-watcher/29.7.0/jest-watcher-29.7.0.tgz", + "integrity": "sha1-eBDTDWGcOmIJMiPOa7NZyhsoovI=", + "dev": true, "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/get-tsconfig": { - "version": "4.10.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-tsconfig/-/get-tsconfig-4.10.1.tgz", - "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", "dependencies": { - "resolve-pkg-maps": "^1.0.0" + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" + "bin": { + "jsesc": "bin/jsesc" }, "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">= 0.8" + "node": ">=6" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/locate-path/5.0.0/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", + "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/make-dir/4.0.0/make-dir-4.0.0.tgz", + "integrity": "sha1-w8IwencSd82WODBfkVwprnQbYU4=", + "dev": true, "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, "engines": { - "node": ">= 0.10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, "license": "ISC" }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } }, "node_modules/math-intrinsics": { "version": "1.1.0", @@ -1525,6 +4398,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/methods/-/methods-1.1.2.tgz", @@ -1534,6 +4414,20 @@ "node": ">= 0.6" } }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime/-/mime-1.6.0.tgz", @@ -1567,12 +4461,42 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/negotiator/-/negotiator-0.6.3.tgz", @@ -1582,6 +4506,43 @@ "node": ">= 0.6" } }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/object-assign/-/object-assign-4.1.1.tgz", @@ -1624,6 +4585,96 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/p-locate/4.1.0/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/parseurl/-/parseurl-1.3.3.tgz", @@ -1633,6 +4684,26 @@ "node": ">= 0.8" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-key/-/path-key-3.1.1.tgz", @@ -1642,12 +4713,49 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-to-regexp/-/path-to-regexp-0.1.12.tgz", "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "license": "MIT" }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/pkce-challenge": { "version": "5.0.0", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/pkce-challenge/-/pkce-challenge-5.0.0.tgz", @@ -1657,6 +4765,61 @@ "node": ">=16.20.0" } }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/pkg-dir/4.2.0/pkg-dir-4.2.0.tgz", + "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -1679,6 +4842,23 @@ "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/qs/-/qs-6.13.0.tgz", @@ -1718,6 +4898,67 @@ "node": ">= 0.8" } }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/resolve-cwd/3.0.0/resolve-cwd-3.0.0.tgz", + "integrity": "sha1-DwB18bslRHZs9zumpuKt/ryxPy0=", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -1728,6 +4969,16 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/router": { "version": "2.2.0", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/router/-/router-2.2.0.tgz", @@ -1802,6 +5053,16 @@ "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", "license": "MIT" }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/send": { "version": "0.19.0", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/send/-/send-0.19.0.tgz", @@ -1955,6 +5216,71 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/source-map-support/0.5.13/source-map-support-0.5.13.tgz", + "integrity": "sha1-MbJKnC5zwt6FBmwP631Edn7VKTI=", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/stack-utils/2.0.6/stack-utils-2.0.6.tgz", + "integrity": "sha1-qvB0gWnAL8M8gjKrzPkz9Uocw08=", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/statuses/-/statuses-2.0.1.tgz", @@ -1964,6 +5290,142 @@ "node": ">= 0.8" } }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/string-length/4.0.2/string-length-4.0.2.tgz", + "integrity": "sha1-qKjce9XBqCubPIuH4SX2aHG25Xo=", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/test-exclude/6.0.0/test-exclude-6.0.0.tgz", + "integrity": "sha1-BKhphmHYBepvopO2y55jrARO8V4=", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/toidentifier/-/toidentifier-1.0.1.tgz", @@ -1973,6 +5435,82 @@ "node": ">=0.6" } }, + "node_modules/ts-jest": { + "version": "29.3.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ts-jest/-/ts-jest-29.3.2.tgz", + "integrity": "sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.1", + "type-fest": "^4.39.1", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tsx": { "version": "4.20.3", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/tsx/-/tsx-4.20.3.tgz", @@ -1993,6 +5531,29 @@ "fsevents": "~2.3.3" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/type-detect/4.0.8/type-detect-4.0.8.tgz", + "integrity": "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/type-is/-/type-is-1.6.18.tgz", @@ -2036,6 +5597,37 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/uri-js/-/uri-js-4.4.1.tgz", @@ -2054,6 +5646,21 @@ "node": ">= 0.4.0" } }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/vary/-/vary-1.1.2.tgz", @@ -2063,6 +5670,16 @@ "node": ">= 0.8" } }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/which/-/which-2.0.2.tgz", @@ -2078,12 +5695,103 @@ "node": ">= 8" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/wrappy/1.0.2/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "license": "ISC" }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/write-file-atomic/4.0.2/write-file-atomic-4.0.2.tgz", + "integrity": "sha1-qd8Brlt3hYoCf9LoB2juQzVV/P0=", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { "version": "3.25.76", "resolved": "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/zod/-/zod-3.25.76.tgz", diff --git a/auth-compat/package.json b/auth-compat/package.json index 3845c1966..9accb5f07 100644 --- a/auth-compat/package.json +++ b/auth-compat/package.json @@ -11,7 +11,16 @@ "build": "tsc", "dev": "tsx src/cli/index.ts", "test-validation-server": "tsx src/test-validation-server.ts", - "cli": "tsx src/cli/index.ts" + "cli": "tsx src/cli/index.ts", + "test": "jest", + "test:watch": "jest --watch", + "test:coverage": "jest --coverage", + "test:verbose": "VERBOSE=true jest --verbose", + "test:basic": "jest basic-compliance", + "test:oauth": "jest oauth-compliance", + "test:metadata": "jest metadata-location", + "test:behavior": "jest client-behavior", + "test:with-client": "CLIENT_COMMAND=\"$npm_config_client\" jest" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.0.0", @@ -21,7 +30,10 @@ }, "devDependencies": { "@types/express": "^4.17.0", + "@types/jest": "^29.5.0", "@types/node": "^20.0.0", + "jest": "^29.7.0", + "ts-jest": "^29.1.0", "tsx": "^4.0.0", "typescript": "^5.0.0" } diff --git a/auth-compat/src/__tests__/basic-compliance.test.ts b/auth-compat/src/__tests__/basic-compliance.test.ts new file mode 100644 index 000000000..37b935455 --- /dev/null +++ b/auth-compat/src/__tests__/basic-compliance.test.ts @@ -0,0 +1,35 @@ +import { describe, test, expect, beforeAll } from '@jest/globals'; +import { runComplianceTest, printVerboseOutput } from './helpers/test-utils.js'; + +// Get client command from environment or use a default +const CLIENT_COMMAND = process.env.CLIENT_COMMAND || 'tsx examples/typescript-client/test-client.ts'; +const VERBOSE = process.env.VERBOSE === 'true'; + +describe('Basic Compliance', () => { + describe('Tests basic MCP protocol compliance without authentication', () => { + test('Basic MCP Connection - Client can connect and list tools without auth', async () => { + const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( + CLIENT_COMMAND, + { + authRequired: false + }, + { + timeout: 30000, + verbose: VERBOSE + } + ); + + // Print verbose output if requested + if (VERBOSE) { + printVerboseOutput(report, behavior, authServerTrace, clientOutput); + } + + // Assertions + expect(report).toHavePassedCompliance(); + expect(clientOutput.exitCode).toBe(0); + expect(clientOutput.timedOut).toBe(false); + expect(behavior.connected).toBe(true); + expect(behavior.initialized).toBe(true); + }); + }); +}); \ No newline at end of file diff --git a/auth-compat/src/__tests__/client-behavior.test.ts b/auth-compat/src/__tests__/client-behavior.test.ts new file mode 100644 index 000000000..eb6506d86 --- /dev/null +++ b/auth-compat/src/__tests__/client-behavior.test.ts @@ -0,0 +1,108 @@ +import { describe, test, expect } from '@jest/globals'; +import { runComplianceTest, validateClientBehavior, printVerboseOutput } from './helpers/test-utils.js'; + +// Get client command from environment or use a default +const CLIENT_COMMAND = process.env.CLIENT_COMMAND || 'tsx examples/typescript-client/test-client.ts'; +const VERBOSE = process.env.VERBOSE === 'true'; + +describe('Client Behavior Validation', () => { + describe('Tests specific client behaviors', () => { + + test('Client requests metadata', async () => { + const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( + CLIENT_COMMAND, + { + authRequired: true + }, + { + timeout: 30000, + verbose: VERBOSE + } + ); + + if (VERBOSE) { + printVerboseOutput(report, behavior, authServerTrace, clientOutput); + } + + // Validate specific behaviors + const behaviorErrors = validateClientBehavior(behavior, { + authMetadataRequested: true, + initialized: true, + connected: true, + authFlowCompleted: true + }); + + // Assertions + expect(behaviorErrors).toHaveLength(0); + expect(report).toHavePassedCompliance(); + expect(clientOutput.exitCode).toBe(0); + + // Detailed behavior checks + expect(behavior.authMetadataRequested).toBe(true); + expect(behavior.initialized).toBe(true); + expect(behavior.connected).toBe(true); + expect(behavior.authFlowCompleted).toBe(true); + + // Check that proper requests were made + expect(behavior.requestsMade).toContain('initialize'); + }); + + test('Client handles auth failure gracefully', async () => { + // This test could be expanded to test failure scenarios + // For now, we'll test a basic auth required scenario + const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( + CLIENT_COMMAND, + { + authRequired: true, + metadataLocation: '/.well-known/oauth-protected-resource', + includeWwwAuthenticate: true + }, + { + timeout: 30000, + verbose: VERBOSE + } + ); + + if (VERBOSE) { + printVerboseOutput(report, behavior, authServerTrace, clientOutput); + } + + // Check that client properly attempted auth + expect(behavior.authMetadataRequested).toBe(true); + + // If auth succeeded, these should be true + if (clientOutput.exitCode === 0) { + expect(behavior.authFlowCompleted).toBe(true); + expect(behavior.initialized).toBe(true); + } + }); + + test('Client behavior without auth requirement', async () => { + const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( + CLIENT_COMMAND, + { + authRequired: false + }, + { + timeout: 30000, + verbose: VERBOSE + } + ); + + if (VERBOSE) { + printVerboseOutput(report, behavior, authServerTrace, clientOutput); + } + + // Without auth requirement, client should connect directly + expect(behavior.connected).toBe(true); + expect(behavior.initialized).toBe(true); + + // Should not attempt auth flow + expect(behavior.authMetadataRequested).toBe(false); + expect(behavior.authFlowCompleted).toBe(false); + + // Should have no auth server traces + expect(authServerTrace).toHaveLength(0); + }); + }); +}); \ No newline at end of file diff --git a/auth-compat/src/__tests__/helpers/test-utils.ts b/auth-compat/src/__tests__/helpers/test-utils.ts new file mode 100644 index 000000000..2dba03c12 --- /dev/null +++ b/auth-compat/src/__tests__/helpers/test-utils.ts @@ -0,0 +1,275 @@ +import { spawn, ChildProcess } from 'child_process'; +import { ValidationServer } from '../../server/validation/index.js'; +import { ValidationServerConfig, ComplianceReport, TestResult, HttpTrace } from '../../types.js'; +import { displayTraces } from '../../middleware/http-trace.js'; + +export interface ClientExecutionResult { + exitCode: number; + stdout: string; + stderr: string; + timedOut: boolean; +} + +export interface TestContext { + server: ValidationServer; + serverUrl: string; + serverPort: number; +} + +/** + * Sets up a validation server for testing + */ +export async function setupTestServer( + config: ValidationServerConfig = {}, + verbose: boolean = false +): Promise { + const server = new ValidationServer(config, verbose); + const serverPort = await server.start(); + const serverUrl = `http://localhost:${serverPort}/mcp`; + + return { + server, + serverUrl, + serverPort + }; +} + +/** + * Tears down a test server + */ +export async function teardownTestServer(context: TestContext): Promise { + await context.server.stop(); +} + +/** + * Executes a client command with the given server URL + */ +export async function executeClient( + clientCommand: string, + serverUrl: string, + timeout: number = 30000 +): Promise { + const commandParts = clientCommand.split(' '); + const executable = commandParts[0]; + const args = [...commandParts.slice(1), serverUrl]; + + let stdout = ''; + let stderr = ''; + let timedOut = false; + + const clientProcess = spawn(executable, args, { + stdio: 'pipe', + shell: true, + timeout + }); + + clientProcess.stdout?.on('data', (data) => { + stdout += data.toString(); + }); + + clientProcess.stderr?.on('data', (data) => { + stderr += data.toString(); + }); + + const exitCode = await new Promise((resolve, reject) => { + const timeoutHandle = setTimeout(() => { + timedOut = true; + clientProcess.kill(); + reject(new Error(`Client execution timed out after ${timeout}ms`)); + }, timeout); + + clientProcess.on('exit', (code) => { + clearTimeout(timeoutHandle); + if (!timedOut) { + resolve(code || 0); + } + }); + + clientProcess.on('error', (error) => { + clearTimeout(timeoutHandle); + reject(error); + }); + }).catch((error) => { + if (timedOut) { + return -1; // Return special exit code for timeout + } + throw error; + }); + + return { + exitCode, + stdout, + stderr, + timedOut + }; +} + +/** + * Runs a complete compliance test scenario + */ +export async function runComplianceTest( + clientCommand: string, + serverConfig: ValidationServerConfig, + options: { + timeout?: number; + verbose?: boolean; + } = {} +): Promise<{ + report: ComplianceReport; + clientOutput: ClientExecutionResult; + behavior: any; + authServerTrace: HttpTrace[]; +}> { + const { timeout = 30000, verbose = false } = options; + const context = await setupTestServer(serverConfig, verbose); + + try { + // Execute the client + const clientOutput = await executeClient(clientCommand, context.serverUrl, timeout); + + // Get validation results + const results = context.server.getValidationResults(); + const behavior = context.server.getClientBehavior(); + const authServerTrace = serverConfig.authRequired && context.server.authServer + ? context.server.authServer.getHttpTrace() + : []; + + // Generate compliance report + const report: ComplianceReport = { + overall_result: results.every(r => r.result === 'PASS') && + clientOutput.exitCode === 0 ? 'PASS' : 'FAIL', + test_suite: 'jest-test', + timestamp: new Date().toISOString(), + client_command: clientCommand, + tests_passed: results.filter(r => r.result === 'PASS').length, + tests_failed: results.filter(r => r.result === 'FAIL').length, + tests: results + }; + + return { + report, + clientOutput, + behavior, + authServerTrace + }; + } finally { + await teardownTestServer(context); + } +} + +/** + * Custom Jest matchers for compliance testing + */ +export function toHavePassedCompliance( + report: ComplianceReport +): { pass: boolean; message: () => string } { + const pass = report.overall_result === 'PASS'; + + const message = () => { + if (pass) { + return `Expected compliance test to fail, but it passed`; + } else { + const failures = report.tests + .filter(t => t.result === 'FAIL') + .map(t => ` - ${t.name}: ${t.errors?.join(', ') || 'Failed'}`) + .join('\n'); + + return `Expected compliance test to pass, but it failed:\n${failures}`; + } + }; + + return { pass, message }; +} + +/** + * Helper to validate client behavior + */ +export function validateClientBehavior( + behavior: any, + expectations: { + authMetadataRequested?: boolean; + authFlowCompleted?: boolean; + initialized?: boolean; + connected?: boolean; + } +): string[] { + const errors: string[] = []; + + if (expectations.authMetadataRequested !== undefined && + behavior.authMetadataRequested !== expectations.authMetadataRequested) { + errors.push(`Expected authMetadataRequested to be ${expectations.authMetadataRequested}, but was ${behavior.authMetadataRequested}`); + } + + if (expectations.authFlowCompleted !== undefined && + behavior.authFlowCompleted !== expectations.authFlowCompleted) { + errors.push(`Expected authFlowCompleted to be ${expectations.authFlowCompleted}, but was ${behavior.authFlowCompleted}`); + } + + if (expectations.initialized !== undefined && + behavior.initialized !== expectations.initialized) { + errors.push(`Expected initialized to be ${expectations.initialized}, but was ${behavior.initialized}`); + } + + if (expectations.connected !== undefined && + behavior.connected !== expectations.connected) { + errors.push(`Expected connected to be ${expectations.connected}, but was ${behavior.connected}`); + } + + return errors; +} + +/** + * Helper to print verbose test output + */ +export function printVerboseOutput( + report: ComplianceReport, + behavior: any, + authServerTrace: HttpTrace[], + clientOutput: ClientExecutionResult +): void { + console.log('\n=== Test Results ==='); + console.log(`Overall Result: ${report.overall_result}`); + console.log(`Tests Passed: ${report.tests_passed}`); + console.log(`Tests Failed: ${report.tests_failed}`); + + if (report.tests_failed > 0) { + console.log('\nFailed Tests:'); + report.tests.forEach(test => { + if (test.result === 'FAIL') { + console.log(` - ${test.name}`); + test.errors?.forEach(error => { + console.log(` ${error}`); + }); + } + }); + } + + console.log('\n=== HTTP Traces ==='); + displayTraces(behavior.httpTrace || [], authServerTrace); + + if (clientOutput.stdout || clientOutput.stderr) { + console.log('\n=== Client Output ==='); + if (clientOutput.stdout) { + console.log('STDOUT:', clientOutput.stdout); + } + if (clientOutput.stderr) { + console.log('STDERR:', clientOutput.stderr); + } + } +} + +// Extend Jest matchers +declare global { + namespace jest { + interface Matchers { + toHavePassedCompliance(): R; + } + } +} + +// Register custom matchers with Jest +if (typeof expect !== 'undefined' && expect.extend) { + expect.extend({ + toHavePassedCompliance + }); +} \ No newline at end of file diff --git a/auth-compat/src/__tests__/metadata-location.test.ts b/auth-compat/src/__tests__/metadata-location.test.ts new file mode 100644 index 000000000..fd940ba97 --- /dev/null +++ b/auth-compat/src/__tests__/metadata-location.test.ts @@ -0,0 +1,128 @@ +import { describe, test, expect } from '@jest/globals'; +import { runComplianceTest, printVerboseOutput } from './helpers/test-utils.js'; + +// Get client command from environment or use a default +const CLIENT_COMMAND = process.env.CLIENT_COMMAND || 'tsx examples/typescript-client/test-client.ts'; +const VERBOSE = process.env.VERBOSE === 'true'; + +describe('Metadata Location Tests', () => { + describe('Tests different OAuth protected resource metadata locations', () => { + + test('Standard location with WWW-Authenticate', async () => { + const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( + CLIENT_COMMAND, + { + authRequired: true, + metadataLocation: '/.well-known/oauth-protected-resource', + includeWwwAuthenticate: true + }, + { + timeout: 30000, + verbose: VERBOSE + } + ); + + if (VERBOSE) { + printVerboseOutput(report, behavior, authServerTrace, clientOutput); + } + + expect(report).toHavePassedCompliance(); + expect(clientOutput.exitCode).toBe(0); + expect(behavior.authMetadataRequested).toBe(true); + }); + + test('Non-standard location with WWW-Authenticate - Custom metadata path advertised via WWW-Authenticate header', async () => { + const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( + CLIENT_COMMAND, + { + authRequired: true, + metadataLocation: '/custom/oauth/metadata', + includeWwwAuthenticate: true + }, + { + timeout: 30000, + verbose: VERBOSE + } + ); + + if (VERBOSE) { + printVerboseOutput(report, behavior, authServerTrace, clientOutput); + } + + expect(report).toHavePassedCompliance(); + expect(clientOutput.exitCode).toBe(0); + expect(behavior.authMetadataRequested).toBe(true); + }); + + test('Nested well-known path with WWW-Authenticate', async () => { + const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( + CLIENT_COMMAND, + { + authRequired: true, + metadataLocation: '/.well-known/oauth-protected-resource/mcp', + includeWwwAuthenticate: true + }, + { + timeout: 30000, + verbose: VERBOSE + } + ); + + if (VERBOSE) { + printVerboseOutput(report, behavior, authServerTrace, clientOutput); + } + + expect(report).toHavePassedCompliance(); + expect(clientOutput.exitCode).toBe(0); + expect(behavior.authMetadataRequested).toBe(true); + }); + + test('Standard location without WWW-Authenticate - Client should find metadata at standard location', async () => { + const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( + CLIENT_COMMAND, + { + authRequired: true, + metadataLocation: '/.well-known/oauth-protected-resource', + includeWwwAuthenticate: false + }, + { + timeout: 30000, + verbose: VERBOSE + } + ); + + if (VERBOSE) { + printVerboseOutput(report, behavior, authServerTrace, clientOutput); + } + + expect(report).toHavePassedCompliance(); + expect(clientOutput.exitCode).toBe(0); + expect(behavior.authMetadataRequested).toBe(true); + }); + + test('Non-standard location without WWW-Authenticate - Client cannot find metadata without header hint', async () => { + const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( + CLIENT_COMMAND, + { + authRequired: true, + metadataLocation: '/custom/oauth/metadata', + includeWwwAuthenticate: false + }, + { + timeout: 30000, + verbose: VERBOSE + } + ); + + if (VERBOSE) { + printVerboseOutput(report, behavior, authServerTrace, clientOutput); + } + + // This test expects the client to FAIL + expect(report.overall_result).toBe('FAIL'); + expect(clientOutput.exitCode).not.toBe(0); + // Client should not be able to complete auth flow without finding metadata + expect(behavior.authFlowCompleted).toBe(false); + }); + }); +}); \ No newline at end of file diff --git a/auth-compat/src/__tests__/oauth-compliance.test.ts b/auth-compat/src/__tests__/oauth-compliance.test.ts new file mode 100644 index 000000000..0deba0d24 --- /dev/null +++ b/auth-compat/src/__tests__/oauth-compliance.test.ts @@ -0,0 +1,40 @@ +import { describe, test, expect } from '@jest/globals'; +import { runComplianceTest, printVerboseOutput } from './helpers/test-utils.js'; + +// Get client command from environment or use a default +const CLIENT_COMMAND = process.env.CLIENT_COMMAND || 'tsx examples/typescript-client/test-client.ts'; +const VERBOSE = process.env.VERBOSE === 'true'; + +describe('OAuth Compliance', () => { + describe('Tests OAuth2/OIDC authorization flow', () => { + test('Standard OAuth Flow - Client completes OAuth flow with default settings', async () => { + const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( + CLIENT_COMMAND, + { + authRequired: true + }, + { + timeout: 30000, + verbose: VERBOSE + } + ); + + // Print verbose output if requested + if (VERBOSE) { + printVerboseOutput(report, behavior, authServerTrace, clientOutput); + } + + // Assertions + expect(report).toHavePassedCompliance(); + expect(clientOutput.exitCode).toBe(0); + expect(clientOutput.timedOut).toBe(false); + expect(behavior.connected).toBe(true); + expect(behavior.initialized).toBe(true); + expect(behavior.authMetadataRequested).toBe(true); + expect(behavior.authFlowCompleted).toBe(true); + + // Verify auth server was contacted + expect(authServerTrace.length).toBeGreaterThan(0); + }); + }); +}); \ No newline at end of file From 322ba6b9a8b97e3c28fda85298502d4b2af4ea2d Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Mon, 11 Aug 2025 18:08:17 +0100 Subject: [PATCH 20/27] dry up metadata test --- .../src/__tests__/metadata-location.test.ts | 179 +++++++++--------- 1 file changed, 89 insertions(+), 90 deletions(-) diff --git a/auth-compat/src/__tests__/metadata-location.test.ts b/auth-compat/src/__tests__/metadata-location.test.ts index fd940ba97..87147c946 100644 --- a/auth-compat/src/__tests__/metadata-location.test.ts +++ b/auth-compat/src/__tests__/metadata-location.test.ts @@ -1,5 +1,6 @@ import { describe, test, expect } from '@jest/globals'; import { runComplianceTest, printVerboseOutput } from './helpers/test-utils.js'; +import { ValidationServerConfig } from '../types.js'; // Get client command from environment or use a default const CLIENT_COMMAND = process.env.CLIENT_COMMAND || 'tsx examples/typescript-client/test-client.ts'; @@ -8,121 +9,119 @@ const VERBOSE = process.env.VERBOSE === 'true'; describe('Metadata Location Tests', () => { describe('Tests different OAuth protected resource metadata locations', () => { - test('Standard location with WWW-Authenticate', async () => { - const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( - CLIENT_COMMAND, - { + // Test cases for metadata location scenarios + const metadataTestCases: Array<{ + name: string; + description?: string; + config: ValidationServerConfig; + expectedToPass: boolean; + expectations?: { + authMetadataRequested?: boolean; + authFlowCompleted?: boolean; + }; + }> = [ + { + name: 'Standard location with WWW-Authenticate', + config: { authRequired: true, metadataLocation: '/.well-known/oauth-protected-resource', includeWwwAuthenticate: true }, - { - timeout: 30000, - verbose: VERBOSE + expectedToPass: true, + expectations: { + authMetadataRequested: true } - ); - - if (VERBOSE) { - printVerboseOutput(report, behavior, authServerTrace, clientOutput); - } - - expect(report).toHavePassedCompliance(); - expect(clientOutput.exitCode).toBe(0); - expect(behavior.authMetadataRequested).toBe(true); - }); - - test('Non-standard location with WWW-Authenticate - Custom metadata path advertised via WWW-Authenticate header', async () => { - const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( - CLIENT_COMMAND, - { + }, + { + name: 'Non-standard location with WWW-Authenticate', + description: 'Custom metadata path advertised via WWW-Authenticate header', + config: { authRequired: true, metadataLocation: '/custom/oauth/metadata', includeWwwAuthenticate: true }, - { - timeout: 30000, - verbose: VERBOSE + expectedToPass: true, + expectations: { + authMetadataRequested: true } - ); - - if (VERBOSE) { - printVerboseOutput(report, behavior, authServerTrace, clientOutput); - } - - expect(report).toHavePassedCompliance(); - expect(clientOutput.exitCode).toBe(0); - expect(behavior.authMetadataRequested).toBe(true); - }); - - test('Nested well-known path with WWW-Authenticate', async () => { - const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( - CLIENT_COMMAND, - { + }, + { + name: 'Nested well-known path with WWW-Authenticate', + config: { authRequired: true, metadataLocation: '/.well-known/oauth-protected-resource/mcp', includeWwwAuthenticate: true }, - { - timeout: 30000, - verbose: VERBOSE + expectedToPass: true, + expectations: { + authMetadataRequested: true } - ); - - if (VERBOSE) { - printVerboseOutput(report, behavior, authServerTrace, clientOutput); - } - - expect(report).toHavePassedCompliance(); - expect(clientOutput.exitCode).toBe(0); - expect(behavior.authMetadataRequested).toBe(true); - }); - - test('Standard location without WWW-Authenticate - Client should find metadata at standard location', async () => { - const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( - CLIENT_COMMAND, - { + }, + { + name: 'Standard location without WWW-Authenticate', + description: 'Client should find metadata at standard location', + config: { authRequired: true, metadataLocation: '/.well-known/oauth-protected-resource', includeWwwAuthenticate: false }, - { - timeout: 30000, - verbose: VERBOSE + expectedToPass: true, + expectations: { + authMetadataRequested: true } - ); - - if (VERBOSE) { - printVerboseOutput(report, behavior, authServerTrace, clientOutput); - } - - expect(report).toHavePassedCompliance(); - expect(clientOutput.exitCode).toBe(0); - expect(behavior.authMetadataRequested).toBe(true); - }); - - test('Non-standard location without WWW-Authenticate - Client cannot find metadata without header hint', async () => { - const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( - CLIENT_COMMAND, - { + }, + { + name: 'Non-standard location without WWW-Authenticate', + description: 'Client cannot find metadata without header hint', + config: { authRequired: true, metadataLocation: '/custom/oauth/metadata', includeWwwAuthenticate: false }, - { - timeout: 30000, - verbose: VERBOSE + expectedToPass: false, + expectations: { + authFlowCompleted: false + } + } + ]; + + // Use test.each to parameterize the tests + test.each(metadataTestCases)( + '$name', + async ({ name, description, config, expectedToPass, expectations }) => { + const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( + CLIENT_COMMAND, + config, + { + timeout: 30000, + verbose: VERBOSE + } + ); + + if (VERBOSE) { + console.log(`\nTest: ${name}`); + if (description) console.log(`Description: ${description}`); + printVerboseOutput(report, behavior, authServerTrace, clientOutput); + } + + // Core assertions + if (expectedToPass) { + expect(report).toHavePassedCompliance(); + expect(clientOutput.exitCode).toBe(0); + } else { + expect(report.overall_result).toBe('FAIL'); + expect(clientOutput.exitCode).not.toBe(0); + } + + // Additional behavior expectations + if (expectations?.authMetadataRequested !== undefined) { + expect(behavior.authMetadataRequested).toBe(expectations.authMetadataRequested); + } + + if (expectations?.authFlowCompleted !== undefined) { + expect(behavior.authFlowCompleted).toBe(expectations.authFlowCompleted); } - ); - - if (VERBOSE) { - printVerboseOutput(report, behavior, authServerTrace, clientOutput); } - - // This test expects the client to FAIL - expect(report.overall_result).toBe('FAIL'); - expect(clientOutput.exitCode).not.toBe(0); - // Client should not be able to complete auth flow without finding metadata - expect(behavior.authFlowCompleted).toBe(false); - }); + ); }); }); \ No newline at end of file From 889e9261f915e8c06e4c4d414d8c3b730d2bb341 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Mon, 11 Aug 2025 18:13:56 +0100 Subject: [PATCH 21/27] testing --- .../src/__tests__/metadata-location.test.ts | 127 +++--------------- 1 file changed, 20 insertions(+), 107 deletions(-) diff --git a/auth-compat/src/__tests__/metadata-location.test.ts b/auth-compat/src/__tests__/metadata-location.test.ts index 87147c946..d51fdc6a3 100644 --- a/auth-compat/src/__tests__/metadata-location.test.ts +++ b/auth-compat/src/__tests__/metadata-location.test.ts @@ -1,6 +1,5 @@ import { describe, test, expect } from '@jest/globals'; import { runComplianceTest, printVerboseOutput } from './helpers/test-utils.js'; -import { ValidationServerConfig } from '../types.js'; // Get client command from environment or use a default const CLIENT_COMMAND = process.env.CLIENT_COMMAND || 'tsx examples/typescript-client/test-client.ts'; @@ -8,120 +7,34 @@ const VERBOSE = process.env.VERBOSE === 'true'; describe('Metadata Location Tests', () => { describe('Tests different OAuth protected resource metadata locations', () => { - - // Test cases for metadata location scenarios - const metadataTestCases: Array<{ - name: string; - description?: string; - config: ValidationServerConfig; - expectedToPass: boolean; - expectations?: { - authMetadataRequested?: boolean; - authFlowCompleted?: boolean; - }; - }> = [ - { - name: 'Standard location with WWW-Authenticate', - config: { - authRequired: true, - metadataLocation: '/.well-known/oauth-protected-resource', - includeWwwAuthenticate: true - }, - expectedToPass: true, - expectations: { - authMetadataRequested: true - } - }, - { - name: 'Non-standard location with WWW-Authenticate', - description: 'Custom metadata path advertised via WWW-Authenticate header', - config: { - authRequired: true, - metadataLocation: '/custom/oauth/metadata', - includeWwwAuthenticate: true - }, - expectedToPass: true, - expectations: { - authMetadataRequested: true - } - }, - { - name: 'Nested well-known path with WWW-Authenticate', - config: { - authRequired: true, - metadataLocation: '/.well-known/oauth-protected-resource/mcp', - includeWwwAuthenticate: true - }, - expectedToPass: true, - expectations: { - authMetadataRequested: true - } - }, - { - name: 'Standard location without WWW-Authenticate', - description: 'Client should find metadata at standard location', - config: { - authRequired: true, - metadataLocation: '/.well-known/oauth-protected-resource', - includeWwwAuthenticate: false - }, - expectedToPass: true, - expectations: { - authMetadataRequested: true - } - }, - { - name: 'Non-standard location without WWW-Authenticate', - description: 'Client cannot find metadata without header hint', - config: { - authRequired: true, - metadataLocation: '/custom/oauth/metadata', - includeWwwAuthenticate: false - }, - expectedToPass: false, - expectations: { - authFlowCompleted: false - } - } - ]; - - // Use test.each to parameterize the tests - test.each(metadataTestCases)( - '$name', - async ({ name, description, config, expectedToPass, expectations }) => { + + const testCases = [ + ['Non-standard location with WWW-Authenticate', '/custom/oauth/metadata', true], + ['Standard location without WWW-Authenticate', '/.well-known/oauth-protected-resource', false], + ['Nested well-known path with WWW-Authenticate', '/.well-known/oauth-protected-resource/mcp', false], + ] as const; + + test.each(testCases)( + '%s', + async (name, metadataLocation, includeWwwAuth) => { const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( CLIENT_COMMAND, - config, { - timeout: 30000, - verbose: VERBOSE - } + authRequired: true, + metadataLocation, + includeWwwAuthenticate: includeWwwAuth + }, + { timeout: 30000, verbose: VERBOSE } ); - + if (VERBOSE) { console.log(`\nTest: ${name}`); - if (description) console.log(`Description: ${description}`); printVerboseOutput(report, behavior, authServerTrace, clientOutput); } - - // Core assertions - if (expectedToPass) { - expect(report).toHavePassedCompliance(); - expect(clientOutput.exitCode).toBe(0); - } else { - expect(report.overall_result).toBe('FAIL'); - expect(clientOutput.exitCode).not.toBe(0); - } - - // Additional behavior expectations - if (expectations?.authMetadataRequested !== undefined) { - expect(behavior.authMetadataRequested).toBe(expectations.authMetadataRequested); - } - - if (expectations?.authFlowCompleted !== undefined) { - expect(behavior.authFlowCompleted).toBe(expectations.authFlowCompleted); - } + + expect(clientOutput.exitCode).toBe(0); + expect(behavior.authMetadataRequested).toBe(true); } ); }); -}); \ No newline at end of file +}); From a25cf5a644186d68d86456a5defa74041059ef80 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Mon, 11 Aug 2025 18:19:31 +0100 Subject: [PATCH 22/27] simplify tests --- .../src/__tests__/basic-compliance.test.ts | 38 +++++- .../src/__tests__/client-behavior.test.ts | 108 ------------------ .../src/__tests__/helpers/test-utils.ts | 92 +++++---------- .../src/__tests__/metadata-location.test.ts | 4 +- .../src/__tests__/oauth-compliance.test.ts | 40 ------- 5 files changed, 62 insertions(+), 220 deletions(-) delete mode 100644 auth-compat/src/__tests__/client-behavior.test.ts delete mode 100644 auth-compat/src/__tests__/oauth-compliance.test.ts diff --git a/auth-compat/src/__tests__/basic-compliance.test.ts b/auth-compat/src/__tests__/basic-compliance.test.ts index 37b935455..9880c8ba3 100644 --- a/auth-compat/src/__tests__/basic-compliance.test.ts +++ b/auth-compat/src/__tests__/basic-compliance.test.ts @@ -18,18 +18,48 @@ describe('Basic Compliance', () => { verbose: VERBOSE } ); - + + // Print verbose output if requested + if (VERBOSE) { + printVerboseOutput(report, behavior, authServerTrace, clientOutput); + } + + // Assertions + expect(clientOutput.exitCode).toBe(0); + expect(clientOutput.timedOut).toBe(false); + expect(behavior.connected).toBe(true); + expect(behavior.initialized).toBe(true); + }); + }); + + describe('Tests OAuth2/OIDC authorization flow', () => { + test('Standard OAuth Flow - Client completes OAuth flow with default settings', async () => { + const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( + CLIENT_COMMAND, + { + authRequired: true + }, + { + timeout: 30000, + verbose: VERBOSE + } + ); + // Print verbose output if requested if (VERBOSE) { printVerboseOutput(report, behavior, authServerTrace, clientOutput); } - + // Assertions - expect(report).toHavePassedCompliance(); expect(clientOutput.exitCode).toBe(0); expect(clientOutput.timedOut).toBe(false); expect(behavior.connected).toBe(true); expect(behavior.initialized).toBe(true); + expect(behavior.authMetadataRequested).toBe(true); + expect(behavior.authFlowCompleted).toBe(true); + + // Verify auth server was contacted + expect(authServerTrace.length).toBeGreaterThan(0); }); }); -}); \ No newline at end of file +}); diff --git a/auth-compat/src/__tests__/client-behavior.test.ts b/auth-compat/src/__tests__/client-behavior.test.ts deleted file mode 100644 index eb6506d86..000000000 --- a/auth-compat/src/__tests__/client-behavior.test.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { describe, test, expect } from '@jest/globals'; -import { runComplianceTest, validateClientBehavior, printVerboseOutput } from './helpers/test-utils.js'; - -// Get client command from environment or use a default -const CLIENT_COMMAND = process.env.CLIENT_COMMAND || 'tsx examples/typescript-client/test-client.ts'; -const VERBOSE = process.env.VERBOSE === 'true'; - -describe('Client Behavior Validation', () => { - describe('Tests specific client behaviors', () => { - - test('Client requests metadata', async () => { - const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( - CLIENT_COMMAND, - { - authRequired: true - }, - { - timeout: 30000, - verbose: VERBOSE - } - ); - - if (VERBOSE) { - printVerboseOutput(report, behavior, authServerTrace, clientOutput); - } - - // Validate specific behaviors - const behaviorErrors = validateClientBehavior(behavior, { - authMetadataRequested: true, - initialized: true, - connected: true, - authFlowCompleted: true - }); - - // Assertions - expect(behaviorErrors).toHaveLength(0); - expect(report).toHavePassedCompliance(); - expect(clientOutput.exitCode).toBe(0); - - // Detailed behavior checks - expect(behavior.authMetadataRequested).toBe(true); - expect(behavior.initialized).toBe(true); - expect(behavior.connected).toBe(true); - expect(behavior.authFlowCompleted).toBe(true); - - // Check that proper requests were made - expect(behavior.requestsMade).toContain('initialize'); - }); - - test('Client handles auth failure gracefully', async () => { - // This test could be expanded to test failure scenarios - // For now, we'll test a basic auth required scenario - const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( - CLIENT_COMMAND, - { - authRequired: true, - metadataLocation: '/.well-known/oauth-protected-resource', - includeWwwAuthenticate: true - }, - { - timeout: 30000, - verbose: VERBOSE - } - ); - - if (VERBOSE) { - printVerboseOutput(report, behavior, authServerTrace, clientOutput); - } - - // Check that client properly attempted auth - expect(behavior.authMetadataRequested).toBe(true); - - // If auth succeeded, these should be true - if (clientOutput.exitCode === 0) { - expect(behavior.authFlowCompleted).toBe(true); - expect(behavior.initialized).toBe(true); - } - }); - - test('Client behavior without auth requirement', async () => { - const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( - CLIENT_COMMAND, - { - authRequired: false - }, - { - timeout: 30000, - verbose: VERBOSE - } - ); - - if (VERBOSE) { - printVerboseOutput(report, behavior, authServerTrace, clientOutput); - } - - // Without auth requirement, client should connect directly - expect(behavior.connected).toBe(true); - expect(behavior.initialized).toBe(true); - - // Should not attempt auth flow - expect(behavior.authMetadataRequested).toBe(false); - expect(behavior.authFlowCompleted).toBe(false); - - // Should have no auth server traces - expect(authServerTrace).toHaveLength(0); - }); - }); -}); \ No newline at end of file diff --git a/auth-compat/src/__tests__/helpers/test-utils.ts b/auth-compat/src/__tests__/helpers/test-utils.ts index 2dba03c12..27ad39da2 100644 --- a/auth-compat/src/__tests__/helpers/test-utils.ts +++ b/auth-compat/src/__tests__/helpers/test-utils.ts @@ -26,7 +26,7 @@ export async function setupTestServer( const server = new ValidationServer(config, verbose); const serverPort = await server.start(); const serverUrl = `http://localhost:${serverPort}/mcp`; - + return { server, serverUrl, @@ -52,39 +52,39 @@ export async function executeClient( const commandParts = clientCommand.split(' '); const executable = commandParts[0]; const args = [...commandParts.slice(1), serverUrl]; - + let stdout = ''; let stderr = ''; let timedOut = false; - + const clientProcess = spawn(executable, args, { stdio: 'pipe', shell: true, timeout }); - + clientProcess.stdout?.on('data', (data) => { stdout += data.toString(); }); - + clientProcess.stderr?.on('data', (data) => { stderr += data.toString(); }); - + const exitCode = await new Promise((resolve, reject) => { const timeoutHandle = setTimeout(() => { timedOut = true; clientProcess.kill(); reject(new Error(`Client execution timed out after ${timeout}ms`)); }, timeout); - + clientProcess.on('exit', (code) => { clearTimeout(timeoutHandle); if (!timedOut) { resolve(code || 0); } }); - + clientProcess.on('error', (error) => { clearTimeout(timeoutHandle); reject(error); @@ -95,7 +95,7 @@ export async function executeClient( } throw error; }); - + return { exitCode, stdout, @@ -122,21 +122,21 @@ export async function runComplianceTest( }> { const { timeout = 30000, verbose = false } = options; const context = await setupTestServer(serverConfig, verbose); - + try { // Execute the client const clientOutput = await executeClient(clientCommand, context.serverUrl, timeout); - + // Get validation results const results = context.server.getValidationResults(); const behavior = context.server.getClientBehavior(); const authServerTrace = serverConfig.authRequired && context.server.authServer ? context.server.authServer.getHttpTrace() : []; - + // Generate compliance report const report: ComplianceReport = { - overall_result: results.every(r => r.result === 'PASS') && + overall_result: results.every(r => r.result === 'PASS') && clientOutput.exitCode === 0 ? 'PASS' : 'FAIL', test_suite: 'jest-test', timestamp: new Date().toISOString(), @@ -145,7 +145,7 @@ export async function runComplianceTest( tests_failed: results.filter(r => r.result === 'FAIL').length, tests: results }; - + return { report, clientOutput, @@ -157,30 +157,6 @@ export async function runComplianceTest( } } -/** - * Custom Jest matchers for compliance testing - */ -export function toHavePassedCompliance( - report: ComplianceReport -): { pass: boolean; message: () => string } { - const pass = report.overall_result === 'PASS'; - - const message = () => { - if (pass) { - return `Expected compliance test to fail, but it passed`; - } else { - const failures = report.tests - .filter(t => t.result === 'FAIL') - .map(t => ` - ${t.name}: ${t.errors?.join(', ') || 'Failed'}`) - .join('\n'); - - return `Expected compliance test to pass, but it failed:\n${failures}`; - } - }; - - return { pass, message }; -} - /** * Helper to validate client behavior */ @@ -194,27 +170,27 @@ export function validateClientBehavior( } ): string[] { const errors: string[] = []; - - if (expectations.authMetadataRequested !== undefined && + + if (expectations.authMetadataRequested !== undefined && behavior.authMetadataRequested !== expectations.authMetadataRequested) { errors.push(`Expected authMetadataRequested to be ${expectations.authMetadataRequested}, but was ${behavior.authMetadataRequested}`); } - - if (expectations.authFlowCompleted !== undefined && + + if (expectations.authFlowCompleted !== undefined && behavior.authFlowCompleted !== expectations.authFlowCompleted) { errors.push(`Expected authFlowCompleted to be ${expectations.authFlowCompleted}, but was ${behavior.authFlowCompleted}`); } - - if (expectations.initialized !== undefined && + + if (expectations.initialized !== undefined && behavior.initialized !== expectations.initialized) { errors.push(`Expected initialized to be ${expectations.initialized}, but was ${behavior.initialized}`); } - - if (expectations.connected !== undefined && + + if (expectations.connected !== undefined && behavior.connected !== expectations.connected) { errors.push(`Expected connected to be ${expectations.connected}, but was ${behavior.connected}`); } - + return errors; } @@ -231,7 +207,7 @@ export function printVerboseOutput( console.log(`Overall Result: ${report.overall_result}`); console.log(`Tests Passed: ${report.tests_passed}`); console.log(`Tests Failed: ${report.tests_failed}`); - + if (report.tests_failed > 0) { console.log('\nFailed Tests:'); report.tests.forEach(test => { @@ -243,10 +219,10 @@ export function printVerboseOutput( } }); } - + console.log('\n=== HTTP Traces ==='); displayTraces(behavior.httpTrace || [], authServerTrace); - + if (clientOutput.stdout || clientOutput.stderr) { console.log('\n=== Client Output ==='); if (clientOutput.stdout) { @@ -257,19 +233,3 @@ export function printVerboseOutput( } } } - -// Extend Jest matchers -declare global { - namespace jest { - interface Matchers { - toHavePassedCompliance(): R; - } - } -} - -// Register custom matchers with Jest -if (typeof expect !== 'undefined' && expect.extend) { - expect.extend({ - toHavePassedCompliance - }); -} \ No newline at end of file diff --git a/auth-compat/src/__tests__/metadata-location.test.ts b/auth-compat/src/__tests__/metadata-location.test.ts index d51fdc6a3..f22c2c7c3 100644 --- a/auth-compat/src/__tests__/metadata-location.test.ts +++ b/auth-compat/src/__tests__/metadata-location.test.ts @@ -8,11 +8,11 @@ const VERBOSE = process.env.VERBOSE === 'true'; describe('Metadata Location Tests', () => { describe('Tests different OAuth protected resource metadata locations', () => { - const testCases = [ + const testCases: Array<[string, string, boolean]> = [ ['Non-standard location with WWW-Authenticate', '/custom/oauth/metadata', true], ['Standard location without WWW-Authenticate', '/.well-known/oauth-protected-resource', false], ['Nested well-known path with WWW-Authenticate', '/.well-known/oauth-protected-resource/mcp', false], - ] as const; + ]; test.each(testCases)( '%s', diff --git a/auth-compat/src/__tests__/oauth-compliance.test.ts b/auth-compat/src/__tests__/oauth-compliance.test.ts deleted file mode 100644 index 0deba0d24..000000000 --- a/auth-compat/src/__tests__/oauth-compliance.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { describe, test, expect } from '@jest/globals'; -import { runComplianceTest, printVerboseOutput } from './helpers/test-utils.js'; - -// Get client command from environment or use a default -const CLIENT_COMMAND = process.env.CLIENT_COMMAND || 'tsx examples/typescript-client/test-client.ts'; -const VERBOSE = process.env.VERBOSE === 'true'; - -describe('OAuth Compliance', () => { - describe('Tests OAuth2/OIDC authorization flow', () => { - test('Standard OAuth Flow - Client completes OAuth flow with default settings', async () => { - const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( - CLIENT_COMMAND, - { - authRequired: true - }, - { - timeout: 30000, - verbose: VERBOSE - } - ); - - // Print verbose output if requested - if (VERBOSE) { - printVerboseOutput(report, behavior, authServerTrace, clientOutput); - } - - // Assertions - expect(report).toHavePassedCompliance(); - expect(clientOutput.exitCode).toBe(0); - expect(clientOutput.timedOut).toBe(false); - expect(behavior.connected).toBe(true); - expect(behavior.initialized).toBe(true); - expect(behavior.authMetadataRequested).toBe(true); - expect(behavior.authFlowCompleted).toBe(true); - - // Verify auth server was contacted - expect(authServerTrace.length).toBeGreaterThan(0); - }); - }); -}); \ No newline at end of file From 0aaed5abd55611cfe3d6bb912099734b71887e2c Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Mon, 11 Aug 2025 18:26:37 +0100 Subject: [PATCH 23/27] clean up tests --- .../src/__tests__/basic-compliance.test.ts | 1 - .../src/__tests__/helpers/test-utils.ts | 37 +++++++++-------- auth-compat/src/middleware/http-trace.ts | 40 +++++++++++-------- auth-compat/src/server/validation/index.ts | 3 +- auth-compat/src/types.ts | 3 +- 5 files changed, 44 insertions(+), 40 deletions(-) diff --git a/auth-compat/src/__tests__/basic-compliance.test.ts b/auth-compat/src/__tests__/basic-compliance.test.ts index 9880c8ba3..e458a779c 100644 --- a/auth-compat/src/__tests__/basic-compliance.test.ts +++ b/auth-compat/src/__tests__/basic-compliance.test.ts @@ -56,7 +56,6 @@ describe('Basic Compliance', () => { expect(behavior.connected).toBe(true); expect(behavior.initialized).toBe(true); expect(behavior.authMetadataRequested).toBe(true); - expect(behavior.authFlowCompleted).toBe(true); // Verify auth server was contacted expect(authServerTrace.length).toBeGreaterThan(0); diff --git a/auth-compat/src/__tests__/helpers/test-utils.ts b/auth-compat/src/__tests__/helpers/test-utils.ts index 27ad39da2..be657c2f4 100644 --- a/auth-compat/src/__tests__/helpers/test-utils.ts +++ b/auth-compat/src/__tests__/helpers/test-utils.ts @@ -1,7 +1,7 @@ import { spawn, ChildProcess } from 'child_process'; import { ValidationServer } from '../../server/validation/index.js'; import { ValidationServerConfig, ComplianceReport, TestResult, HttpTrace } from '../../types.js'; -import { displayTraces } from '../../middleware/http-trace.js'; +import { formatTraces } from '../../middleware/http-trace.js'; export interface ClientExecutionResult { exitCode: number; @@ -164,7 +164,6 @@ export function validateClientBehavior( behavior: any, expectations: { authMetadataRequested?: boolean; - authFlowCompleted?: boolean; initialized?: boolean; connected?: boolean; } @@ -176,11 +175,6 @@ export function validateClientBehavior( errors.push(`Expected authMetadataRequested to be ${expectations.authMetadataRequested}, but was ${behavior.authMetadataRequested}`); } - if (expectations.authFlowCompleted !== undefined && - behavior.authFlowCompleted !== expectations.authFlowCompleted) { - errors.push(`Expected authFlowCompleted to be ${expectations.authFlowCompleted}, but was ${behavior.authFlowCompleted}`); - } - if (expectations.initialized !== undefined && behavior.initialized !== expectations.initialized) { errors.push(`Expected initialized to be ${expectations.initialized}, but was ${behavior.initialized}`); @@ -203,33 +197,38 @@ export function printVerboseOutput( authServerTrace: HttpTrace[], clientOutput: ClientExecutionResult ): void { - console.log('\n=== Test Results ==='); - console.log(`Overall Result: ${report.overall_result}`); - console.log(`Tests Passed: ${report.tests_passed}`); - console.log(`Tests Failed: ${report.tests_failed}`); + const output: string[] = []; + + output.push('\n=== Test Results ==='); + output.push(`Overall Result: ${report.overall_result}`); + output.push(`Tests Passed: ${report.tests_passed}`); + output.push(`Tests Failed: ${report.tests_failed}`); if (report.tests_failed > 0) { - console.log('\nFailed Tests:'); + output.push('\nFailed Tests:'); report.tests.forEach(test => { if (test.result === 'FAIL') { - console.log(` - ${test.name}`); + output.push(` - ${test.name}`); test.errors?.forEach(error => { - console.log(` ${error}`); + output.push(` ${error}`); }); } }); } - console.log('\n=== HTTP Traces ==='); - displayTraces(behavior.httpTrace || [], authServerTrace); + output.push('\n=== HTTP Traces ==='); + output.push(formatTraces(behavior.httpTrace || [], authServerTrace)); if (clientOutput.stdout || clientOutput.stderr) { - console.log('\n=== Client Output ==='); + output.push('\n=== Client Output ==='); if (clientOutput.stdout) { - console.log('STDOUT:', clientOutput.stdout); + output.push(`STDOUT: ${clientOutput.stdout}`); } if (clientOutput.stderr) { - console.log('STDERR:', clientOutput.stderr); + output.push(`STDERR: ${clientOutput.stderr}`); } } + + // Print everything at once to avoid Jest's per-line issues + console.log(output.join('\n')); } diff --git a/auth-compat/src/middleware/http-trace.ts b/auth-compat/src/middleware/http-trace.ts index c602faabb..dfd074e0a 100644 --- a/auth-compat/src/middleware/http-trace.ts +++ b/auth-compat/src/middleware/http-trace.ts @@ -52,9 +52,10 @@ export function createHttpTraceMiddleware(collector: HttpTraceCollector) { }; } -export function displayTraces(serverTrace: HttpTrace[], authServerTrace: HttpTrace[]) { +export function formatTraces(serverTrace: HttpTrace[], authServerTrace: HttpTrace[]): string { // Collect all traces and interleave them by timestamp const allTraces: any[] = []; + const output: string[] = []; serverTrace.forEach((trace: any) => { allTraces.push({ ...trace, source: 'MCP SERVER' }); @@ -68,59 +69,66 @@ export function displayTraces(serverTrace: HttpTrace[], authServerTrace: HttpTra if (allTraces.length > 0) { allTraces.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()); - // Print interleaved traces - console.log('\n ====== INTERLEAVED HTTP TRACE ======'); + // Build trace output + output.push('\n ====== INTERLEAVED HTTP TRACE ======'); allTraces.forEach((trace: any, index: number) => { - console.log(`\n --- [${trace.source}] Request #${index + 1} ---`); - console.log(` Timestamp: ${trace.timestamp}`); + output.push(`\n --- [${trace.source}] Request #${index + 1} ---`); + output.push(` Timestamp: ${trace.timestamp}`); // Request line - console.log(` ${trace.method} ${trace.url} HTTP/1.1`); + output.push(` ${trace.method} ${trace.url} HTTP/1.1`); // Request headers if (trace.headers) { Object.entries(trace.headers).forEach(([key, value]) => { - console.log(` ${key}: ${value}`); + output.push(` ${key}: ${value}`); }); } // Request body if (trace.body) { - console.log(''); + output.push(''); const bodyStr = typeof trace.body === 'string' ? trace.body : JSON.stringify(trace.body); - console.log(` ${bodyStr}`); + output.push(` ${bodyStr}`); } // Response if (trace.response) { - console.log(`\n HTTP/1.1 ${trace.response.status} ${getStatusText(trace.response.status)}`); + output.push(`\n HTTP/1.1 ${trace.response.status} ${getStatusText(trace.response.status)}`); // Response headers if (trace.response.headers) { Object.entries(trace.response.headers).forEach(([key, value]) => { - console.log(` ${key}: ${value}`); + output.push(` ${key}: ${value}`); }); } // Response body if (trace.response.body) { - console.log(''); + output.push(''); const bodyStr = typeof trace.response.body === 'string' ? trace.response.body : JSON.stringify(trace.response.body); // Truncate very long responses if (bodyStr.length > 1000) { - console.log(` ${bodyStr.substring(0, 1000)}... [truncated]`); + output.push(` ${bodyStr.substring(0, 1000)}... [truncated]`); } else { - console.log(` ${bodyStr}`); + output.push(` ${bodyStr}`); } } } - console.log(''); + output.push(''); }); - console.log(' ========================\n'); + output.push(' ========================\n'); } + + return output.join('\n'); +} + +// Keep the old function for backward compatibility but have it use the new one +export function displayTraces(serverTrace: HttpTrace[], authServerTrace: HttpTrace[]) { + console.log(formatTraces(serverTrace, authServerTrace)); } diff --git a/auth-compat/src/server/validation/index.ts b/auth-compat/src/server/validation/index.ts index 799ced1aa..5138e2d05 100644 --- a/auth-compat/src/server/validation/index.ts +++ b/auth-compat/src/server/validation/index.ts @@ -41,7 +41,6 @@ export class ValidationServer { initialized: false, requestsMade: [], authMetadataRequested: false, - authFlowCompleted: false, errors: [], httpTrace: [] }; @@ -122,7 +121,7 @@ export class ValidationServer { // We'll set the full URL dynamically in the middleware bearerMiddleware = async (req: Request, res: Response, next: any) => { const serverPort = this.getPort(); - const resourceMetadataUrl = this.config.includeWwwAuthenticate + const resourceMetadataUrl = this.config.includeWwwAuthenticate ? `http://localhost:${serverPort}${this.config.metadataLocation}` : undefined; const middleware = requireBearerAuth({ diff --git a/auth-compat/src/types.ts b/auth-compat/src/types.ts index 7a049b564..d30f911aa 100644 --- a/auth-compat/src/types.ts +++ b/auth-compat/src/types.ts @@ -35,7 +35,6 @@ export interface ClientBehavior { clientInfo?: Record; requestsMade: string[]; authMetadataRequested: boolean; - authFlowCompleted: boolean; errors: string[]; httpTrace: HttpTrace[]; } @@ -46,4 +45,4 @@ export interface ValidationServerConfig { metadataLocation?: string; // Location for protected resource metadata authServerMetadataLocation?: string; // Location for auth server metadata (passed to mock auth server) includeWwwAuthenticate?: boolean; // Whether to include resource_metadata in WWW-Authenticate header -} \ No newline at end of file +} From d7558717611436a4e0af8546c904233c6fb2c61b Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Mon, 11 Aug 2025 18:52:50 +0100 Subject: [PATCH 24/27] working on oauth server metadata --- .../src/__tests__/metadata-location.test.ts | 41 +++++++++++++++++++ auth-compat/src/server/auth/index.ts | 39 +++++++++++++++--- auth-compat/src/server/validation/index.ts | 6 ++- 3 files changed, 80 insertions(+), 6 deletions(-) diff --git a/auth-compat/src/__tests__/metadata-location.test.ts b/auth-compat/src/__tests__/metadata-location.test.ts index f22c2c7c3..6e9f8b0fd 100644 --- a/auth-compat/src/__tests__/metadata-location.test.ts +++ b/auth-compat/src/__tests__/metadata-location.test.ts @@ -37,4 +37,45 @@ describe('Metadata Location Tests', () => { } ); }); + + describe('OAuth Authorization Server metadata discovery at different locations', () => { + + const testCases: Array<[string, string]> = [ + ['OAuth 2.0 standard location', '/.well-known/oauth-authorization-server'], + ['OAuth 2.0 with path component', '/.well-known/oauth-authorization-server/tenant1'], + ['OpenID Connect standard location', '/.well-known/openid-configuration'], + ['OpenID Connect with path component', '/.well-known/openid-configuration/tenant1'], + ['OpenID Connect path appending', '/tenant1/.well-known/openid-configuration'], + ]; + + test.each(testCases)( + '%s', + async (name, authServerMetadataLocation) => { + const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( + CLIENT_COMMAND, + { + authRequired: true, + metadataLocation: '/.well-known/oauth-protected-resource', + authServerMetadataLocation, + includeWwwAuthenticate: true + }, + { timeout: 30000, verbose: VERBOSE } + ); + + if (VERBOSE) { + console.log(`\nTest: ${name}`); + printVerboseOutput(report, behavior, authServerTrace, clientOutput); + } + + expect(clientOutput.exitCode).toBe(0); + expect(behavior.authMetadataRequested).toBe(true); + + // Verify auth server metadata was requested at the expected location + const authMetadataRequest = authServerTrace?.find((trace: any) => + trace.url === authServerMetadataLocation && trace.method === 'GET' + ); + expect(authMetadataRequest).toBeDefined(); + } + ); + }); }); diff --git a/auth-compat/src/server/auth/index.ts b/auth-compat/src/server/auth/index.ts index 37b2c2832..574be88a4 100644 --- a/auth-compat/src/server/auth/index.ts +++ b/auth-compat/src/server/auth/index.ts @@ -30,6 +30,7 @@ export class MockAuthServer implements HttpTraceCollector { private port: number; public httpTrace: HttpTrace[] = []; private verbose: boolean; + public issuerPath: string; // Store authorization requests for PKCE validation private authorizationRequests: Map = new Map(); @@ -40,8 +41,35 @@ export class MockAuthServer implements HttpTraceCollector { this.app = express(); this.app.use(express.json()); this.app.use(express.urlencoded({ extended: true })); + + // Extract issuer path from metadata location + // For /.well-known/oauth-authorization-server/tenant1 -> /tenant1 + // For /.well-known/openid-configuration -> '' + // For /tenant1/.well-known/openid-configuration -> /tenant1 + this.issuerPath = this.extractIssuerPath(metadataLocation); + this.setupRoutes(); } + + private extractIssuerPath(metadataLocation: string): string { + // Handle different metadata location patterns + if (metadataLocation.includes('/.well-known/oauth-authorization-server/')) { + // OAuth 2.0 with path: /.well-known/oauth-authorization-server/tenant1 -> /tenant1 + return metadataLocation.replace('/.well-known/oauth-authorization-server', ''); + } else if (metadataLocation.includes('/.well-known/openid-configuration/')) { + // OpenID with path: /.well-known/openid-configuration/tenant1 -> /tenant1 + return metadataLocation.replace('/.well-known/openid-configuration', ''); + } else if (metadataLocation.endsWith('/.well-known/openid-configuration')) { + // Check if there's a path before /.well-known + const match = metadataLocation.match(/^(\/[^\/]+)\/.well-known\/openid-configuration$/); + if (match) { + // /tenant1/.well-known/openid-configuration -> /tenant1 + return match[1]; + } + } + // Standard locations without path component + return ''; + } private log(...args: any[]): void { if (this.verbose) { @@ -55,12 +83,13 @@ export class MockAuthServer implements HttpTraceCollector { // OAuth Authorization Server Metadata endpoint this.app.get(this.metadataLocation, (req: Request, res: Response) => { - const serverUrl = this.getUrl(); + const baseUrl = this.getUrl(); + const issuer = baseUrl + this.issuerPath; res.json({ - issuer: serverUrl, - authorization_endpoint: `${serverUrl}/authorize`, - token_endpoint: `${serverUrl}/token`, - registration_endpoint: `${serverUrl}/register`, + issuer: issuer, + authorization_endpoint: `${baseUrl}/authorize`, + token_endpoint: `${baseUrl}/token`, + registration_endpoint: `${baseUrl}/register`, response_types_supported: ['code'], grant_types_supported: ['authorization_code', 'refresh_token'], code_challenge_methods_supported: ['S256'], diff --git a/auth-compat/src/server/validation/index.ts b/auth-compat/src/server/validation/index.ts index 5138e2d05..bb748bba9 100644 --- a/auth-compat/src/server/validation/index.ts +++ b/auth-compat/src/server/validation/index.ts @@ -105,11 +105,15 @@ export class ValidationServer { // Get the actual port at request time const serverPort = this.getPort(); const authServerUrl = this.authServer ? this.authServer.getUrl() : ''; + + // Add issuer path if needed + const issuerPath = this.authServer ? this.authServer.issuerPath : ''; + const fullAuthServerUrl = authServerUrl + issuerPath; // Serve OAuth Protected Resource Metadata (RFC 9728) res.json({ resource: `http://localhost:${serverPort}`, - authorization_servers: authServerUrl ? [authServerUrl] : [] + authorization_servers: fullAuthServerUrl ? [fullAuthServerUrl] : [] }); }); } From 461177355618ce8fedba389854a68f9143ea9479 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Mon, 11 Aug 2025 18:57:52 +0100 Subject: [PATCH 25/27] fix provided oidc metadata --- auth-compat/src/server/auth/index.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/auth-compat/src/server/auth/index.ts b/auth-compat/src/server/auth/index.ts index 574be88a4..5ce245fa5 100644 --- a/auth-compat/src/server/auth/index.ts +++ b/auth-compat/src/server/auth/index.ts @@ -85,7 +85,9 @@ export class MockAuthServer implements HttpTraceCollector { this.app.get(this.metadataLocation, (req: Request, res: Response) => { const baseUrl = this.getUrl(); const issuer = baseUrl + this.issuerPath; - res.json({ + + // Base metadata for both OAuth 2.0 and OIDC + const metadata: any = { issuer: issuer, authorization_endpoint: `${baseUrl}/authorize`, token_endpoint: `${baseUrl}/token`, @@ -94,7 +96,19 @@ export class MockAuthServer implements HttpTraceCollector { grant_types_supported: ['authorization_code', 'refresh_token'], code_challenge_methods_supported: ['S256'], token_endpoint_auth_methods_supported: ['none', 'client_secret_post'] - }); + }; + + // Add OIDC-specific fields if this is an OpenID Connect metadata endpoint + if (this.metadataLocation.includes('openid-configuration')) { + metadata.jwks_uri = `${baseUrl}/jwks`; + metadata.subject_types_supported = ['public']; + metadata.id_token_signing_alg_values_supported = ['RS256']; + metadata.userinfo_endpoint = `${baseUrl}/userinfo`; + metadata.scopes_supported = ['openid', 'profile', 'email']; + metadata.claims_supported = ['sub', 'name', 'email', 'email_verified']; + } + + res.json(metadata); }); // OAuth2 authorization endpoint From 8a8f0fd9b22851d15ad57aabf86d759155fb147d Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Mon, 11 Aug 2025 19:39:05 +0100 Subject: [PATCH 26/27] check resource parameter --- .../src/__tests__/basic-compliance.test.ts | 8 +++- .../src/__tests__/helpers/test-utils.ts | 4 +- auth-compat/src/server/auth/index.ts | 23 +++++++++++- auth-compat/src/server/validation/index.ts | 37 +++++++++++++++++++ auth-compat/src/types.ts | 3 ++ 5 files changed, 72 insertions(+), 3 deletions(-) diff --git a/auth-compat/src/__tests__/basic-compliance.test.ts b/auth-compat/src/__tests__/basic-compliance.test.ts index e458a779c..3ead7c526 100644 --- a/auth-compat/src/__tests__/basic-compliance.test.ts +++ b/auth-compat/src/__tests__/basic-compliance.test.ts @@ -34,7 +34,7 @@ describe('Basic Compliance', () => { describe('Tests OAuth2/OIDC authorization flow', () => { test('Standard OAuth Flow - Client completes OAuth flow with default settings', async () => { - const { report, clientOutput, behavior, authServerTrace } = await runComplianceTest( + const { report, clientOutput, behavior, authServerTrace, serverPort } = await runComplianceTest( CLIENT_COMMAND, { authRequired: true @@ -59,6 +59,12 @@ describe('Basic Compliance', () => { // Verify auth server was contacted expect(authServerTrace.length).toBeGreaterThan(0); + + // Verify resource parameter matches PRM exactly + // The PRM always returns http://localhost:{port} as the resource + const expectedResource = `http://localhost:${serverPort}/`; + expect(behavior.resourceParameterUsed).toBe(true); + expect(behavior.resourceParameterValue).toBe(expectedResource); }); }); }); diff --git a/auth-compat/src/__tests__/helpers/test-utils.ts b/auth-compat/src/__tests__/helpers/test-utils.ts index be657c2f4..352116bd5 100644 --- a/auth-compat/src/__tests__/helpers/test-utils.ts +++ b/auth-compat/src/__tests__/helpers/test-utils.ts @@ -119,6 +119,7 @@ export async function runComplianceTest( clientOutput: ClientExecutionResult; behavior: any; authServerTrace: HttpTrace[]; + serverPort: number; }> { const { timeout = 30000, verbose = false } = options; const context = await setupTestServer(serverConfig, verbose); @@ -150,7 +151,8 @@ export async function runComplianceTest( report, clientOutput, behavior, - authServerTrace + authServerTrace, + serverPort: context.serverPort }; } finally { await teardownTestServer(context); diff --git a/auth-compat/src/server/auth/index.ts b/auth-compat/src/server/auth/index.ts index 5ce245fa5..1c80ccb1a 100644 --- a/auth-compat/src/server/auth/index.ts +++ b/auth-compat/src/server/auth/index.ts @@ -31,6 +31,8 @@ export class MockAuthServer implements HttpTraceCollector { public httpTrace: HttpTrace[] = []; private verbose: boolean; public issuerPath: string; + public resourceParameterReceived: boolean = false; + public resourceParameterValue: string | null = null; // Store authorization requests for PKCE validation private authorizationRequests: Map = new Map(); @@ -120,8 +122,16 @@ export class MockAuthServer implements HttpTraceCollector { state, code_challenge, code_challenge_method, + resource, } = req.query as any; + // Track resource parameter + if (resource) { + this.resourceParameterReceived = true; + this.resourceParameterValue = resource; + this.log('Received resource parameter:', resource); + } + // Basic validation if (response_type !== 'code') { return res.status(400).json({ @@ -165,8 +175,19 @@ export class MockAuthServer implements HttpTraceCollector { code_verifier, client_id, client_secret, - refresh_token + refresh_token, + resource } = req.body; + + // Track resource parameter in token request + if (resource) { + this.resourceParameterReceived = true; + // Update value if not already set or if different + if (!this.resourceParameterValue) { + this.resourceParameterValue = resource; + } + this.log('Received resource parameter in token request:', resource); + } if (grant_type === 'authorization_code') { // Validate authorization code diff --git a/auth-compat/src/server/validation/index.ts b/auth-compat/src/server/validation/index.ts index bb748bba9..54026c8bf 100644 --- a/auth-compat/src/server/validation/index.ts +++ b/auth-compat/src/server/validation/index.ts @@ -302,6 +302,27 @@ export class ValidationServer { }, errors: this.clientBehavior.authMetadataRequested ? undefined : ['Client did not request auth metadata'] }); + + // Test: Resource parameter (RFC 8707) + const serverPort = this.getPort(); + const expectedResource = `http://localhost:${serverPort}`; + const resourceCorrect = this.authServer?.resourceParameterValue === expectedResource; + + results.push({ + name: 'resource_parameter_rfc8707', + result: (this.authServer?.resourceParameterReceived && resourceCorrect) ? 'PASS' : 'FAIL', + details: { + resource_parameter_sent: this.authServer?.resourceParameterReceived || false, + resource_parameter_value: this.authServer?.resourceParameterValue || null, + expected_resource: expectedResource, + matches_prm: resourceCorrect + }, + errors: !this.authServer?.resourceParameterReceived + ? ['Client did not send resource parameter (required by RFC 8707)'] + : !resourceCorrect + ? [`Resource parameter '${this.authServer?.resourceParameterValue}' does not match PRM value '${expectedResource}'`] + : undefined + }); } // Test: Basic functionality @@ -319,6 +340,22 @@ export class ValidationServer { } getClientBehavior(): ClientBehavior { + // Add auth server tracking if available + if (this.authServer) { + this.clientBehavior.resourceParameterUsed = this.authServer.resourceParameterReceived; + this.clientBehavior.resourceParameterValue = this.authServer.resourceParameterValue || undefined; + + // Check if the resource parameter EXACTLY matches what's in the PRM + const serverPort = this.getPort(); + const expectedResource = `http://localhost:${serverPort}`; // This is what we return in PRM + if (this.authServer.resourceParameterValue) { + const receivedResource = this.authServer.resourceParameterValue; + if (receivedResource !== expectedResource) { + this.clientBehavior.errors.push(`Incorrect resource parameter: expected exactly '${expectedResource}' (from PRM), got '${receivedResource}'`); + } + } + } + return this.clientBehavior; } } diff --git a/auth-compat/src/types.ts b/auth-compat/src/types.ts index d30f911aa..94081dd7b 100644 --- a/auth-compat/src/types.ts +++ b/auth-compat/src/types.ts @@ -35,6 +35,9 @@ export interface ClientBehavior { clientInfo?: Record; requestsMade: string[]; authMetadataRequested: boolean; + authFlowCompleted?: boolean; + resourceParameterUsed?: boolean; + resourceParameterValue?: string; errors: string[]; httpTrace: HttpTrace[]; } From e0a11f8d0db767b6453a28f428c92a0c0381e670 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Mon, 11 Aug 2025 19:47:22 +0100 Subject: [PATCH 27/27] check resource parameter --- .../src/__tests__/basic-compliance.test.ts | 4 +- auth-compat/src/server/auth/index.ts | 30 ++++++-------- auth-compat/src/server/validation/index.ts | 39 ++----------------- auth-compat/src/types.ts | 4 +- 4 files changed, 20 insertions(+), 57 deletions(-) diff --git a/auth-compat/src/__tests__/basic-compliance.test.ts b/auth-compat/src/__tests__/basic-compliance.test.ts index 3ead7c526..0b0358a81 100644 --- a/auth-compat/src/__tests__/basic-compliance.test.ts +++ b/auth-compat/src/__tests__/basic-compliance.test.ts @@ -63,8 +63,8 @@ describe('Basic Compliance', () => { // Verify resource parameter matches PRM exactly // The PRM always returns http://localhost:{port} as the resource const expectedResource = `http://localhost:${serverPort}/`; - expect(behavior.resourceParameterUsed).toBe(true); - expect(behavior.resourceParameterValue).toBe(expectedResource); + expect(behavior.authResourceParameter).toBe(expectedResource); + expect(behavior.tokenResourceParameter).toBe(expectedResource); }); }); }); diff --git a/auth-compat/src/server/auth/index.ts b/auth-compat/src/server/auth/index.ts index 1c80ccb1a..d1b41324f 100644 --- a/auth-compat/src/server/auth/index.ts +++ b/auth-compat/src/server/auth/index.ts @@ -31,8 +31,9 @@ export class MockAuthServer implements HttpTraceCollector { public httpTrace: HttpTrace[] = []; private verbose: boolean; public issuerPath: string; - public resourceParameterReceived: boolean = false; - public resourceParameterValue: string | null = null; + public authResourceParameter: string | null = null; + public tokenResourceParameter: string | null = null; + // Store authorization requests for PKCE validation private authorizationRequests: Map = new Map(); @@ -43,16 +44,16 @@ export class MockAuthServer implements HttpTraceCollector { this.app = express(); this.app.use(express.json()); this.app.use(express.urlencoded({ extended: true })); - + // Extract issuer path from metadata location // For /.well-known/oauth-authorization-server/tenant1 -> /tenant1 // For /.well-known/openid-configuration -> '' // For /tenant1/.well-known/openid-configuration -> /tenant1 this.issuerPath = this.extractIssuerPath(metadataLocation); - + this.setupRoutes(); } - + private extractIssuerPath(metadataLocation: string): string { // Handle different metadata location patterns if (metadataLocation.includes('/.well-known/oauth-authorization-server/')) { @@ -87,7 +88,7 @@ export class MockAuthServer implements HttpTraceCollector { this.app.get(this.metadataLocation, (req: Request, res: Response) => { const baseUrl = this.getUrl(); const issuer = baseUrl + this.issuerPath; - + // Base metadata for both OAuth 2.0 and OIDC const metadata: any = { issuer: issuer, @@ -99,7 +100,7 @@ export class MockAuthServer implements HttpTraceCollector { code_challenge_methods_supported: ['S256'], token_endpoint_auth_methods_supported: ['none', 'client_secret_post'] }; - + // Add OIDC-specific fields if this is an OpenID Connect metadata endpoint if (this.metadataLocation.includes('openid-configuration')) { metadata.jwks_uri = `${baseUrl}/jwks`; @@ -109,7 +110,7 @@ export class MockAuthServer implements HttpTraceCollector { metadata.scopes_supported = ['openid', 'profile', 'email']; metadata.claims_supported = ['sub', 'name', 'email', 'email_verified']; } - + res.json(metadata); }); @@ -127,9 +128,7 @@ export class MockAuthServer implements HttpTraceCollector { // Track resource parameter if (resource) { - this.resourceParameterReceived = true; - this.resourceParameterValue = resource; - this.log('Received resource parameter:', resource); + this.authResourceParameter = resource; } // Basic validation @@ -178,15 +177,10 @@ export class MockAuthServer implements HttpTraceCollector { refresh_token, resource } = req.body; - + // Track resource parameter in token request if (resource) { - this.resourceParameterReceived = true; - // Update value if not already set or if different - if (!this.resourceParameterValue) { - this.resourceParameterValue = resource; - } - this.log('Received resource parameter in token request:', resource); + this.tokenResourceParameter = resource; } if (grant_type === 'authorization_code') { diff --git a/auth-compat/src/server/validation/index.ts b/auth-compat/src/server/validation/index.ts index 54026c8bf..f2a326da6 100644 --- a/auth-compat/src/server/validation/index.ts +++ b/auth-compat/src/server/validation/index.ts @@ -105,7 +105,7 @@ export class ValidationServer { // Get the actual port at request time const serverPort = this.getPort(); const authServerUrl = this.authServer ? this.authServer.getUrl() : ''; - + // Add issuer path if needed const issuerPath = this.authServer ? this.authServer.issuerPath : ''; const fullAuthServerUrl = authServerUrl + issuerPath; @@ -302,27 +302,6 @@ export class ValidationServer { }, errors: this.clientBehavior.authMetadataRequested ? undefined : ['Client did not request auth metadata'] }); - - // Test: Resource parameter (RFC 8707) - const serverPort = this.getPort(); - const expectedResource = `http://localhost:${serverPort}`; - const resourceCorrect = this.authServer?.resourceParameterValue === expectedResource; - - results.push({ - name: 'resource_parameter_rfc8707', - result: (this.authServer?.resourceParameterReceived && resourceCorrect) ? 'PASS' : 'FAIL', - details: { - resource_parameter_sent: this.authServer?.resourceParameterReceived || false, - resource_parameter_value: this.authServer?.resourceParameterValue || null, - expected_resource: expectedResource, - matches_prm: resourceCorrect - }, - errors: !this.authServer?.resourceParameterReceived - ? ['Client did not send resource parameter (required by RFC 8707)'] - : !resourceCorrect - ? [`Resource parameter '${this.authServer?.resourceParameterValue}' does not match PRM value '${expectedResource}'`] - : undefined - }); } // Test: Basic functionality @@ -342,20 +321,10 @@ export class ValidationServer { getClientBehavior(): ClientBehavior { // Add auth server tracking if available if (this.authServer) { - this.clientBehavior.resourceParameterUsed = this.authServer.resourceParameterReceived; - this.clientBehavior.resourceParameterValue = this.authServer.resourceParameterValue || undefined; - - // Check if the resource parameter EXACTLY matches what's in the PRM - const serverPort = this.getPort(); - const expectedResource = `http://localhost:${serverPort}`; // This is what we return in PRM - if (this.authServer.resourceParameterValue) { - const receivedResource = this.authServer.resourceParameterValue; - if (receivedResource !== expectedResource) { - this.clientBehavior.errors.push(`Incorrect resource parameter: expected exactly '${expectedResource}' (from PRM), got '${receivedResource}'`); - } - } + this.clientBehavior.authResourceParameter = this.authServer.authResourceParameter || undefined; + this.clientBehavior.tokenResourceParameter = this.authServer.tokenResourceParameter || undefined; } - + return this.clientBehavior; } } diff --git a/auth-compat/src/types.ts b/auth-compat/src/types.ts index 94081dd7b..8ba4cd3b1 100644 --- a/auth-compat/src/types.ts +++ b/auth-compat/src/types.ts @@ -36,8 +36,8 @@ export interface ClientBehavior { requestsMade: string[]; authMetadataRequested: boolean; authFlowCompleted?: boolean; - resourceParameterUsed?: boolean; - resourceParameterValue?: string; + authResourceParameter?: string; + tokenResourceParameter?: string; errors: string[]; httpTrace: HttpTrace[]; }