commit 0172c07623afb7f5af52f5e5d974720f835a1403 Author: Felix Rieseberg Date: Thu Jun 26 08:38:59 2025 -0700 :rocket: Hello World diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..6df6b4c --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,131 @@ +{ + "env": { + "es6": true + }, + "extends": [ + "eslint:recommended", + "prettier", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:import/recommended", + "plugin:import/typescript" + ], + "plugins": ["@typescript-eslint", "import", "prettier", "simple-import-sort"], + "parser": "@typescript-eslint/parser", + "ignorePatterns": ["dist/*", "node_modules/*", "*.js"], + "parserOptions": { + "project": "./tsconfig.json" + }, + "settings": { + "import/resolver": { + // Enables eslint-import-resolver-typescript + "typescript": {} + } + }, + "rules": { + "prettier/prettier": "warn", + // Require all external imports to be declared as a dependency + "import/no-extraneous-dependencies": [ + "error", + { + "packageDir": "./" + } + ], + // Imports must not cause cyclical dependencies + "import/no-cycle": [ + "error", + { "allowUnsafeDynamicCyclicDependency": true } + ], + "import/no-named-as-default-member": "off", + // Imports must be ordered appropriately + "simple-import-sort/imports": [ + "error", + { + "groups": [ + // Side effect imports. + ["^\\u0000"], + // Node.js builtins prefixed with `node:`. + ["^node:"], + // Packages. + // Things that start with a letter (or digit or underscore), or `@` followed by a letter. + ["^@?\\w"], + // Absolute imports + ["^@/"], + // Relative imports. + // Anything that starts with a dot. + ["^\\."] + ] + } + ], + "simple-import-sort/exports": "error", + // Imports must be placed before non-import statements + "import/first": "error", + "import/newline-after-import": "error", + "import/no-duplicates": "error", + + // Require a space at the start of comments + "spaced-comment": [ + "error", + "always", + { + "markers": ["/"] + } + ], + + // Make sure switch-case doesn't accidentally fall-through https://eslint.org/docs/latest/rules/no-fallthrough + "no-fallthrough": "error", + + "@typescript-eslint/ban-ts-comment": "warn", + + "@typescript-eslint/consistent-type-imports": [ + "error", + { + "prefer": "type-imports" + } + ], + + // Disallow annotating types where the type can be easily inferred + "@typescript-eslint/no-inferrable-types": [ + "error", + { + "ignoreParameters": false, + "ignoreProperties": false + } + ], + // Allow non-null assertions + "@typescript-eslint/no-non-null-assertion": "off", + // Disallow using 'any' explicitly in annotations + "@typescript-eslint/no-explicit-any": "error", + // Require promise outcomes to be properly handled + "@typescript-eslint/no-floating-promises": "error", + // Turn off base eslint rule in favor of typescript-eslint version + // to avoid getting eslint errors on type signatures + "no-unused-vars": "off", + // Disallow unused variables and imports + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "args": "after-used", + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "ignoreRestSiblings": true, + "vars": "all", + "args": "after-used", + "destructuredArrayIgnorePattern": "^_" + } + ], + + // Disallow empty functions + // If a function is intentionally empty, adding a comment line + // inside the function body is enough to pass this rule + "@typescript-eslint/no-empty-function": "error" + }, + "overrides": [ + { + "files": ["test/**/*.ts"], + "parserOptions": { + "project": "./tsconfig.test.json" + } + } + ] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c1ab374 --- /dev/null +++ b/.gitignore @@ -0,0 +1,108 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock +.DS_Store + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/ + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# Webpack +.webpack/ + +# Claude files +.claude.json +.claude/ + +# Vite +.vite/ + +# Electron-Forge +out/ +_out/ + +# Sentry auth token +.env.sentry-build-plugin + +# Dynamically-generated resources +dist +self-signed-cert.pem +self-signed-key.pem +*.dxt +invalid-json.json +**/server/lib/** \ No newline at end of file diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..6044c33 --- /dev/null +++ b/.npmignore @@ -0,0 +1 @@ +!MANIFEST.md \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..42a20bc --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + }, + "eslint.validate": ["typescript"], + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + } +} diff --git a/CLI.md b/CLI.md new file mode 100644 index 0000000..bc21b8d --- /dev/null +++ b/CLI.md @@ -0,0 +1,305 @@ +# DXT CLI Documentation + +The DXT CLI provides tools for building Desktop Extensions. + +## Installation + +```bash +npm install -g @anthropic-ai/dxt +``` + +``` +Usage: dxt [options] [command] + +Tools for building Desktop Extensions + +Options: + -V, --version output the version number + -h, --help display help for command + +Commands: + init [directory] Create a new DXT extension manifest + validate Validate a DXT manifest file + pack [output] Pack a directory into a DXT extension + sign [options] Sign a DXT extension file + verify Verify the signature of a DXT extension file + info Display information about a DXT extension file + unsign Remove signature from a DXT extension file + help [command] display help for command +``` + +## Commands + +### `dxt init [directory]` + +Creates a new DXT extension manifest interactively. + +```bash +# Initialize in current directory +dxt init + +# Initialize in a specific directory +dxt init my-extension/ +``` + +The command will prompt you for: + +- Extension name (defaults from package.json or folder name) +- Author name (defaults from package.json) +- Extension ID (auto-generated from author and extension name) +- Display name +- Version (defaults from package.json or 1.0.0) +- Description +- Author email and URL (optional) +- Server type (Node.js, Python, or Binary) +- Entry point (with sensible defaults per server type) +- Tools configuration +- Keywords, license, and repository information + +After creating the manifest, it provides helpful next steps based on your server type. + +### `dxt validate ` + +Validates a DXT manifest file against the schema. You can provide either a direct path to a manifest.json file or a directory containing one. + +```bash +# Validate specific manifest file +dxt validate manifest.json + +# Validate manifest in directory +dxt validate ./my-extension +dxt validate . +``` + +### `dxt pack [output]` + +Packs a directory into a DXT extension file. + +```bash +# Pack current directory into extension.dxt +dxt pack . + +# Pack with custom output filename +dxt pack my-extension/ my-extension-v1.0.dxt +``` + +The command automatically: + +- Validates the manifest.json +- Excludes common development files (.git, node_modules/.cache, .DS_Store, etc.) +- Creates a compressed .dxt file (ZIP with maximum compression) + +### `dxt sign ` + +Signs a DXT extension file with a certificate. + +```bash +# Sign with default certificate paths +dxt sign my-extension.dxt + +# Sign with custom certificate and key +dxt sign my-extension.dxt --cert /path/to/cert.pem --key /path/to/key.pem + +# Sign with intermediate certificates +dxt sign my-extension.dxt --cert cert.pem --key key.pem --intermediate intermediate1.pem intermediate2.pem + +# Create and use a self-signed certificate +dxt sign my-extension.dxt --self-signed +``` + +Options: + +- `--cert, -c`: Path to certificate file (PEM format, default: cert.pem) +- `--key, -k`: Path to private key file (PEM format, default: key.pem) +- `--intermediate, -i`: Paths to intermediate certificate files +- `--self-signed`: Create a self-signed certificate if none exists + +### `dxt verify ` + +Verifies the signature of a signed DXT extension file. + +```bash +dxt verify my-extension.dxt +``` + +Output includes: + +- Signature validity status +- Certificate subject and issuer +- Certificate validity dates +- Certificate fingerprint +- Warning if self-signed + +### `dxt info ` + +Displays information about a DXT extension file. + +```bash +dxt info my-extension.dxt +``` + +Shows: + +- File size +- Signature status +- Certificate details (if signed) + +### `dxt unsign ` + +Removes the signature from a DXT extension file (for development/testing). + +```bash +dxt unsign my-extension.dxt +``` + +## Certificate Requirements + +For signing extensions, you need: + +1. **Certificate**: X.509 certificate in PEM format + + - Should have Code Signing extended key usage + - Can be self-signed (for development) or CA-issued (for production) + +2. **Private Key**: Corresponding private key in PEM format + + - Must match the certificate's public key + +3. **Intermediate Certificates** (optional): For CA-issued certificates + - Required for proper certificate chain validation + +## Example Workflows + +### Quick Start with Init + +```bash +# 1. Create a new extension directory +mkdir my-awesome-extension +cd my-awesome-extension + +# 2. Initialize the extension +dxt init + +# 3. Follow the prompts to configure your extension +# The tool will create a manifest.json with all necessary fields + +# 4. Create your server implementation based on the entry point you specified + +# 5. Pack the extension +dxt pack . + +# 6. (Optional) Sign the extension +dxt sign my-awesome-extension.dxt --self-signed +``` + +### Development Workflow + +```bash +# 1. Create your extension +mkdir my-extension +cd my-extension + +# 2. Initialize with dxt init or create manifest.json manually +dxt init + +# 3. Implement your server +# For Node.js: create server/index.js +# For Python: create server/main.py +# For Binary: add your executable + +# 4. Validate manifest +dxt validate manifest.json + +# 5. Pack extension +dxt pack . my-extension.dxt + +# 6. (Optional) Sign for testing +dxt sign my-extension.dxt --self-signed + +# 7. Verify signature +dxt verify my-extension.dxt + +# 8. Check extension info +dxt info my-extension.dxt +``` + +### Production Workflow + +```bash +# 1. Pack your extension +dxt pack my-extension/ + +# 2. Sign with production certificate +dxt sign my-extension.dxt \ + --cert production-cert.pem \ + --key production-key.pem \ + --intermediate intermediate-ca.pem root-ca.pem + +# 3. Verify before distribution +dxt verify my-extension.dxt +``` + +## Excluded Files + +When packing an extension, the following files/patterns are automatically excluded: + +- `.DS_Store`, `Thumbs.db` +- `.gitignore`, `.git/` +- `*.log`, `npm-debug.log*`, `yarn-debug.log*`, `yarn-error.log*` +- `.npm/`, `.npmrc`, `.yarnrc`, `.yarn/`, `.pnp.*` +- `node_modules/.cache/`, `node_modules/.bin/` +- `*.map` +- `.env.local`, `.env.*.local` +- `package-lock.json`, `yarn.lock` + +### Custom Exclusions with .dxtignore + +You can create a `.dxtignore` file in your extension directory to specify additional files and patterns to exclude during packing. This works similar to `.npmignore` or `.gitignore`: + +``` +# .dxtignore example +# Comments start with # +*.test.js +src/**/*.test.ts +coverage/ +*.log +.env* +temp/ +docs/ +``` + +The `.dxtignore` file supports: + +- **Exact matches**: `filename.txt` +- **Simple globs**: `*.log`, `temp/*` +- **Directory paths**: `docs/`, `coverage/` +- **Comments**: Lines starting with `#` are ignored +- **Empty lines**: Blank lines are ignored + +When a `.dxtignore` file is found, the CLI will display the number of additional patterns being applied. These patterns are combined with the default exclusion list. + +## Technical Details + +### Signature Format + +DXT uses PKCS#7 (Cryptographic Message Syntax) for digital signatures: + +- Signatures are stored in DER-encoded PKCS#7 SignedData format +- The signature is appended to the DXT file with markers (`DXT_SIG_V1` and `DXT_SIG_END`) +- The entire DXT content (excluding the signature block) is signed +- Detached signature format - the original ZIP content remains unmodified + +### Signature Structure + +``` +[Original DXT ZIP content] +DXT_SIG_V1 +[Base64-encoded PKCS#7 signature] +DXT_SIG_END +``` + +This approach allows: + +- Backward compatibility (unsigned DXT files are valid ZIP files) +- Easy signature verification and removal +- Support for certificate chains with intermediate certificates diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..8f30a63 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,7 @@ +Copyright 2025 Anthropic, PBC. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/MANIFEST.md b/MANIFEST.md new file mode 100644 index 0000000..d1dab68 --- /dev/null +++ b/MANIFEST.md @@ -0,0 +1,608 @@ +# DXT Manifest.json Spec + +Current version: `0.1` +Last updated: 2025-06-17 + +## Manifest Schema + +The `manifest.json` file contains all extension metadata and configuration. Most fields are optional. + +A basic `manifest.json` with just the required fields looks like this: + +```json +{ + "dxt_version": "0.1", // DXT spec version this manifest conforms to + "name": "my-extension", // Machine-readable name (used for CLI, APIs) + "version": "1.0.0", // Semantic version of your extension + "description": "A simple MCP extension", // Brief description of what the extension does + "author": { + // Author information (required) + "name": "Extension Author" // Author's name (required field) + }, + "server": { + // Server configuration (required) + "type": "node", // Server type: "node", "python", or "binary" + "entry_point": "server/index.js", // Path to the main server file + "mcp_config": { + // MCP server configuration + "command": "node", // Command to run the server + "args": [ + // Arguments passed to the command + "${__dirname}/server/index.js" // ${__dirname} is replaced with the extension's directory + ] + } + } +} +``` + +```json +{ + "dxt_version": "0.1", + "name": "my-extension", + "version": "1.0.0", + "description": "A simple MCP extension", + "author": { + "name": "Extension Author" + }, + "server": { + "type": "node", + "entry_point": "server/index.js", + "mcp_config": { + "command": "node", + "args": ["${__dirname}/server/index.js"], + "env": { + "API_KEY": "${user_config.api_key}" + } + } + }, + "user_config": { + "api_key": { + "type": "string", + "title": "API Key", + "description": "Your API key for authentication", + "sensitive": true, + "required": true + } + } +} +``` + +A full `manifest.json` with most of the optional fields looks like this: + +```json +{ + "dxt_version": "0.1", + "name": "My MCP Extension", + "display_name": "My Awesome MCP Extension", + "version": "1.0.0", + "description": "A brief description of what this extension does", + "long_description": "A detailed description that can include multiple paragraphs explaining the extension's functionality, use cases, and features. It supports basic markdown.", + "author": { + "name": "Your Name", + "email": "yourname@example.com", + "url": "https://your-website.com" + }, + "repository": { + "type": "git", + "url": "https://github.com/your-username/my-mcp-extension" + }, + "homepage": "https://example.com/my-extension", + "documentation": "https://docs.example.com/my-extension", + "support": "https://github.com/your-username/my-extension/issues", + "icon": "icon.png", + "screenshots": [ + "assets/screenshots/screenshot1.png", + "assets/screenshots/screenshot2.png" + ], + "server": { + "type": "node", + "entry_point": "server/index.js", + "mcp_config": { + "command": "node", + "args": ["server/index.js"], + "env": { + "ALLOWED_DIRECTORIES": "${user_config.allowed_directories}" + } + } + }, + "tools": [ + { + "name": "search_files", + "description": "Search for files in a directory" + } + ], + "prompts": [ + { + "name": "poetry", + "description": "Have the LLM write poetry", + "arguments": ["topic"], + "text": "Write a creative poem about the following topic: ${arguments.topic}" + } + ], + "tools_generated": true, + "keywords": ["api", "automation", "productivity"], + "license": "MIT", + "compatibility": { + "claude_desktop": ">=1.0.0", + "platforms": ["darwin", "win32", "linux"], + "runtimes": { + "python": ">=3.8", + "node": ">=16.0.0" + } + }, + "user_config": { + "allowed_directories": { + "type": "directory", + "title": "Allowed Directories", + "description": "Directories the server can access", + "multiple": true, + "required": true, + "default": ["${HOME}/Desktop"] + }, + "api_key": { + "type": "string", + "title": "API Key", + "description": "Your API key for authentication", + "sensitive": true, + "required": false + }, + "max_file_size": { + "type": "number", + "title": "Maximum File Size (MB)", + "description": "Maximum file size to process", + "default": 10, + "min": 1, + "max": 100 + } + } +} +``` + +## Field Definitions + +### Required Fields + +- **dxt_version**: Specification version this extension conforms to +- **name**: Machine-readable name (used for CLI, APIs) +- **version**: Semantic version (semver) +- **description**: Brief description +- **author**: Author information object with name (required), email (optional), and url (optional) +- **server**: Server configuration object + +### Optional Fields + +- **icon**: Path to a png icon file, either relative in the package or a https:// url. +- **display_name**: Human-friendly name for UI display +- **long_description**: Detailed description for extension stores, markdown +- **repository**: Source code repository information (type and url) +- **homepage**: Extension homepage URL +- **documentation**: Documentation URL +- **support**: Support/issues URL +- **screenshots**: Array of screenshot paths +- **tools**: Array of tools the extension provides +- **tools_generated**: Boolean indicating the server generates additional tools at runtime (default: false) +- **prompts**: Array of prompts the extension provides +- **prompts_generated**: Boolean indicating the server generates additional prompts at runtime (default: false) +- **keywords**: Search keywords +- **license**: License identifier +- **compatibility**: Compatibility requirements (client app version, platforms, and runtime versions) +- **user_config**: User-configurable options for the extension (see User Configuration section) + +## Compatibility + +The `compatibility` object specifies all requirements for running the extension. All fields, including the `compatibility` field itself, are optional. If you specify nothing, clients implementing DXT are encouraged to run the extension on any system. + +```json +{ + "compatibility": { + "claude_desktop": ">=1.0.0", + "my_client": ">1.0.0", + "other_client": ">=2.0.0 <3.0.0", + "platforms": ["darwin", "win32", "linux"], + "runtimes": { + "python": ">=3.8", + "node": ">=16.0.0" + } + } +} +``` + +### Fields + +#### Client Version Constraints + +The compatibility object supports version constraints for any client application: + +- **claude_desktop**: Minimum Claude Desktop version required (uses semver) +- **my_client**: Version constraint for a custom client (uses semver) +- **Other client names**: You can add version constraints for any client application + +All client version constraints use semver syntax (e.g., `">=1.0.0"`, `">1.0.0 <2.0.0"`, `"^1.2.3"`). + +#### System Requirements + +- **platforms**: Array of supported platforms (`darwin`, `win32`, `linux`). These match Node.js `process.platform` and Python's `sys.platform` values. If omitted, all platforms are supported +- **runtimes**: Runtime version requirements + - Only specify the runtime(s) your extension actually uses + - For Python extensions: specify `python` version + - For Node.js extensions: specify `node` version + - Binary extensions don't need runtime specifications + +**Note**: Use `darwin` for macOS, `win32` for Windows, and `linux` for Linux systems + +### Examples + +**Python Extension:** + +```json +{ + "server": { + "type": "python", + "entry_point": "server/main.py" + }, + "compatibility": { + "claude_desktop": ">=0.10.0", + "platforms": ["darwin", "win32", "linux"], + "runtimes": { + "python": ">=3.8,<4.0" + } + } +} +``` + +**Node.js Extension that only supports macOS:** + +```json +{ + "server": { + "type": "node", + "entry_point": "server/index.js" + }, + "compatibility": { + "claude_desktop": ">=0.10.0", + "platforms": ["darwin"], + "runtimes": { + "node": ">=16.0.0" + } + } +} +``` + +**Binary Extension (no runtime needed):** + +```json +{ + "server": { + "type": "binary", + "entry_point": "server/my-tool" + }, + "compatibility": { + "claude_desktop": ">=0.10.0", + "platforms": ["darwin", "win32"] + } +} +``` + +## Server Configuration + +The `server` object defines how to run the MCP server: + +### Server Types + +1. **Python**: `server.type = "python"` + + - Requires `entry_point` to Python file + - All dependencies must be bundled in the DXT + - Can use `server/lib` for packages or `server/venv` for full virtual environment + - Python runtime version specified in `compatibility.runtimes.python` + +2. **Node.js**: `server.type = "node"` + + - Requires `entry_point` to JavaScript file + - All dependencies must be bundled in `node_modules` + - Node.js runtime version specified in `compatibility.runtimes.node` + - Typically includes `package.json` at extension root for dependency management + +3. **Binary**: `server.type = "binary"` + - Pre-compiled executable with all dependencies included + - Platform-specific binaries supported + - Completely self-contained (no runtime requirements) + +### MCP Configuration + +The `mcp_config` object in the server configuration defines how the implementing app should execute the MCP server. This replaces the manual JSON configuration users currently need to write. + +**Python Example:** + +```json +"mcp_config": { + "command": "python", + "args": ["server/main.py"], + "env": { + "PYTHONPATH": "server/lib" + } +} +``` + +**Node.js Example:** + +```json +"mcp_config": { + "command": "node", + "args": ["${__dirname}/server/index.js"], + "env": {} +} +``` + +**Binary Example (Cross-Platform):** + +```json +"mcp_config": { + "command": "server/my-server", + "args": ["--config", "server/config.json"], + "env": {} +} +``` + +_Note: For binaries, apps will automatically append `.exe` on Windows_ + +**Platform-Specific Configurations:** +For cases where different platforms need different configurations, use platform-specific overrides: + +```json +"mcp_config": { + "command": "server/my-server", + "args": ["--config", "server/config.json"], + "env": {}, + "platform_overrides": { + "win32": { + "command": "server/my-server.exe", + "args": ["--config", "server/config-windows.json"] + }, + "darwin": { + "env": { + "DYLD_LIBRARY_PATH": "server/lib" + } + } + } +} +``` + +When installing the extension, apps will automatically generate the appropriate MCP server configuration and add it to the user's settings, eliminating the need for manual JSON editing. + +**Variable Substitution:** +The implementing desktop app will substitute variables in the `mcp_config` to make extensions more portable: + +- **`${__dirname}`**: This variable is replaced with the absolute path to the extension's directory. This is useful for referencing files within the extension package. +- **`${HOME}`**: User's home directory +- **`${DESKTOP}`**: User's desktop directory +- **`${DOCUMENTS}`**: User's documents directory +- **`${DOWNLOADS}`**: User's downloads directory +- **`${pathSeparator}`** or **`${/}`**: Path separator for the current platform + +Example: + +```json +"mcp_config": { + "command": "python", + "args": ["${__dirname}/server/main.py"], + "env": { + "CONFIG_PATH": "${__dirname}/config/settings.json" + } +} +``` + +This ensures that paths work correctly regardless of where the extension is installed on the user's system. + +- **`${user_config}`**: Your extension can specify user-configured values that the implementing app will collect from users. Read on to learn more about user configuration. + +## User Configuration + +The `user_config` field allows extension developers to specify configuration options that can be presented to end users through the implementing app's user interface. These configurations are collected from users and passed to the MCP server at runtime. + +### Configuration Schema + +Each configuration option is defined as a key-value pair where the key is the configuration name and the value is an object with these properties: + +- **type**: The data type of the configuration + - `"string"`: Text input + - `"number"`: Numeric input + - `"boolean"`: Checkbox/toggle + - `"directory"`: Directory picker + - `"file"`: File picker +- **title**: Display name shown in the UI +- **description**: Help text explaining the configuration option +- **required**: Whether this field must be provided (default: false) +- **default**: Default value (supports variable substitution) +- **multiple**: For directory/file types, allow multiple selections (default: false) +- **sensitive**: For string types, mask input and store securely (default: false) +- **min/max**: For number types, validation constraints + +### Variable Substitution in User Configuration + +User configuration values support variable substitution in `mcp_config`: + +- **`${user_config.KEY}`**: Replaced with the user-provided value for configuration KEY +- Arrays (from multiple selections) are expanded as separate arguments +- Environment variables are ideal for sensitive data +- Command arguments work well for paths and non-sensitive options + +Available variables for default values: + +- **`${HOME}`**: User's home directory +- **`${DESKTOP}`**: User's desktop directory +- **`${DOCUMENTS}`**: User's documents directory + +### Examples + +**Filesystem Extension with Directory Configuration:** + +```json +{ + "user_config": { + "allowed_directories": { + "type": "directory", + "title": "Allowed Directories", + "description": "Select directories the filesystem server can access", + "multiple": true, + "required": true, + "default": ["${HOME}/Desktop", "${HOME}/Documents"] + } + }, + "server": { + "mcp_config": { + "command": "node", + "args": [ + "${__dirname}/server/index.js", + "${user_config.allowed_directories}" + ] + } + } +} +``` + +**API Integration with Authentication:** + +```json +{ + "user_config": { + "api_key": { + "type": "string", + "title": "API Key", + "description": "Your API key for authentication", + "sensitive": true, + "required": true + }, + "base_url": { + "type": "string", + "title": "API Base URL", + "description": "The base URL for API requests", + "default": "https://api.example.com", + "required": false + } + }, + "server": { + "mcp_config": { + "command": "node", + "args": ["server/index.js"], + "env": { + "API_KEY": "${user_config.api_key}", + "BASE_URL": "${user_config.base_url}" + } + } + } +} +``` + +**Database Connection Configuration:** + +```json +{ + "user_config": { + "database_path": { + "type": "file", + "title": "Database File", + "description": "Path to your SQLite database file", + "required": true + }, + "read_only": { + "type": "boolean", + "title": "Read Only Mode", + "description": "Open database in read-only mode", + "default": true + }, + "timeout": { + "type": "number", + "title": "Query Timeout (seconds)", + "description": "Maximum time for query execution", + "default": 30, + "min": 1, + "max": 300 + } + }, + "server": { + "mcp_config": { + "command": "python", + "args": [ + "server/main.py", + "--database", + "${user_config.database_path}", + "--timeout", + "${user_config.timeout}" + ], + "env": { + "READ_ONLY": "${user_config.read_only}" + } + } + } +} +``` + +### Implementation Notes + +- **Array Expansion**: When a configuration with `multiple: true` is used in `args`, each value is expanded as a separate argument. For example, if the user selects directories `/home/user/docs` and `/home/user/projects`, the args `["${user_config.allowed_directories}"]` becomes `["/home/user/docs", "/home/user/projects"]`. + +## Tools and Prompts + +These fields describe the tools and prompts your MCP server provides. For servers that generate capabilities dynamically at runtime, you can use the `_generated` flags to indicate this. + +Note: Resources are not included in the manifest because MCP resources are inherently dynamic - they represent URIs to data that the server discovers at runtime based on configuration, filesystem state, database connections, etc. + +### Static Declaration + +For servers with a fixed set of capabilities, list them in arrays. + +#### Prompt Structure + +Each prompt in the `prompts` array must include: + +- **name**: The identifier for the prompt +- **description** (optional): Explanation of what the prompt does +- **arguments** (optional): Array of argument names that can be used in the prompt text +- **text**: The actual prompt text that uses template variables like `${arguments.topic}` or `${arguments.aspect}` as placeholders for MCP Client-supplied arguments. If your argument is named `language`, you'd add `${arguments.language} where you expect it to show up in the prompt. + +Example: + +```json +{ + "tools": [ + { "name": "search_files", "description": "Search for files" }, + { "name": "read_file", "description": "Read file contents" } + ], + "prompts": [ + { + "name": "explain_code", + "description": "Explain how code works", + "arguments": ["code", "language"], + "text": "Please explain the following ${arguments.language} code in detail:\n\n${arguments.code}" + } + ] +} +``` + +Implementing apps may choose to validate prompts at run-time against the declaration of your prompts in the manifest. + +### Dynamic Generation + +For servers that generate capabilities based on context, configuration, or runtime discovery, use the `_generated` flags: + +```json +{ + "tools": [{ "name": "search", "description": "Search functionality" }], + "tools_generated": true, + "prompts_generated": true +} +``` + +This indicates that: + +- The server provides at least the `search` tool (and possibly more) +- Additional tools are generated at runtime +- Prompts are generated at runtime + +The `_generated` fields: + +- **tools_generated**: Server generates additional tools beyond those listed (default: false) +- **prompts_generated**: Server generates additional prompts beyond those listed (default: false) + +This helps implementing apps understand that querying the server at runtime will reveal more capabilities than what's declared in the manifest. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e08dee5 --- /dev/null +++ b/README.md @@ -0,0 +1,118 @@ +# Desktop Extensions (DXT) + +Desktop Extensions (`.dxt`) are zip archives containing a local MCP server and a `manifest.json` that describes the server and its capabilities. The format is spiritually similar to Chrome extensions (`.crx`) or VS Code extensions (`.vsix`), enabling end users to install local MCP servers with a single click. + +This repository provides three components: The extension specification in [MANIFEST.md](MANIFEST.md), a CLI tool for creating extensions (see [CLI.md](CLI.md)), and the code used by Claude for macOS and Windows to load and verify DXT extensions ([src/index.ts](src/index.ts)). + +- For developers of local MCP servers, we aim to make distribution and installation of said servers convenient +- For developers of apps supporting local MCP servers, we aim to make it easy to add support for DXT extensions + +Claude for macOS and Windows uses the code in this repository to enable single-click installation of local MCP servers, including a number of end user-friendly features - such as automatic updates, easy configuration of MCP servers and the variables and parameters they need, and a curated directory. We are committed to the open ecosystem around MCP servers and believe that its ability to be universally adopted by multiple applications and services has benefits developers aiming to connect AI tools to other apps and services. Consequently, we’re open-sourcing the Desktop Extension specification, toolchain, and the schemas and key functions used by Claude for macOS and Windows to implement its own support of Desktop Extensions. It is our hope that the `dxt` format doesn’t just make local MCP servers more portable for Claude, but other AI desktop applications, too. + +# For Extension Developers + +At the core, DXT are simple zip files containing your entire MCP server and a `manifest.json`. Consequently, turning a local MCP server into an extension is straightforward: You just have to put all your required files in a folder, create a `manifest.json`, and then create an archive. + +To make this process easier, this package offers a CLI that helps you with the creation of both the `manifest.json` and the final `.dxt` file. To install it, run: + +```sh +npm install -g @anthropic-ai/dxt +``` + +1. In a folder containing your local MCP server, run `dxt init`. This command will guide you through the creation of a `manifest.json`. +2. Run `dxt pack` to create a `dxt` file. +3. Now, any app implementing support for DXT can run your local MCP server. As an example, open the file with Claude for macOS and Windows to show an installation dialog. + +You can find the full spec for the `manifest.json` and all its mandatory and optional fields in [MANIFEST.md](MANIFEST.md). Examples for extensions can be found in [examples](./examples/). + +## Prompt Template for AI Tools + +AI tools like Claude Code are particularly good at creating desktop extensions when informed about the spec. When prompting an AI coding tool to build an extension, briefly explain what your extension aims to do - then add the following context to your instructions. + +> I want to build this as a Desktop Extension, abbreviated as "DXT". Please follow these steps: +> +> 1. **Read the specifications thoroughly:** +> - https://github.com/anthropics/dxt/blob/main/README.md - DXT architecture overview, capabilities, and integration +> patterns +> - https://github.com/anthropics/dxt/blob/main/MANIFEST.md - Complete extension manifest structure and field definitions +> - https://github.com/anthropics/dxt/tree/main/examples - Reference implementations including a "Hello World" example +> 2. **Create a proper extension structure:** +> - Generate a valid manifest.json following the MANIFEST.md spec +> - Implement an MCP server using @modelcontextprotocol/sdk with proper tool definitions +> - Include proper error handling, security measures, and timeout management +> 3. **Follow best development practices:** +> - Implement proper MCP protocol communication via stdio transport +> - Structure tools with clear schemas, validation, and consistent JSON responses +> - Make use of the fact that this extension will be running locally +> - Add appropriate logging and debugging capabilities +> - Include proper documentation and setup instructions +> 4. **Test considerations:** +> - Validate that all tool calls return properly structured responses +> - Verify manifest loads correctly and host integration works +> +> Generate complete, production-ready code that can be immediately tested. Focus on defensive programming, clear error messages, and following the exact DXT specifications to ensure compatibility with the ecosystem. + +## Directory Structures + +### Minimal Extension + +A `manifest.json` is the only required file. + +### Example: Node.js Extension + +``` +extension.dxt (ZIP file) +├── manifest.json # Required: Extension metadata and configuration +├── server/ # Server files +│ └── index.js # Main entry point +├── node_modules/ # Bundled dependencies +├── package.json # Optional: NPM package definition +├── icon.png # Optional: Extension icon +└── assets/ # Optional: Additional assets +``` + +### Example: Python Extension + +``` +extension.dxt (ZIP file) +├── manifest.json # Required: Extension metadata and configuration +├── server/ # Server files +│ ├── main.py # Main entry point +│ └── utils.py # Additional modules +├── lib/ # Bundled Python packages +├── requirements.txt # Optional: Python dependencies list +└── icon.png # Optional: Extension icon +``` + +### Example: Binary Extension + +``` +extension.dxt (ZIP file) +├── manifest.json # Required: Extension metadata and configuration +├── server/ # Server files +│ ├── my-server # Unix executable +│ ├── my-server.exe # Windows executable +└── icon.png # Optional: Extension icon +``` + +### Bundling Dependencies + +**Python Extensions:** + +- Bundle all required packages in `server/lib/` directory +- OR bundle a complete virtual environment in `server/venv/` +- Use tools like `pip-tools`, `poetry`, or `pipenv` to create reproducible bundles +- Set `PYTHONPATH` to include bundled packages via `mcp_config.env` + +**Node.js Extensions:** + +- Run `npm install --production` to create `node_modules` +- Bundle the entire `node_modules` directory with your extension +- Use `npm ci` or `yarn install --frozen-lockfile` for reproducible builds +- Server entry point specified in manifest.json's `server.entry_point` + +**Binary Extensions:** + +- Static linking preferred for maximum compatibility +- Include all required shared libraries if dynamic linking used +- Test on clean systems without development tools diff --git a/examples/chrome-applescript/manifest.json b/examples/chrome-applescript/manifest.json new file mode 100644 index 0000000..aebeafe --- /dev/null +++ b/examples/chrome-applescript/manifest.json @@ -0,0 +1,73 @@ +{ + "dxt_version": "0.1", + "name": "chrome-applescript", + "display_name": "Control Chrome with AppleScript", + "version": "0.1.0", + "description": "Control Google Chrome browser tabs, windows, and navigation", + "long_description": "This extension allows you to control Google Chrome browser tabs, windows, and navigation through Chrome's official AppleScript API. You can open URLs, manage tabs, execute JavaScript, and retrieve page content.\n\nThis extension is meant to be a demonstration of Desktop Extensions.\n\nThis extension is not affiliated with Google or Chrome.", + "author": { + "name": "Anthropic", + "email": "support@anthropic.com", + "url": "https://github.com/anthropics" + }, + "scripts": { + "start": "node server/index.js", + "build": "npx @anthropic-ai/dxt pack" + }, + "server": { + "type": "node", + "entry_point": "server/index.js", + "mcp_config": { + "command": "node", + "args": ["${__dirname}/server/index.js"], + "env": {} + } + }, + "tools": [ + { + "name": "open_url", + "description": "Open a URL in Chrome, either in a new tab or current tab." + }, + { + "name": "get_current_tab", + "description": "Get information about the current active tab." + }, + { + "name": "list_tabs", + "description": "List all open tabs in Chrome." + }, + { + "name": "close_tab", + "description": "Close a specific tab." + }, + { + "name": "switch_to_tab", + "description": "Switch to a specific tab." + }, + { + "name": "reload_tab", + "description": "Reload a tab." + }, + { + "name": "go_back", + "description": "Navigate back in browser history." + }, + { + "name": "go_forward", + "description": "Navigate forward in browser history." + }, + { + "name": "execute_javascript", + "description": "Execute JavaScript in the current tab." + }, + { + "name": "get_page_content", + "description": "Get the text content of the current page." + } + ], + "compatibility": { + "platforms": ["darwin"] + }, + "keywords": ["chrome", "browser", "remote"], + "license": "MIT" +} diff --git a/examples/chrome-applescript/server/index.js b/examples/chrome-applescript/server/index.js new file mode 100644 index 0000000..dd96bdd --- /dev/null +++ b/examples/chrome-applescript/server/index.js @@ -0,0 +1,784 @@ +#!/usr/bin/env node + +import { Server } from "@modelcontextprotocol/sdk/server/index.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { + CallToolRequestSchema, + ListToolsRequestSchema, +} from "@modelcontextprotocol/sdk/types.js"; +import { execFile } from "child_process"; +import { promisify } from "util"; + +const execFileAsync = promisify(execFile); + +// Constants +const APPLESCRIPT_TIMEOUT = 10000; // 10 seconds +const MAX_RETRIES = 3; +const RETRY_DELAY = 1000; // 1 second + +class ChromeControlServer { + constructor() { + this.server = new Server( + { + name: "chrome-applescript", + version: "0.1.0", + }, + { + capabilities: { + tools: {}, + }, + }, + ); + + this.setupHandlers(); + } + + // Helper methods + escapeForAppleScript(str) { + if (typeof str !== "string") return str; + // Basic AppleScript string escaping + return str + .replace(/\\/g, "\\\\") // Escape backslashes first + .replace(/"/g, '\\"') // Then escape double quotes + .replace(/\n/g, "\\n") // Escape newlines + .replace(/\r/g, "\\r"); // Escape carriage returns + } + + async checkChromeAvailable() { + try { + const script = 'tell application "Google Chrome" to return "available"'; + const result = await this.executeAppleScript(script); + return result === "available"; + } catch (error) { + return false; + } + } + + async executeAppleScript(script, retries = MAX_RETRIES) { + for (let attempt = 0; attempt <= retries; attempt++) { + try { + const { stdout, stderr } = await execFileAsync( + "osascript", + ["-e", script], + { + timeout: APPLESCRIPT_TIMEOUT, + maxBuffer: 1024 * 1024, // 1MB buffer + }, + ); + if (stderr) { + console.error("AppleScript stderr:", stderr); + } + return stdout.trim(); + } catch (error) { + if (attempt === retries) { + console.error("AppleScript execution error after retries:", error); + throw new Error(`AppleScript error: ${error.message}`); + } + // Retry with exponential backoff + await new Promise((resolve) => + setTimeout(resolve, RETRY_DELAY * Math.pow(2, attempt)), + ); + } + } + } + + async findTabById(tabId) { + const script = ` + tell application "Google Chrome" + repeat with w in windows + repeat with t in tabs of w + if (id of t as string) is "${tabId}" then + return {w, t, true} + end if + end repeat + end repeat + return {null, null, false} + end tell + `; + return this.executeAppleScript(script); + } + + async executeTabOperation( + tabId, + operation, + successMessage = "Operation completed", + ) { + if (!tabId) { + // No tab ID, execute on active tab + return this.executeAppleScript(operation.activeScript); + } + + const script = ` + tell application "Google Chrome" + repeat with w in windows + repeat with t in tabs of w + if (id of t as string) is "${tabId}" then + ${operation.tabScript} + return "${successMessage}" + end if + end repeat + end repeat + return "Tab not found" + end tell + `; + return this.executeAppleScript(script); + } + + setupHandlers() { + this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ + tools: [ + { + name: "open_url", + description: "Open a URL in Chrome", + inputSchema: { + type: "object", + properties: { + url: { type: "string", description: "URL to open" }, + new_tab: { + type: "boolean", + description: "Open in a new tab", + default: true, + }, + }, + required: ["url"], + }, + }, + { + name: "get_current_tab", + description: "Get information about the current active tab", + inputSchema: { type: "object", properties: {} }, + }, + { + name: "list_tabs", + description: "List all open tabs in Chrome", + inputSchema: { + type: "object", + properties: { + window_id: { + type: "number", + description: "Specific window ID to list tabs from", + }, + }, + }, + }, + { + name: "close_tab", + description: "Close a specific tab", + inputSchema: { + type: "object", + properties: { + tab_id: { type: "number", description: "ID of the tab to close" }, + }, + required: ["tab_id"], + }, + }, + { + name: "switch_to_tab", + description: "Switch to a specific tab", + inputSchema: { + type: "object", + properties: { + tab_id: { + type: "number", + description: "ID of the tab to switch to", + }, + }, + required: ["tab_id"], + }, + }, + { + name: "reload_tab", + description: "Reload a tab", + inputSchema: { + type: "object", + properties: { + tab_id: { + type: "number", + description: "ID of the tab to reload", + }, + }, + }, + }, + { + name: "go_back", + description: "Navigate back in browser history", + inputSchema: { + type: "object", + properties: { + tab_id: { type: "number", description: "ID of the tab" }, + }, + }, + }, + { + name: "go_forward", + description: "Navigate forward in browser history", + inputSchema: { + type: "object", + properties: { + tab_id: { type: "number", description: "ID of the tab" }, + }, + }, + }, + { + name: "execute_javascript", + description: "Execute JavaScript in the current tab", + inputSchema: { + type: "object", + properties: { + code: { + type: "string", + description: "JavaScript code to execute", + }, + tab_id: { type: "number", description: "ID of the tab" }, + }, + required: ["code"], + }, + }, + { + name: "get_page_content", + description: "Get the text content of the current page", + inputSchema: { + type: "object", + properties: { + tab_id: { type: "number", description: "ID of the tab" }, + }, + }, + }, + ], + })); + + this.server.setRequestHandler(CallToolRequestSchema, async (request) => { + const { name, arguments: args } = request.params; + + try { + // Check Chrome availability first + const isChromeAvailable = await this.checkChromeAvailable(); + if (!isChromeAvailable) { + return { + content: [ + { + type: "text", + text: "Error: Google Chrome is not available or not running", + }, + ], + isError: true, + }; + } + + switch (name) { + case "open_url": { + const { url, new_tab = true } = args; + if (!url || typeof url !== "string") { + throw new Error("URL is required and must be a string"); + } + + const escapedUrl = this.escapeForAppleScript(url); + const script = new_tab + ? `tell application "Google Chrome" to open location "${escapedUrl}"` + : `tell application "Google Chrome" to set URL of active tab of front window to "${escapedUrl}"`; + + await this.executeAppleScript(script); + return { + content: [ + { + type: "text", + text: JSON.stringify( + { + success: true, + action: new_tab + ? "opened_new_tab" + : "navigated_current_tab", + url: url, + }, + null, + 2, + ), + }, + ], + }; + } + + case "get_current_tab": { + const script = ` + tell application "Google Chrome" + set currentTab to active tab of front window + set tabInfo to {URL of currentTab, title of currentTab, id of currentTab} + return tabInfo + end tell + `; + const result = await this.executeAppleScript(script); + const [url, title, id] = result.split(", "); + return { + content: [ + { + type: "text", + text: JSON.stringify( + { + success: true, + url, + title, + id: parseInt(id), + }, + null, + 2, + ), + }, + ], + }; + } + + case "list_tabs": { + const script = ` + tell application "Google Chrome" + set tabsList to {} + repeat with w in windows + repeat with t in tabs of w + set end of tabsList to {id of t as string, URL of t, title of t} + end repeat + end repeat + set AppleScript's text item delimiters to "|" + set output to "" + repeat with tabInfo in tabsList + set output to output & (item 1 of tabInfo) & "," & (item 2 of tabInfo) & "," & (item 3 of tabInfo) & "|" + end repeat + return output + end tell + `; + const result = await this.executeAppleScript(script); + const tabs = result + .split("|") + .filter((tab) => tab) + .map((tab) => { + const [id, url, title] = tab.split(","); + return { id: parseInt(id), url, title }; + }); + return { + content: [ + { + type: "text", + text: JSON.stringify( + { + success: true, + tabs: tabs, + count: tabs.length, + }, + null, + 2, + ), + }, + ], + }; + } + + case "close_tab": { + const { tab_id } = args; + + const result = await this.executeTabOperation( + tab_id, + { + tabScript: "close t", + activeScript: ` + tell application "Google Chrome" + close active tab of front window + return "Tab closed" + end tell + `, + }, + "Tab closed", + ); + + return { + content: [ + { + type: "text", + text: JSON.stringify( + { + success: result === "Tab closed", + message: result, + }, + null, + 2, + ), + }, + ], + }; + } + + case "switch_to_tab": { + const { tab_id } = args; + + const result = await this.executeTabOperation( + tab_id, + { + tabScript: ` + set active tab of w to t + set index of w to 1 + activate + `, + activeScript: ` + tell application "Google Chrome" + activate + return "Chrome activated" + end tell + `, + }, + "Switched to tab", + ); + + return { + content: [ + { + type: "text", + text: JSON.stringify( + { + success: result !== "Tab not found", + message: result, + }, + null, + 2, + ), + }, + ], + }; + } + + case "reload_tab": { + const { tab_id } = args; + + const result = await this.executeTabOperation( + tab_id, + { + tabScript: "reload t", + activeScript: ` + tell application "Google Chrome" + reload active tab of front window + return "Tab reloaded" + end tell + `, + }, + "Tab reloaded", + ); + + return { + content: [ + { + type: "text", + text: JSON.stringify( + { + success: result !== "Tab not found", + message: result, + }, + null, + 2, + ), + }, + ], + }; + } + + case "go_back": { + const { tab_id } = args; + + const result = await this.executeTabOperation( + tab_id, + { + tabScript: "go back t", + activeScript: ` + tell application "Google Chrome" + go back active tab of front window + return "Navigated back" + end tell + `, + }, + "Navigated back", + ); + + return { + content: [ + { + type: "text", + text: JSON.stringify( + { + success: result !== "Tab not found", + message: result, + }, + null, + 2, + ), + }, + ], + }; + } + + case "go_forward": { + const { tab_id } = args; + + const result = await this.executeTabOperation( + tab_id, + { + tabScript: "go forward t", + activeScript: ` + tell application "Google Chrome" + go forward active tab of front window + return "Navigated forward" + end tell + `, + }, + "Navigated forward", + ); + + return { + content: [ + { + type: "text", + text: JSON.stringify( + { + success: result !== "Tab not found", + message: result, + }, + null, + 2, + ), + }, + ], + }; + } + + case "execute_javascript": { + const { code, tab_id } = args; + if (!code || typeof code !== "string") { + throw new Error( + "JavaScript code is required and must be a string", + ); + } + + // Wrap the code to capture console.log outputs + const wrappedCode = ` + (function() { + const logs = []; + const originalLog = console.log; + const originalWarn = console.warn; + const originalError = console.error; + const originalInfo = console.info; + + console.log = function(...args) { + logs.push({type: 'log', message: args.map(arg => { + try { + return typeof arg === 'object' ? JSON.stringify(arg) : String(arg); + } catch (e) { + return String(arg); + } + }).join(' ')}); + originalLog.apply(console, args); + }; + + console.warn = function(...args) { + logs.push({type: 'warn', message: args.map(arg => { + try { + return typeof arg === 'object' ? JSON.stringify(arg) : String(arg); + } catch (e) { + return String(arg); + } + }).join(' ')}); + originalWarn.apply(console, args); + }; + + console.error = function(...args) { + logs.push({type: 'error', message: args.map(arg => { + try { + return typeof arg === 'object' ? JSON.stringify(arg) : String(arg); + } catch (e) { + return String(arg); + } + }).join(' ')}); + originalError.apply(console, args); + }; + + console.info = function(...args) { + logs.push({type: 'info', message: args.map(arg => { + try { + return typeof arg === 'object' ? JSON.stringify(arg) : String(arg); + } catch (e) { + return String(arg); + } + }).join(' ')}); + originalInfo.apply(console, args); + }; + + let result; + try { + result = (function() { + ${code} + })(); + } catch (error) { + result = {error: error.toString(), stack: error.stack}; + } finally { + console.log = originalLog; + console.warn = originalWarn; + console.error = originalError; + console.info = originalInfo; + } + + return { + result: result, + logs: logs + }; + })(); + `; + + const escapedCode = this.escapeForAppleScript(wrappedCode); + + const script = tab_id + ? ` + tell application "Google Chrome" + repeat with w in windows + repeat with t in tabs of w + if (id of t as string) is "${tab_id}" then + set result to execute t javascript "${escapedCode}" + return result + end if + end repeat + end repeat + return "Tab not found" + end tell + ` + : ` + tell application "Google Chrome" + execute active tab of front window javascript "${escapedCode}" + end tell + `; + + const result = await this.executeAppleScript(script); + + // Parse the result to extract logs and actual result + try { + const parsed = JSON.parse(result); + + return { + content: [ + { + type: "text", + text: JSON.stringify( + { + success: true, + logs: parsed.logs || [], + result: parsed.result, + hasErrors: + parsed.result && parsed.result.error ? true : false, + }, + null, + 2, + ), + }, + ], + }; + } catch (e) { + // If parsing fails, return structured error + return { + content: [ + { + type: "text", + text: JSON.stringify( + { + success: false, + error: "Failed to parse JavaScript execution result", + rawResult: result || "No result returned", + }, + null, + 2, + ), + }, + ], + }; + } + } + + case "get_page_content": { + const { tab_id } = args; + + const jsCode = "document.body.innerText"; + const script = tab_id + ? ` + tell application "Google Chrome" + repeat with w in windows + repeat with t in tabs of w + if (id of t as string) is "${tab_id}" then + set pageContent to execute t javascript "${jsCode}" + return pageContent + end if + end repeat + end repeat + return "Tab not found" + end tell + ` + : ` + tell application "Google Chrome" + execute active tab of front window javascript "${jsCode}" + end tell + `; + + const result = await this.executeAppleScript(script); + return { + content: [ + { + type: "text", + text: JSON.stringify( + { + success: result !== "Tab not found", + content: result, + contentLength: result.length, + }, + null, + 2, + ), + }, + ], + }; + } + + default: + throw new Error(`Unknown tool: ${name}`); + } + } catch (error) { + console.error(`Error in tool '${name}':`, error); + return { + content: [ + { + type: "text", + text: JSON.stringify( + { + success: false, + error: error.message, + tool: name, + args: args, + }, + null, + 2, + ), + }, + ], + isError: true, + }; + } + }); + } + + async run() { + try { + const isChromeAvailable = await this.checkChromeAvailable(); + if (!isChromeAvailable) { + console.error("Warning: Google Chrome is not available or not running"); + } + + const transport = new StdioServerTransport(); + await this.server.connect(transport); + console.error("Chrome AppleScript MCP server running on stdio"); + } catch (error) { + console.error("Failed to start Chrome AppleScript MCP server:", error); + throw error; + } + } +} + +const server = new ChromeControlServer(); +server.run().catch(console.error); diff --git a/examples/chrome-applescript/yarn.lock b/examples/chrome-applescript/yarn.lock new file mode 100644 index 0000000..68af468 --- /dev/null +++ b/examples/chrome-applescript/yarn.lock @@ -0,0 +1,90 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@modelcontextprotocol/sdk@^0.6.0": + version "0.6.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@modelcontextprotocol/sdk/-/sdk-0.6.1.tgz#4e144155992749faf191faa512ac0c7a23152522" + integrity sha512-OkVXMix3EIbB5Z6yife2XTrSlOnVvCLR1Kg91I4pYFEsV9RbnoyQVScXCuVhGaZHOnTZgso8lMQN1Po2TadGKQ== + dependencies: + content-type "^1.0.5" + raw-body "^3.0.0" + zod "^3.23.8" + +bytes@3.1.2: + version "3.1.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +content-type@^1.0.5: + version "1.0.5" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +depd@2.0.0: + version "2.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +inherits@2.0.4: + version "2.0.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +raw-body@^3.0.0: + version "3.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/raw-body/-/raw-body-3.0.0.tgz#25b3476f07a51600619dae3fe82ddc28a36e5e0f" + integrity sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.6.3" + unpipe "1.0.0" + +"safer-buffer@>= 2.1.2 < 3.0.0": + 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#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +statuses@2.0.1: + version "2.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +unpipe@1.0.0: + version "1.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +zod@^3.23.8: + version "3.25.55" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/zod/-/zod-3.25.55.tgz#b1ffd48a34f558d1a912d1ed6bf84a6ca692fbe1" + integrity sha512-219huNnkSLQnLsQ3uaRjXsxMrVm5C9W3OOpEVt2k5tvMKuA8nBSu38e0B//a+he9Iq2dvmk2VyYVlHqiHa4YBA== diff --git a/examples/file-manager-python/manifest.json b/examples/file-manager-python/manifest.json new file mode 100644 index 0000000..7ae50af --- /dev/null +++ b/examples/file-manager-python/manifest.json @@ -0,0 +1,77 @@ +{ + "dxt_version": "0.1", + "name": "file-manager-python", + "display_name": "Python File Manager MCP", + "version": "0.1.0", + "description": "A Python MCP server for file operations", + "long_description": "This extension provides file management capabilities through a Python MCP server. It demonstrates Python-based Desktop Extension development, including file operations, directory management, and proper MCP protocol implementation.", + "author": { + "name": "Anthropic", + "email": "support@anthropic.com", + "url": "https://github.com/anthropics" + }, + "server": { + "type": "python", + "entry_point": "server/main.py", + "mcp_config": { + "command": "python", + "args": [ + "${__dirname}/server/main.py", + "--workspace=${user_config.workspace_directory}" + ], + "env": { + "DEBUG": "${user_config.debug_mode}", + "PYTHONPATH": "${__dirname}/server/lib" + } + } + }, + "tools": [ + { + "name": "list_files", + "description": "List files in a directory" + }, + { + "name": "read_file", + "description": "Read file contents" + }, + { + "name": "get_file_info", + "description": "Get information about a file" + } + ], + "keywords": [ + "file", + "directory", + "python", + "management", + "filesystem" + ], + "license": "MIT", + "user_config": { + "workspace_directory": { + "type": "directory", + "title": "Workspace Directory", + "description": "Directory to use as workspace", + "default": "${HOME}/Documents", + "required": false + }, + "debug_mode": { + "type": "boolean", + "title": "Debug Mode", + "description": "Enable debug output", + "default": false, + "required": false + } + }, + "compatibility": { + "claude_desktop": ">=0.10.0", + "platforms": [ + "darwin", + "win32", + "linux" + ], + "runtimes": { + "python": ">=3.8.0 <4" + } + } +} \ No newline at end of file diff --git a/examples/file-manager-python/pyproject.toml b/examples/file-manager-python/pyproject.toml new file mode 100644 index 0000000..7895f32 --- /dev/null +++ b/examples/file-manager-python/pyproject.toml @@ -0,0 +1,31 @@ +[build-system] +requires = ["setuptools>=42", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "file-manager-python" +version = "0.1.0" +description = "A Python MCP server for file operations" +authors = [ + {name = "Anthropic", email = "support@anthropic.com"} +] +license = {text = "MIT"} +classifiers = [ + "Private :: Do Not Upload" # Prevents accidental uploads to PyPI +] + +[project.dependencies] +mcp = ">=1.0.0" +trio = ">=0.22.0" + +[tool.setuptools] +packages = ["server"] + +[project.scripts] +bundle-deps = "python:install_deps" + +# Custom scripts section for DXT development +[tool.dxt] +bundle = "pip install \"mcp[all]\" --target server/lib --upgrade --force-reinstall" +test = "python server/main.py --debug" +pack = "npx @anthropic-ai/dxt pack" \ No newline at end of file diff --git a/examples/file-manager-python/requirements.txt b/examples/file-manager-python/requirements.txt new file mode 100644 index 0000000..d90d65c --- /dev/null +++ b/examples/file-manager-python/requirements.txt @@ -0,0 +1,2 @@ +mcp>=1.0.0 +trio>=0.22.0 diff --git a/examples/file-manager-python/server/main.py b/examples/file-manager-python/server/main.py new file mode 100644 index 0000000..f55e039 --- /dev/null +++ b/examples/file-manager-python/server/main.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 + +import os +import sys +import argparse +from pathlib import Path +from mcp.server.fastmcp import FastMCP + +# Parse command line arguments +parser = argparse.ArgumentParser(description="File Manager MCP Server") +parser.add_argument( + "--workspace", default=os.path.expanduser("~/Documents"), help="Workspace directory" +) +parser.add_argument("--debug", action="store_true", help="Enable debug mode") +args = parser.parse_args() + +# Initialize server +mcp = FastMCP("file-manager-python") + + +@mcp.tool() +def list_files(path: str) -> str: + """List files in a directory""" + path_obj = Path(path) + + if not path_obj.exists(): + return f"Directory not found: {path}" + + if not path_obj.is_dir(): + return f"Path is not a directory: {path}" + + try: + files = [] + for item in path_obj.iterdir(): + file_type = "directory" if item.is_dir() else "file" + files.append(f"{item.name} ({file_type})") + + if not files: + return f"Directory is empty: {path}" + + file_list = "\n".join(files) + return f"Files in {path}:\n{file_list}" + + except PermissionError: + return f"Permission denied accessing: {path}" + except Exception as e: + return f"Error listing directory: {str(e)}" + + +@mcp.tool() +def read_file(path: str) -> str: + """Read file contents""" + path_obj = Path(path) + + if not path_obj.exists(): + return f"File not found: {path}" + + if not path_obj.is_file(): + return f"Path is not a file: {path}" + + try: + with path_obj.open("r", encoding="utf-8") as f: + content = f.read() + + return f"Contents of {path}:\n{content}" + + except UnicodeDecodeError: + return f"File is not text or uses unsupported encoding: {path}" + except PermissionError: + return f"Permission denied reading: {path}" + except Exception as e: + return f"Error reading file: {str(e)}" + + +@mcp.tool() +def get_file_info(path: str) -> str: + """Get information about a file""" + path_obj = Path(path) + + if not path_obj.exists(): + return f"Path not found: {path}" + + try: + stat_info = path_obj.stat() + file_type = "directory" if path_obj.is_dir() else "file" + + info = [ + f"Path: {path}", + f"Type: {file_type}", + f"Size: {stat_info.st_size} bytes", + f"Modified: {stat_info.st_mtime}", + f"Created: {stat_info.st_ctime}", + ] + + info_text = "\n".join(info) + return f"File Info:\n{info_text}" + + except PermissionError: + return f"Permission denied accessing: {path}" + except Exception as e: + return f"Error getting file info: {str(e)}" + + +# Main execution +if __name__ == "__main__": + # Debug output if enabled + if args.debug: + print("Starting File Manager MCP Server...", file=sys.stderr) + print(f"Workspace: {args.workspace}", file=sys.stderr) + + # Run the server + mcp.run() diff --git a/examples/hello-world-node/icon.png b/examples/hello-world-node/icon.png new file mode 100644 index 0000000..3a34a18 Binary files /dev/null and b/examples/hello-world-node/icon.png differ diff --git a/examples/hello-world-node/manifest.json b/examples/hello-world-node/manifest.json new file mode 100644 index 0000000..fc7d040 --- /dev/null +++ b/examples/hello-world-node/manifest.json @@ -0,0 +1,106 @@ +{ + "dxt_version": "0.1", + "name": "hello-world-node", + "display_name": "Hello World MCP Server (Reference Extension)", + "version": "0.1.0", + "description": "A reference MCP extension demonstrating best practices and all available features", + "long_description": "This is a reference implementation of a Desktop Extension (DXT). It demonstrates all available manifest features, user configuration options, and security best practices. Use this extension as a template when creating your own MCP servers. The extension includes examples of all user configuration types, proper request token verification, and comprehensive metadata fields.", + "author": { + "name": "Acme Inc", + "email": "support@acme.void", + "url": "https://www.acme.void" + }, + "repository": { + "type": "git", + "url": "https://github.com/acme/my-repo" + }, + "homepage": "https://docs.acme.void/my-repo/extensions", + "documentation": "https://docs.acme.void/my-repo/extensions/hello-world", + "support": "https://github.com/acme/my-repo/issues", + "icon": "icon.png", + "server": { + "type": "node", + "entry_point": "server/index.js", + "mcp_config": { + "command": "node", + "args": [ + "${__dirname}/server/index.js", + "--verbose=${user_config.verbose_logging}", + "--max-results=${user_config.max_results}", + "--config=${user_config.config_file}", + "--workspace=${user_config.workspace_directory}" + ], + "env": { + "API_KEY": "${user_config.api_key}", + "DEBUG": "${user_config.debug_mode}" + } + } + }, + "tools": [ + { + "name": "get_current_time", + "description": "Get the current computer time in various formats" + } + ], + "keywords": [ + "reference", + "example", + "hello-world", + "tutorial", + "mcp", + "time" + ], + "license": "MIT", + "user_config": { + "api_key": { + "type": "string", + "title": "API Key", + "description": "Your API key for authentication (example of sensitive string)", + "sensitive": true, + "required": false + }, + "verbose_logging": { + "type": "boolean", + "title": "Verbose Logging", + "description": "Enable detailed logging output", + "default": false, + "required": false + }, + "max_results": { + "type": "number", + "title": "Maximum Results", + "description": "Maximum number of results to return", + "default": 10, + "min": 1, + "max": 100, + "required": false + }, + "config_file": { + "type": "file", + "title": "Configuration File", + "description": "Path to a JSON configuration file", + "required": false + }, + "workspace_directory": { + "type": "directory", + "title": "Workspace Directory", + "description": "Directory to use as workspace", + "default": "${HOME}/Documents", + "required": false + }, + "debug_mode": { + "type": "string", + "title": "Debug Mode", + "description": "Set debug level (example of non-sensitive string)", + "default": "info", + "required": false + } + }, + "compatibility": { + "claude_desktop": ">=0.10.0", + "platforms": ["darwin", "win32", "linux"], + "runtimes": { + "node": ">=16.0.0" + } + } +} diff --git a/examples/hello-world-node/package.json b/examples/hello-world-node/package.json new file mode 100644 index 0000000..a418730 --- /dev/null +++ b/examples/hello-world-node/package.json @@ -0,0 +1,11 @@ +{ + "name": "hello-world-node", + "version": "0.1.0", + "description": "A simple MCP server that returns the current time", + "type": "module", + "main": "server/index.js", + "license": "MIT", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.12.1" + } +} diff --git a/examples/hello-world-node/server/index.js b/examples/hello-world-node/server/index.js new file mode 100644 index 0000000..03efb72 --- /dev/null +++ b/examples/hello-world-node/server/index.js @@ -0,0 +1,70 @@ +#!/usr/bin/env node + +import { Server } from "@modelcontextprotocol/sdk/server/index.js"; +import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { + CallToolRequestSchema, + ListToolsRequestSchema, +} from "@modelcontextprotocol/sdk/types.js"; + +const server = new Server( + { + name: "hello-world-node", + version: "1.0.0", + }, + { + capabilities: { + tools: {}, + }, + }, +); + +// Handle tool listing +server.setRequestHandler(ListToolsRequestSchema, async (request) => { + return { + tools: [ + { + name: "get_current_time", + description: "Get the current computer time", + inputSchema: { + type: "object", + properties: {}, + }, + }, + ], + }; +}); + +// Handle tool execution +server.setRequestHandler(CallToolRequestSchema, async (request) => { + if (request.params.name === "get_current_time") { + const now = new Date(); + const timeString = now.toLocaleString("en-US", { + weekday: "long", + year: "numeric", + month: "long", + day: "numeric", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + timeZoneName: "short", + }); + + return { + content: [ + { + type: "text", + text: `The current time is: ${timeString}`, + }, + ], + }; + } + + throw new Error(`Unknown tool: ${request.params.name}`); +}); + +// Start the server +const transport = new StdioServerTransport(); +server.connect(transport); + +console.error("Hello World MCP server running..."); diff --git a/examples/hello-world-node/yarn.lock b/examples/hello-world-node/yarn.lock new file mode 100644 index 0000000..e4b6da8 --- /dev/null +++ b/examples/hello-world-node/yarn.lock @@ -0,0 +1,621 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@modelcontextprotocol/sdk@^1.12.1": + version "1.12.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@modelcontextprotocol/sdk/-/sdk-1.12.1.tgz#f77503f0263b33cb1e5b81a6ff0c322393cabd37" + integrity sha512-KG1CZhZfWg+u8pxeM/mByJDScJSrjjxLc8fwQqbsS8xCjBmQfMNEBTotYdNanKekepnfRI85GtgQlctLFpcYPw== + dependencies: + ajv "^6.12.6" + content-type "^1.0.5" + cors "^2.8.5" + cross-spawn "^7.0.5" + eventsource "^3.0.2" + 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" + +accepts@^2.0.0: + version "2.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" + integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== + dependencies: + mime-types "^3.0.0" + negotiator "^1.0.0" + +ajv@^6.12.6: + version "6.12.6" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +body-parser@^2.2.0: + version "2.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/body-parser/-/body-parser-2.2.0.tgz#f7a9656de305249a715b549b7b8fd1ab9dfddcfa" + integrity sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg== + 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, bytes@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + 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#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bound@^1.0.2: + version "1.0.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +content-disposition@^1.0.0: + version "1.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/content-disposition/-/content-disposition-1.0.0.tgz#844426cb398f934caefcbb172200126bc7ceace2" + integrity sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg== + dependencies: + safe-buffer "5.2.1" + +content-type@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@^1.2.1: + version "1.2.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" + integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== + +cookie@^0.7.1: + version "0.7.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + +cors@^2.8.5: + version "2.8.5" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cross-spawn@^7.0.5: + version "7.0.6" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@^4.3.5, debug@^4.4.0: + version "4.4.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + +depd@2.0.0, depd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +encodeurl@^2.0.0: + version "2.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +es-define-property@^1.0.1: + 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#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + 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#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +escape-html@^1.0.3: + version "1.0.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +etag@^1.8.1: + version "1.8.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventsource-parser@^3.0.1: + version "3.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eventsource-parser/-/eventsource-parser-3.0.2.tgz#0fea1abd26eca8201099ff5212f6c4e7ca2fd5d3" + integrity sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA== + +eventsource@^3.0.2: + version "3.0.7" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eventsource/-/eventsource-3.0.7.tgz#1157622e2f5377bb6aef2114372728ba0c156989" + integrity sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA== + dependencies: + eventsource-parser "^3.0.1" + +express-rate-limit@^7.5.0: + version "7.5.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/express-rate-limit/-/express-rate-limit-7.5.0.tgz#6a67990a724b4fbbc69119419feef50c51e8b28f" + integrity sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg== + +express@^5.0.1: + version "5.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/express/-/express-5.1.0.tgz#d31beaf715a0016f0d53f47d3b4d7acf28c75cc9" + integrity sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA== + 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" + +fast-deep-equal@^3.1.1: + 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#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + 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#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +finalhandler@^2.1.0: + version "2.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/finalhandler/-/finalhandler-2.1.0.tgz#72306373aa89d05a8242ed569ed86a1bff7c561f" + integrity sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q== + 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" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@^2.0.0: + version "2.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" + integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-intrinsic@^1.2.5, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + 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" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +gopd@^1.2.0: + version "1.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +has-symbols@^1.1.0: + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +hasown@^2.0.2: + version "2.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +http-errors@2.0.0, http-errors@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +iconv-lite@0.6.3, iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-promise@^4.0.0: + version "4.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/json-schema-traverse/0.4.1/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA= + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +media-typer@^1.1.0: + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" + integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== + +merge-descriptors@^2.0.0: + version "2.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" + integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== + +mime-db@^1.54.0: + version "1.54.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + +mime-types@^3.0.0, mime-types@^3.0.1: + version "3.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce" + integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== + dependencies: + mime-db "^1.54.0" + +ms@^2.1.3: + version "2.1.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +negotiator@^1.0.0: + version "1.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" + integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== + +object-assign@^4: + version "4.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +on-finished@^2.4.1: + version "2.4.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@^1.4.0: + version "1.4.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +parseurl@^1.3.3: + version "1.3.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-to-regexp@^8.0.0: + 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#73990cc29e57a3ff2a0d914095156df5db79e8b4" + integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== + +pkce-challenge@^5.0.0: + version "5.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/pkce-challenge/-/pkce-challenge-5.0.0.tgz#c3a405cb49e272094a38e890a2b51da0228c4d97" + integrity sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ== + +proxy-addr@^2.0.7: + version "2.0.7" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qs@^6.14.0: + version "6.14.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== + dependencies: + side-channel "^1.1.0" + +range-parser@^1.2.1: + version "1.2.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.0.tgz#25b3476f07a51600619dae3fe82ddc28a36e5e0f" + integrity sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.6.3" + unpipe "1.0.0" + +router@^2.2.0: + version "2.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" + integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== + dependencies: + debug "^4.4.0" + depd "^2.0.0" + is-promise "^4.0.0" + parseurl "^1.3.3" + path-to-regexp "^8.0.0" + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +send@^1.1.0, send@^1.2.0: + version "1.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/send/-/send-1.2.0.tgz#32a7554fb777b831dfa828370f773a3808d37212" + integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw== + 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" + +serve-static@^2.2.0: + version "2.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/serve-static/-/serve-static-2.2.0.tgz#9c02564ee259bdd2251b82d659a2e7e1938d66f9" + integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ== + dependencies: + encodeurl "^2.0.0" + escape-html "^1.0.3" + parseurl "^1.3.3" + send "^1.2.0" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel-list@^1.0.0: + 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#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + 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#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + 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#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + 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" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + 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" + +statuses@2.0.1, statuses@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +type-is@^2.0.0, type-is@^2.0.1: + version "2.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97" + integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== + dependencies: + content-type "^1.0.5" + media-typer "^1.1.0" + mime-types "^3.0.0" + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +vary@^1, vary@^1.1.2: + version "1.1.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +which@^2.0.1: + version "2.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrappy@1: + 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#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +zod-to-json-schema@^3.24.1: + version "3.24.5" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz#d1095440b147fb7c2093812a53c54df8d5df50a3" + integrity sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g== + +zod@^3.23.8: + version "3.25.63" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.63.tgz#5eac66b56aa9f5e1cd3604dd541b819110474efa" + integrity sha512-3ttCkqhtpncYXfP0f6dsyabbYV/nEUW+Xlu89jiXbTBifUfjaSqXOG6JnQPLtqt87n7KAmnMqcjay6c0Wq0Vbw== diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..8337f2a --- /dev/null +++ b/jest.config.js @@ -0,0 +1,23 @@ +export default { + preset: "ts-jest", + testEnvironment: "node", + testMatch: ["**/test/**/*.test.ts"], + collectCoverageFrom: ["src/**/*.ts", "!src/**/*.d.ts"], + moduleFileExtensions: ["ts", "js", "json"], + transform: { + "^.+\\.ts$": [ + "ts-jest", + { + tsconfig: { + module: "es2022", + esModuleInterop: true, + allowJs: true, + target: "es2020", + }, + }, + ], + }, + moduleNameMapper: { + "^(\\.{1,2}/.*)\\.js$": "$1", + }, +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..435e1ab --- /dev/null +++ b/package.json @@ -0,0 +1,77 @@ +{ + "name": "@anthropic-ai/dxt", + "description": "Tools for building Desktop Extensions", + "version": "0.1.0-dev.20250622054707", + "type": "module", + "main": "dist/index.js", + "module": "dist/index.js", + "types": "dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.js" + }, + "./browser": { + "types": "./dist/browser.d.ts", + "import": "./dist/browser.js", + "require": "./dist/browser.js" + }, + "./node": { + "types": "./dist/node.d.ts", + "import": "./dist/node.js", + "require": "./dist/node.js" + }, + "./cli": { + "types": "./dist/cli.d.ts", + "import": "./dist/cli.js", + "require": "./dist/cli.js" + } + }, + "bin": { + "dxt": "dist/cli/cli.js" + }, + "files": [ + "dist" + ], + "scripts": { + "build": "tsc", + "dev": "tsc --watch", + "test": "jest", + "test:watch": "jest --watch", + "prepublishOnly": "npm run build", + "fix": "eslint --ext .ts . --fix && prettier -w .", + "lint": "tsc -p ./tsconfig.json && eslint --ext .ts .", + "dev-version": "./scripts/create-dev-version.js" + }, + "author": "Anthropic ", + "license": "MIT", + "devDependencies": { + "@types/jest": "^29.5.14", + "@types/node": "^22.15.3", + "@types/node-forge": "1.3.11", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", + "eslint": "^8.43.0", + "eslint-config-prettier": "^8.10.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-simple-import-sort": "^10.0.0", + "jest": "^29.7.0", + "prettier": "^3.3.3", + "ts-jest": "^29.3.2", + "typescript": "^5.6.3" + }, + "dependencies": { + "@inquirer/prompts": "^6.0.1", + "commander": "^13.1.0", + "fflate": "^0.8.2", + "node-forge": "^1.3.1", + "zod": "^3.24.4" + }, + "resolutions": { + "@babel/helpers": "7.27.1", + "@babel/parser": "7.27.3" + } +} diff --git a/scripts/create-dev-version.js b/scripts/create-dev-version.js new file mode 100755 index 0000000..8de366a --- /dev/null +++ b/scripts/create-dev-version.js @@ -0,0 +1,33 @@ +#!/usr/bin/env node + +import fs from "fs"; + +try { + // Read current package.json + const packageJson = JSON.parse(fs.readFileSync("package.json", "utf8")); + + // Get current version and strip any existing prerelease + const baseVersion = packageJson.version.split("-")[0]; + + // Generate timestamp (YYYYMMDDHHMMSS) + const now = new Date(); + const timestamp = + now.getFullYear().toString() + + (now.getMonth() + 1).toString().padStart(2, "0") + + now.getDate().toString().padStart(2, "0") + + now.getHours().toString().padStart(2, "0") + + now.getMinutes().toString().padStart(2, "0") + + now.getSeconds().toString().padStart(2, "0"); + + // Create dev version + const devVersion = `${baseVersion}-dev.${timestamp}`; + + console.log(`Publishing ${devVersion}...`); + + // Update package.json version + packageJson.version = devVersion; + fs.writeFileSync("package.json", JSON.stringify(packageJson, null, 2) + "\n"); +} catch (error) { + console.error("Failed to publish:", error.message); + process.exit(1); +} diff --git a/src/browser.ts b/src/browser.ts new file mode 100644 index 0000000..c4fd89a --- /dev/null +++ b/src/browser.ts @@ -0,0 +1,4 @@ +// Browser-compatible exports +export * from "./schemas.js"; +export * from "./shared/config.js"; +export * from "./types.js"; diff --git a/src/cli.ts b/src/cli.ts new file mode 100644 index 0000000..45780f9 --- /dev/null +++ b/src/cli.ts @@ -0,0 +1,13 @@ +// CLI-specific exports +export * from "./cli/init.js"; +export * from "./cli/pack.js"; + +// Include all shared exports +export * from "./schemas.js"; +export * from "./shared/config.js"; +export * from "./types.js"; + +// Include node exports since CLI needs them +export * from "./node/files.js"; +export * from "./node/sign.js"; +export * from "./node/validate.js"; diff --git a/src/cli/cli.ts b/src/cli/cli.ts new file mode 100644 index 0000000..a1a01c1 --- /dev/null +++ b/src/cli/cli.ts @@ -0,0 +1,314 @@ +#!/usr/bin/env node + +import { execSync } from "child_process"; +import { Command } from "commander"; +import { existsSync, readFileSync, statSync } from "fs"; +import { basename, dirname, join, resolve } from "path"; +import { fileURLToPath } from "url"; + +import { signDxtFile, unsignDxtFile, verifyDxtFile } from "../node/sign.js"; +import { validateManifest } from "../node/validate.js"; +import { initExtension } from "./init.js"; +import { packExtension } from "./pack.js"; + +// ES modules equivalent of __dirname +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +// Get version from package.json +const packageJsonPath = join(__dirname, "..", "..", "package.json"); +const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8")); +const version = packageJson.version; + +/** + * Create a self-signed certificate for signing DXT extensions + */ +function createSelfSignedCertificate(certPath: string, keyPath: string): void { + const subject = "/CN=DXT Self-Signed Certificate/O=DXT Extensions/C=US"; + + try { + // Generate a self-signed certificate valid for 10 years, no password + execSync( + `openssl req -x509 -newkey rsa:4096 -keyout "${keyPath}" -out "${certPath}" -days 3650 -nodes -subj "${subject}"`, + { stdio: "pipe" }, + ); + } catch (error) { + throw new Error(`Failed to create self-signed certificate: ${error}`); + } +} + +// Create the CLI program +const program = new Command(); + +program + .name("dxt") + .description("Tools for building Desktop Extensions") + .version(version); + +// Init command +program + .command("init [directory]") + .description("Create a new DXT extension manifest") + .option("-y, --yes", "Accept all defaults (non-interactive mode)") + .action((directory?: string, options?: { yes?: boolean }) => { + void (async () => { + try { + const success = await initExtension(directory, options?.yes); + process.exit(success ? 0 : 1); + } catch (error) { + console.error( + `ERROR: ${error instanceof Error ? error.message : "Unknown error"}`, + ); + process.exit(1); + } + })(); + }); + +// Validate command +program + .command("validate ") + .description("Validate a DXT manifest file") + .action((manifestPath: string) => { + const success = validateManifest(manifestPath); + process.exit(success ? 0 : 1); + }); + +// Pack command +program + .command("pack [directory] [output]") + .description("Pack a directory into a DXT extension") + .action((directory: string = process.cwd(), output?: string) => { + void (async () => { + try { + const success = await packExtension({ + extensionPath: directory, + outputPath: output, + }); + process.exit(success ? 0 : 1); + } catch (error) { + console.error( + `ERROR: ${error instanceof Error ? error.message : "Unknown error"}`, + ); + process.exit(1); + } + })(); + }); + +// Sign command +program + .command("sign ") + .description("Sign a DXT extension file") + .option( + "-c, --cert ", + "Path to certificate file (PEM format)", + "cert.pem", + ) + .option( + "-k, --key ", + "Path to private key file (PEM format)", + "key.pem", + ) + .option( + "-i, --intermediate ", + "Paths to intermediate certificate files", + ) + .option("--self-signed", "Create a self-signed certificate if none exists") + .action( + ( + dxtFile: string, + options: { + cert: string; + key: string; + intermediate?: string[]; + selfSigned?: boolean; + }, + ) => { + void (async () => { + try { + const dxtPath = resolve(dxtFile); + + if (!existsSync(dxtPath)) { + console.error(`ERROR: DXT file not found: ${dxtFile}`); + process.exit(1); + } + + let certPath = options.cert; + let keyPath = options.key; + + // Create self-signed certificate if requested + if (options.selfSigned) { + const dxtDir = resolve(__dirname, ".."); + certPath = join(dxtDir, "self-signed-cert.pem"); + keyPath = join(dxtDir, "self-signed-key.pem"); + + if (!existsSync(certPath) || !existsSync(keyPath)) { + console.log("Creating self-signed certificate..."); + createSelfSignedCertificate(certPath, keyPath); + console.log("Self-signed certificate created"); + } else { + console.log("Using existing self-signed certificate"); + } + } else { + // Check for manual certificate paths + if (!existsSync(certPath)) { + console.error(`ERROR: Certificate file not found: ${certPath}`); + console.log( + "Tip: Use --self-signed to create a self-signed certificate", + ); + process.exit(1); + } + + if (!existsSync(keyPath)) { + console.error(`ERROR: Private key file not found: ${keyPath}`); + process.exit(1); + } + } + + console.log(`Signing ${basename(dxtPath)}...`); + signDxtFile(dxtPath, certPath, keyPath, options.intermediate); + console.log(`Successfully signed ${basename(dxtPath)}`); + + // Display certificate info + const signatureInfo = await verifyDxtFile(dxtPath); + if ( + signatureInfo.status === "signed" || + signatureInfo.status === "self-signed" + ) { + console.log(`Signed by: ${signatureInfo.publisher}`); + console.log(`Issuer: ${signatureInfo.issuer}`); + if (signatureInfo.status === "self-signed") { + console.log(`Warning: Certificate is self-signed`); + } + } + } catch (error) { + console.log( + `ERROR: Signing failed: ${error instanceof Error ? error.message : "Unknown error"}`, + ); + process.exit(1); + } + })(); + }, + ); + +// Verify command +program + .command("verify ") + .description("Verify the signature of a DXT extension file") + .action((dxtFile: string) => { + void (async () => { + try { + const dxtPath = resolve(dxtFile); + + if (!existsSync(dxtPath)) { + console.error(`ERROR: DXT file not found: ${dxtFile}`); + process.exit(1); + } + + console.log(`Verifying ${basename(dxtPath)}...`); + const result = await verifyDxtFile(dxtPath); + + if (result.status === "signed") { + console.log(`Signature is valid`); + console.log(`Signed by: ${result.publisher}`); + console.log(`Issuer: ${result.issuer}`); + console.log( + `Valid from: ${new Date(result.valid_from!).toLocaleDateString()} to ${new Date(result.valid_to!).toLocaleDateString()}`, + ); + console.log(`Fingerprint: ${result.fingerprint}`); + } else if (result.status === "self-signed") { + console.log(`Signature is valid (self-signed)`); + console.log(`WARNING: This extension is self-signed`); + console.log(`Signed by: ${result.publisher}`); + console.log( + `Valid from: ${new Date(result.valid_from!).toLocaleDateString()} to ${new Date(result.valid_to!).toLocaleDateString()}`, + ); + console.log(`Fingerprint: ${result.fingerprint}`); + } else { + console.error(`ERROR: Extension is not signed`); + process.exit(1); + } + } catch (error) { + console.log( + `ERROR: Verification failed: ${error instanceof Error ? error.message : "Unknown error"}`, + ); + process.exit(1); + } + })(); + }); + +// Info command +program + .command("info ") + .description("Display information about a DXT extension file") + .action((dxtFile: string) => { + void (async () => { + try { + const dxtPath = resolve(dxtFile); + + if (!existsSync(dxtPath)) { + console.error(`ERROR: DXT file not found: ${dxtFile}`); + process.exit(1); + } + + const stat = statSync(dxtPath); + console.log(`File: ${basename(dxtPath)}`); + console.log(`Size: ${(stat.size / 1024).toFixed(2)} KB`); + + // Check if signed + const signatureInfo = await verifyDxtFile(dxtPath); + if (signatureInfo.status === "signed") { + console.log(`\nSignature Information:`); + console.log(` Subject: ${signatureInfo.publisher}`); + console.log(` Issuer: ${signatureInfo.issuer}`); + console.log( + ` Valid from: ${new Date(signatureInfo.valid_from!).toLocaleDateString()} to ${new Date(signatureInfo.valid_to!).toLocaleDateString()}`, + ); + console.log(` Fingerprint: ${signatureInfo.fingerprint}`); + console.log(` Status: Valid`); + } else if (signatureInfo.status === "self-signed") { + console.log(`\nSignature Information:`); + console.log(` Subject: ${signatureInfo.publisher}`); + console.log(` Issuer: ${signatureInfo.issuer} (self-signed)`); + console.log( + ` Valid from: ${new Date(signatureInfo.valid_from!).toLocaleDateString()} to ${new Date(signatureInfo.valid_to!).toLocaleDateString()}`, + ); + console.log(` Fingerprint: ${signatureInfo.fingerprint}`); + console.log(` Status: Valid (self-signed)`); + } else { + console.log(`\nWARNING: Not signed`); + } + } catch (error) { + console.log( + `ERROR: Failed to read DXT info: ${error instanceof Error ? error.message : "Unknown error"}`, + ); + process.exit(1); + } + })(); + }); + +// Unsign command (for development/testing) +program + .command("unsign ") + .description("Remove signature from a DXT extension file") + .action((dxtFile: string) => { + try { + const dxtPath = resolve(dxtFile); + + if (!existsSync(dxtPath)) { + console.error(`ERROR: DXT file not found: ${dxtFile}`); + process.exit(1); + } + + console.log(`Removing signature from ${basename(dxtPath)}...`); + unsignDxtFile(dxtPath); + console.log(`Signature removed`); + } catch (error) { + console.log( + `ERROR: Failed to remove signature: ${error instanceof Error ? error.message : "Unknown error"}`, + ); + process.exit(1); + } + }); + +// Parse command line arguments +program.parse(); diff --git a/src/cli/init.ts b/src/cli/init.ts new file mode 100644 index 0000000..70c3c17 --- /dev/null +++ b/src/cli/init.ts @@ -0,0 +1,928 @@ +import { confirm, input, select } from "@inquirer/prompts"; +import { existsSync, readFileSync, writeFileSync } from "fs"; +import { basename, join, resolve } from "path"; + +import type { DxtManifest } from "../types.js"; + +interface PackageJson { + name?: string; + version?: string; + description?: string; + main?: string; + author?: string | { name?: string; email?: string; url?: string }; + repository?: string | { type?: string; url?: string }; + license?: string; +} + +export function readPackageJson(dirPath: string): PackageJson { + const packageJsonPath = join(dirPath, "package.json"); + if (existsSync(packageJsonPath)) { + try { + return JSON.parse(readFileSync(packageJsonPath, "utf-8")); + } catch (e) { + // Ignore package.json parsing errors + } + } + return {}; +} + +export function getDefaultAuthorName(packageData: PackageJson): string { + if (typeof packageData.author === "string") { + return packageData.author; + } + return packageData.author?.name || ""; +} + +export function getDefaultAuthorEmail(packageData: PackageJson): string { + if (typeof packageData.author === "object") { + return packageData.author?.email || ""; + } + return ""; +} + +export function getDefaultAuthorUrl(packageData: PackageJson): string { + if (typeof packageData.author === "object") { + return packageData.author?.url || ""; + } + return ""; +} + +export function getDefaultRepositoryUrl(packageData: PackageJson): string { + if (typeof packageData.repository === "string") { + return packageData.repository; + } + return packageData.repository?.url || ""; +} + +export function getDefaultBasicInfo( + packageData: PackageJson, + resolvedPath: string, +) { + const name = packageData.name || basename(resolvedPath); + const authorName = getDefaultAuthorName(packageData) || "Unknown Author"; + const displayName = name; + const version = packageData.version || "1.0.0"; + const description = packageData.description || "A DXT extension"; + + return { name, authorName, displayName, version, description }; +} + +export function getDefaultAuthorInfo(packageData: PackageJson) { + return { + authorEmail: getDefaultAuthorEmail(packageData), + authorUrl: getDefaultAuthorUrl(packageData), + }; +} + +export function getDefaultServerConfig(packageData?: PackageJson) { + const serverType = "node" as const; + const entryPoint = getDefaultEntryPoint(serverType, packageData); + const mcp_config = createMcpConfig(serverType, entryPoint); + + return { serverType, entryPoint, mcp_config }; +} + +export function getDefaultOptionalFields(packageData: PackageJson) { + return { + keywords: "", + license: packageData.license || "MIT", + repository: undefined, + }; +} + +export function createMcpConfig( + serverType: "node" | "python" | "binary", + entryPoint: string, +): { + command: string; + args: string[]; + env?: Record; +} { + switch (serverType) { + case "node": + return { + command: "node", + args: ["${__dirname}/" + entryPoint], + env: {}, + }; + case "python": + return { + command: "python", + args: ["${__dirname}/" + entryPoint], + env: { + PYTHONPATH: "server/lib", + }, + }; + case "binary": + return { + command: "${__dirname}/" + entryPoint, + args: [], + env: {}, + }; + } +} + +export function getDefaultEntryPoint( + serverType: "node" | "python" | "binary", + packageData?: PackageJson, +): string { + switch (serverType) { + case "node": + return packageData?.main || "server/index.js"; + case "python": + return "server/main.py"; + case "binary": + return "server/my-server"; + } +} + +export async function promptBasicInfo( + packageData: PackageJson, + resolvedPath: string, +) { + const defaultName = packageData.name || basename(resolvedPath); + + const name = await input({ + message: "Extension name:", + default: defaultName, + validate: (value) => value.trim().length > 0 || "Name is required", + }); + + const authorName = await input({ + message: "Author name:", + default: getDefaultAuthorName(packageData), + validate: (value) => value.trim().length > 0 || "Author name is required", + }); + + const displayName = await input({ + message: "Display name (optional):", + default: name, + }); + + const version = await input({ + message: "Version:", + default: packageData.version || "1.0.0", + validate: (value) => { + if (!value.trim()) return "Version is required"; + if (!/^\d+\.\d+\.\d+/.test(value)) { + return "Version must follow semantic versioning (e.g., 1.0.0)"; + } + return true; + }, + }); + + const description = await input({ + message: "Description:", + default: packageData.description || "", + validate: (value) => value.trim().length > 0 || "Description is required", + }); + + return { name, authorName, displayName, version, description }; +} + +export async function promptAuthorInfo(packageData: PackageJson) { + const authorEmail = await input({ + message: "Author email (optional):", + default: getDefaultAuthorEmail(packageData), + }); + + const authorUrl = await input({ + message: "Author URL (optional):", + default: getDefaultAuthorUrl(packageData), + }); + + return { authorEmail, authorUrl }; +} + +export async function promptServerConfig(packageData?: PackageJson) { + const serverType = (await select({ + message: "Server type:", + choices: [ + { name: "Node.js", value: "node" }, + { name: "Python", value: "python" }, + { name: "Binary", value: "binary" }, + ], + default: "node", + })) as "node" | "python" | "binary"; + + const entryPoint = await input({ + message: "Entry point:", + default: getDefaultEntryPoint(serverType, packageData), + }); + + const mcp_config = createMcpConfig(serverType, entryPoint); + + return { serverType, entryPoint, mcp_config }; +} + +export async function promptTools() { + const addTools = await confirm({ + message: + "Does your MCP Server provide tools you want to advertise (optional)?", + default: true, + }); + + const tools: Array<{ name: string; description?: string }> = []; + let toolsGenerated = false; + + if (addTools) { + let addMore = true; + while (addMore) { + const toolName = await input({ + message: "Tool name:", + validate: (value) => value.trim().length > 0 || "Tool name is required", + }); + const toolDescription = await input({ + message: "Tool description (optional):", + }); + + tools.push({ + name: toolName, + ...(toolDescription ? { description: toolDescription } : {}), + }); + + addMore = await confirm({ + message: "Add another tool?", + default: false, + }); + } + + // Ask about generated tools + toolsGenerated = await confirm({ + message: "Does your server generate additional tools at runtime?", + default: false, + }); + } + + return { tools, toolsGenerated }; +} + +export async function promptPrompts() { + const addPrompts = await confirm({ + message: + "Does your MCP Server provide prompts you want to advertise (optional)?", + default: false, + }); + + const prompts: Array<{ + name: string; + description?: string; + arguments?: string[]; + text: string; + }> = []; + let promptsGenerated = false; + + if (addPrompts) { + let addMore = true; + while (addMore) { + const promptName = await input({ + message: "Prompt name:", + validate: (value) => + value.trim().length > 0 || "Prompt name is required", + }); + const promptDescription = await input({ + message: "Prompt description (optional):", + }); + + // Ask about arguments + const hasArguments = await confirm({ + message: "Does this prompt have arguments?", + default: false, + }); + + const argumentNames: string[] = []; + if (hasArguments) { + let addMoreArgs = true; + while (addMoreArgs) { + const argName = await input({ + message: "Argument name:", + validate: (value) => { + if (!value.trim()) return "Argument name is required"; + if (argumentNames.includes(value)) { + return "Argument names must be unique"; + } + return true; + }, + }); + argumentNames.push(argName); + + addMoreArgs = await confirm({ + message: "Add another argument?", + default: false, + }); + } + } + + // Prompt for the text template + const promptText = await input({ + message: hasArguments + ? `Prompt text (use \${arguments.name} for arguments: ${argumentNames.join(", ")}):` + : "Prompt text:", + validate: (value) => + value.trim().length > 0 || "Prompt text is required", + }); + + prompts.push({ + name: promptName, + ...(promptDescription ? { description: promptDescription } : {}), + ...(argumentNames.length > 0 ? { arguments: argumentNames } : {}), + text: promptText, + }); + + addMore = await confirm({ + message: "Add another prompt?", + default: false, + }); + } + + // Ask about generated prompts + promptsGenerated = await confirm({ + message: "Does your server generate additional prompts at runtime?", + default: false, + }); + } + + return { prompts, promptsGenerated }; +} + +export async function promptOptionalFields(packageData: PackageJson) { + const keywords = await input({ + message: "Keywords (comma-separated, optional):", + default: "", + }); + + const license = await input({ + message: "License:", + default: packageData.license || "MIT", + }); + + const addRepository = await confirm({ + message: "Add repository information?", + default: !!packageData.repository, + }); + + let repository: { type: string; url: string } | undefined; + if (addRepository) { + const repoUrl = await input({ + message: "Repository URL:", + default: getDefaultRepositoryUrl(packageData), + }); + if (repoUrl) { + repository = { + type: "git", + url: repoUrl, + }; + } + } + + return { keywords, license, repository }; +} + +export async function promptLongDescription(description: string) { + const hasLongDescription = await confirm({ + message: "Add a detailed long description?", + default: false, + }); + + if (hasLongDescription) { + const longDescription = await input({ + message: "Long description (supports basic markdown):", + default: description, + }); + return longDescription; + } + + return undefined; +} + +export async function promptUrls() { + const homepage = await input({ + message: "Homepage URL (optional):", + validate: (value) => { + if (!value.trim()) return true; + try { + new URL(value); + return true; + } catch { + return "Must be a valid URL (e.g., https://example.com)"; + } + }, + }); + + const documentation = await input({ + message: "Documentation URL (optional):", + validate: (value) => { + if (!value.trim()) return true; + try { + new URL(value); + return true; + } catch { + return "Must be a valid URL"; + } + }, + }); + + const support = await input({ + message: "Support URL (optional):", + validate: (value) => { + if (!value.trim()) return true; + try { + new URL(value); + return true; + } catch { + return "Must be a valid URL"; + } + }, + }); + + return { homepage, documentation, support }; +} + +export async function promptVisualAssets() { + const icon = await input({ + message: "Icon file path (optional, relative to manifest):", + validate: (value) => { + if (!value.trim()) return true; + if (value.includes("..")) return "Relative paths cannot include '..'"; + return true; + }, + }); + + const addScreenshots = await confirm({ + message: "Add screenshots?", + default: false, + }); + + const screenshots: string[] = []; + if (addScreenshots) { + let addMore = true; + while (addMore) { + const screenshot = await input({ + message: "Screenshot file path (relative to manifest):", + validate: (value) => { + if (!value.trim()) return "Screenshot path is required"; + if (value.includes("..")) return "Relative paths cannot include '..'"; + return true; + }, + }); + screenshots.push(screenshot); + + addMore = await confirm({ + message: "Add another screenshot?", + default: false, + }); + } + } + + return { icon, screenshots }; +} + +export async function promptCompatibility( + serverType: "node" | "python" | "binary", +) { + const addCompatibility = await confirm({ + message: "Add compatibility constraints?", + default: false, + }); + + if (!addCompatibility) { + return undefined; + } + + const addPlatforms = await confirm({ + message: "Specify supported platforms?", + default: false, + }); + + let platforms: ("darwin" | "win32" | "linux")[] | undefined; + if (addPlatforms) { + const selectedPlatforms: ("darwin" | "win32" | "linux")[] = []; + + const supportsDarwin = await confirm({ + message: "Support macOS (darwin)?", + default: true, + }); + if (supportsDarwin) selectedPlatforms.push("darwin"); + + const supportsWin32 = await confirm({ + message: "Support Windows (win32)?", + default: true, + }); + if (supportsWin32) selectedPlatforms.push("win32"); + + const supportsLinux = await confirm({ + message: "Support Linux?", + default: true, + }); + if (supportsLinux) selectedPlatforms.push("linux"); + + platforms = selectedPlatforms.length > 0 ? selectedPlatforms : undefined; + } + + let runtimes: { python?: string; node?: string } | undefined; + if (serverType !== "binary") { + const addRuntimes = await confirm({ + message: "Specify runtime version constraints?", + default: false, + }); + + if (addRuntimes) { + if (serverType === "python") { + const pythonVersion = await input({ + message: "Python version constraint (e.g., >=3.8,<4.0):", + validate: (value) => + value.trim().length > 0 || "Python version constraint is required", + }); + runtimes = { python: pythonVersion }; + } else if (serverType === "node") { + const nodeVersion = await input({ + message: "Node.js version constraint (e.g., >=16.0.0):", + validate: (value) => + value.trim().length > 0 || "Node.js version constraint is required", + }); + runtimes = { node: nodeVersion }; + } + } + } + + return { + ...(platforms ? { platforms } : {}), + ...(runtimes ? { runtimes } : {}), + }; +} + +export async function promptUserConfig() { + const addUserConfig = await confirm({ + message: "Add user-configurable options?", + default: false, + }); + + if (!addUserConfig) { + return {}; + } + + const userConfig: Record< + string, + { + type: "string" | "number" | "boolean" | "directory" | "file"; + title: string; + description: string; + required?: boolean; + default?: string | number | boolean | string[]; + multiple?: boolean; + sensitive?: boolean; + min?: number; + max?: number; + } + > = {}; + + let addMore = true; + while (addMore) { + const optionKey = await input({ + message: "Configuration option key (unique identifier):", + validate: (value) => { + if (!value.trim()) return "Key is required"; + if (userConfig[value]) return "Key must be unique"; + return true; + }, + }); + + const optionType = (await select({ + message: "Option type:", + choices: [ + { name: "String", value: "string" }, + { name: "Number", value: "number" }, + { name: "Boolean", value: "boolean" }, + { name: "Directory", value: "directory" }, + { name: "File", value: "file" }, + ], + })) as "string" | "number" | "boolean" | "directory" | "file"; + + const optionTitle = await input({ + message: "Option title (human-readable name):", + validate: (value) => value.trim().length > 0 || "Title is required", + }); + + const optionDescription = await input({ + message: "Option description:", + validate: (value) => value.trim().length > 0 || "Description is required", + }); + + const optionRequired = await confirm({ + message: "Is this option required?", + default: false, + }); + + const optionSensitive = await confirm({ + message: "Is this option sensitive (like a password)?", + default: false, + }); + + // Build the option object + const option: { + type: "string" | "number" | "boolean" | "directory" | "file"; + title: string; + description: string; + required: boolean; + sensitive: boolean; + default?: string | number | boolean | string[]; + min?: number; + max?: number; + } = { + type: optionType, + title: optionTitle, + description: optionDescription, + required: optionRequired, + sensitive: optionSensitive, + }; + + // Add default value if not required + if (!optionRequired) { + let defaultValue: string | number | boolean | string[] | undefined; + if (optionType === "boolean") { + defaultValue = await confirm({ + message: "Default value:", + default: false, + }); + } else if (optionType === "number") { + const defaultStr = await input({ + message: "Default value (number):", + validate: (value) => { + if (!value.trim()) return true; + return !isNaN(Number(value)) || "Must be a valid number"; + }, + }); + defaultValue = defaultStr ? Number(defaultStr) : undefined; + } else { + defaultValue = await input({ + message: "Default value (optional):", + }); + } + if (defaultValue !== undefined && defaultValue !== "") { + option.default = defaultValue; + } + } + + // Add constraints for number types + if (optionType === "number") { + const addConstraints = await confirm({ + message: "Add min/max constraints?", + default: false, + }); + if (addConstraints) { + const min = await input({ + message: "Minimum value (optional):", + validate: (value) => { + if (!value.trim()) return true; + return !isNaN(Number(value)) || "Must be a valid number"; + }, + }); + const max = await input({ + message: "Maximum value (optional):", + validate: (value) => { + if (!value.trim()) return true; + return !isNaN(Number(value)) || "Must be a valid number"; + }, + }); + if (min) option.min = Number(min); + if (max) option.max = Number(max); + } + } + + userConfig[optionKey] = option; + + addMore = await confirm({ + message: "Add another configuration option?", + default: false, + }); + } + + return userConfig; +} + +export function buildManifest( + basicInfo: { + name: string; + displayName: string; + version: string; + description: string; + authorName: string; + }, + longDescription: string | undefined, + authorInfo: { + authorEmail: string; + authorUrl: string; + }, + urls: { + homepage: string; + documentation: string; + support: string; + }, + visualAssets: { + icon: string; + screenshots: string[]; + }, + serverConfig: { + serverType: "node" | "python" | "binary"; + entryPoint: string; + mcp_config: { + command: string; + args: string[]; + env?: Record; + }; + }, + tools: Array<{ name: string; description?: string }>, + toolsGenerated: boolean, + prompts: Array<{ + name: string; + description?: string; + arguments?: string[]; + text: string; + }>, + promptsGenerated: boolean, + compatibility: + | { + claude_desktop?: string; + platforms?: ("darwin" | "win32" | "linux")[]; + runtimes?: { python?: string; node?: string }; + } + | undefined, + userConfig: Record< + string, + { + type: "string" | "number" | "boolean" | "directory" | "file"; + title: string; + description: string; + required?: boolean; + default?: string | number | boolean | string[]; + multiple?: boolean; + sensitive?: boolean; + min?: number; + max?: number; + } + >, + optionalFields: { + keywords: string; + license: string; + repository?: { type: string; url: string }; + }, +): DxtManifest { + const { name, displayName, version, description, authorName } = basicInfo; + const { authorEmail, authorUrl } = authorInfo; + const { serverType, entryPoint, mcp_config } = serverConfig; + const { keywords, license, repository } = optionalFields; + + return { + dxt_version: "0.1", + name, + ...(displayName && displayName !== name + ? { display_name: displayName } + : {}), + version, + description, + ...(longDescription ? { long_description: longDescription } : {}), + author: { + name: authorName, + ...(authorEmail ? { email: authorEmail } : {}), + ...(authorUrl ? { url: authorUrl } : {}), + }, + ...(urls.homepage ? { homepage: urls.homepage } : {}), + ...(urls.documentation ? { documentation: urls.documentation } : {}), + ...(urls.support ? { support: urls.support } : {}), + ...(visualAssets.icon ? { icon: visualAssets.icon } : {}), + ...(visualAssets.screenshots.length > 0 + ? { screenshots: visualAssets.screenshots } + : {}), + server: { + type: serverType, + entry_point: entryPoint, + mcp_config, + }, + ...(tools.length > 0 ? { tools } : {}), + ...(toolsGenerated ? { tools_generated: true } : {}), + ...(prompts.length > 0 ? { prompts } : {}), + ...(promptsGenerated ? { prompts_generated: true } : {}), + ...(compatibility ? { compatibility } : {}), + ...(Object.keys(userConfig).length > 0 ? { user_config: userConfig } : {}), + ...(keywords + ? { + keywords: keywords + .split(",") + .map((k) => k.trim()) + .filter((k) => k), + } + : {}), + ...(license ? { license } : {}), + ...(repository ? { repository } : {}), + }; +} + +export function printNextSteps() { + console.log("\nNext steps:"); + console.log( + `1. Ensure all your production dependencies are in this directory`, + ); + console.log(`2. Run 'dxt pack' to create your .dxt file`); +} + +export async function initExtension( + targetPath: string = process.cwd(), + nonInteractive = false, +): Promise { + const resolvedPath = resolve(targetPath); + const manifestPath = join(resolvedPath, "manifest.json"); + + if (existsSync(manifestPath)) { + if (nonInteractive) { + console.log( + "manifest.json already exists. Use --force to overwrite in non-interactive mode.", + ); + return false; + } + const overwrite = await confirm({ + message: "manifest.json already exists. Overwrite?", + default: false, + }); + if (!overwrite) { + console.log("Cancelled"); + return false; + } + } + + if (!nonInteractive) { + console.log( + "This utility will help you create a manifest.json file for your DXT extension.", + ); + console.log("Press ^C at any time to quit.\n"); + } else { + console.log("Creating manifest.json with default values..."); + } + + try { + const packageData = readPackageJson(resolvedPath); + + // Prompt for all information or use defaults + const basicInfo = nonInteractive + ? getDefaultBasicInfo(packageData, resolvedPath) + : await promptBasicInfo(packageData, resolvedPath); + const longDescription = nonInteractive + ? undefined + : await promptLongDescription(basicInfo.description); + const authorInfo = nonInteractive + ? getDefaultAuthorInfo(packageData) + : await promptAuthorInfo(packageData); + const urls = nonInteractive + ? { homepage: "", documentation: "", support: "" } + : await promptUrls(); + const visualAssets = nonInteractive + ? { icon: "", screenshots: [] } + : await promptVisualAssets(); + const serverConfig = nonInteractive + ? getDefaultServerConfig(packageData) + : await promptServerConfig(packageData); + const toolsData = nonInteractive + ? { tools: [], toolsGenerated: false } + : await promptTools(); + const promptsData = nonInteractive + ? { prompts: [], promptsGenerated: false } + : await promptPrompts(); + const compatibility = nonInteractive + ? undefined + : await promptCompatibility(serverConfig.serverType); + const userConfig = nonInteractive ? {} : await promptUserConfig(); + const optionalFields = nonInteractive + ? getDefaultOptionalFields(packageData) + : await promptOptionalFields(packageData); + + // Build manifest + const manifest = buildManifest( + basicInfo, + longDescription, + authorInfo, + urls, + visualAssets, + serverConfig, + toolsData.tools, + toolsData.toolsGenerated, + promptsData.prompts, + promptsData.promptsGenerated, + compatibility, + userConfig, + optionalFields, + ); + + // Write manifest + writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + "\n"); + console.log(`\nCreated manifest.json at ${manifestPath}`); + + printNextSteps(); + + return true; + } catch (error) { + if (error instanceof Error && error.message.includes("User force closed")) { + console.log("\nCancelled"); + return false; + } + throw error; + } +} diff --git a/src/cli/pack.ts b/src/cli/pack.ts new file mode 100644 index 0000000..75396fc --- /dev/null +++ b/src/cli/pack.ts @@ -0,0 +1,222 @@ +import { confirm } from "@inquirer/prompts"; +import { createHash } from "crypto"; +import { zipSync } from "fflate"; +import { + existsSync, + mkdirSync, + readFileSync, + statSync, + writeFileSync, +} from "fs"; +import { basename, join, relative, resolve, sep } from "path"; + +import { getAllFilesWithCount, readDxtIgnorePatterns } from "../node/files.js"; +import { validateManifest } from "../node/validate.js"; +import { DxtManifestSchema } from "../schemas.js"; +import { getLogger } from "../shared/log.js"; +import { initExtension } from "./init.js"; + +interface PackOptions { + extensionPath: string; + outputPath?: string; + silent?: boolean; +} + +function formatFileSize(bytes: number): string { + if (bytes < 1024) { + return `${bytes}B`; + } else if (bytes < 1024 * 1024) { + return `${(bytes / 1024).toFixed(1)}kB`; + } else { + return `${(bytes / (1024 * 1024)).toFixed(1)}MB`; + } +} + +function sanitizeNameForFilename(name: string): string { + // Replace spaces with hyphens + // Remove or replace characters that are problematic in filenames + return name + .toLowerCase() + .replace(/\s+/g, "-") // Replace spaces with hyphens + .replace(/[^a-z0-9-_.]/g, "") // Keep only alphanumeric, hyphens, underscores, and dots + .replace(/-+/g, "-") // Replace multiple hyphens with single hyphen + .replace(/^-+|-+$/g, "") // Remove leading/trailing hyphens + .substring(0, 100); // Limit length to 100 characters +} + +export async function packExtension({ + extensionPath, + outputPath, + silent, +}: PackOptions): Promise { + const resolvedPath = resolve(extensionPath); + const logger = getLogger({ silent }); + + // Check if directory exists + if (!existsSync(resolvedPath) || !statSync(resolvedPath).isDirectory()) { + logger.error(`ERROR: Directory not found: ${extensionPath}`); + return false; + } + + // Check if manifest exists + const manifestPath = join(resolvedPath, "manifest.json"); + if (!existsSync(manifestPath)) { + logger.log(`No manifest.json found in ${extensionPath}`); + const shouldInit = await confirm({ + message: "Would you like to create a manifest.json file?", + default: true, + }); + + if (shouldInit) { + const success = await initExtension(extensionPath); + if (!success) { + logger.error("ERROR: Failed to create manifest"); + return false; + } + } else { + logger.error("ERROR: Cannot pack extension without manifest.json"); + return false; + } + } + + // Validate manifest first + logger.log("Validating manifest..."); + if (!validateManifest(manifestPath)) { + logger.error("ERROR: Cannot pack extension with invalid manifest"); + return false; + } + + // Read and parse manifest + let manifest; + try { + const manifestContent = readFileSync(manifestPath, "utf-8"); + const manifestData = JSON.parse(manifestContent); + manifest = DxtManifestSchema.parse(manifestData); + } catch (error) { + logger.error("ERROR: Failed to parse manifest.json"); + if (error instanceof Error) { + logger.error(` ${error.message}`); + } + return false; + } + + // Determine output path + const extensionName = basename(resolvedPath); + const finalOutputPath = outputPath + ? resolve(outputPath) + : resolve(`${extensionName}.dxt`); + + // Ensure output directory exists + const outputDir = join(finalOutputPath, ".."); + mkdirSync(outputDir, { recursive: true }); + + try { + // Read .dxtignore patterns if present + const dxtIgnorePatterns = readDxtIgnorePatterns(resolvedPath); + + // Get all files in the extension directory + const { files, ignoredCount } = getAllFilesWithCount( + resolvedPath, + resolvedPath, + {}, + dxtIgnorePatterns, + ); + + // Print package header + logger.log(`\n📦 ${manifest.name}@${manifest.version}`); + + // Print file list + logger.log("Archive Contents"); + const fileEntries = Object.entries(files); + let totalUnpackedSize = 0; + + // Sort files for consistent output + fileEntries.sort(([a], [b]) => a.localeCompare(b)); + + // Group files by directory for deep nesting + const directoryGroups = new Map< + string, + { files: string[]; totalSize: number } + >(); + const shallowFiles: Array<{ path: string; size: number }> = []; + + for (const [filePath, content] of fileEntries) { + const relPath = relative(resolvedPath, filePath); + const size = + typeof content === "string" + ? Buffer.byteLength(content, "utf8") + : content.length; + totalUnpackedSize += size; + + // Check if file is deeply nested (3+ levels) + const parts = relPath.split(sep); + if (parts.length > 3) { + // Group by the first 3 directory levels + const groupKey = parts.slice(0, 3).join("/"); + if (!directoryGroups.has(groupKey)) { + directoryGroups.set(groupKey, { files: [], totalSize: 0 }); + } + const group = directoryGroups.get(groupKey)!; + group.files.push(relPath); + group.totalSize += size; + } else { + shallowFiles.push({ path: relPath, size }); + } + } + + // Print shallow files first + for (const { path, size } of shallowFiles) { + logger.log(`${formatFileSize(size).padStart(8)} ${path}`); + } + + // Print grouped directories + for (const [dir, { files, totalSize }] of directoryGroups) { + if (files.length === 1) { + // If only one file in the group, print it normally + const filePath = files[0]; + const fileSize = totalSize; + logger.log(`${formatFileSize(fileSize).padStart(8)} ${filePath}`); + } else { + // Print directory summary + logger.log( + `${formatFileSize(totalSize).padStart(8)} ${dir}/ [and ${files.length} more files]`, + ); + } + } + + // Create zip + const zipData = zipSync(files, { + level: 9, // Maximum compression + mtime: new Date(), + }); + + // Write zip file + writeFileSync(finalOutputPath, zipData); + + // Calculate SHA sum + const shasum = createHash("sha1").update(zipData).digest("hex"); + + // Print archive details + const sanitizedName = sanitizeNameForFilename(manifest.name); + const archiveName = `${sanitizedName}-${manifest.version}.dxt`; + logger.log("\nArchive Details"); + logger.log(`name: ${manifest.name}`); + logger.log(`version: ${manifest.version}`); + logger.log(`filename: ${archiveName}`); + logger.log(`package size: ${formatFileSize(zipData.length)}`); + logger.log(`unpacked size: ${formatFileSize(totalUnpackedSize)}`); + logger.log(`shasum: ${shasum}`); + logger.log(`total files: ${fileEntries.length}`); + logger.log(`ignored (.dxtignore) files: ${ignoredCount}`); + + logger.log(`\nOutput: ${finalOutputPath}`); + return true; + } catch (error) { + if (error instanceof Error) { + logger.error(`ERROR: Archive error: ${error.message}`); + } else { + logger.error("ERROR: Unknown archive error occurred"); + } + return false; + } +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..0e01556 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,9 @@ +// Default export includes everything (backward compatibility) +export * from "./cli/init.js"; +export * from "./cli/pack.js"; +export * from "./node/files.js"; +export * from "./node/sign.js"; +export * from "./node/validate.js"; +export * from "./schemas.js"; +export * from "./shared/config.js"; +export * from "./types.js"; diff --git a/src/node.ts b/src/node.ts new file mode 100644 index 0000000..3af29fb --- /dev/null +++ b/src/node.ts @@ -0,0 +1,9 @@ +// Node.js-specific exports +export * from "./node/files.js"; +export * from "./node/sign.js"; +export * from "./node/validate.js"; + +// Include all shared exports +export * from "./schemas.js"; +export * from "./shared/config.js"; +export * from "./types.js"; diff --git a/src/node/files.ts b/src/node/files.ts new file mode 100644 index 0000000..cf17e1f --- /dev/null +++ b/src/node/files.ts @@ -0,0 +1,191 @@ +import { existsSync, readdirSync, readFileSync, statSync } from "fs"; +import { basename, join, relative, sep } from "path"; + +// Files/patterns to exclude from the package +export const EXCLUDE_PATTERNS = [ + ".DS_Store", + "Thumbs.db", + ".gitignore", + ".git", + ".dxtignore", + "*.log", + ".npm", + ".npmrc", + ".yarnrc", + ".yarn", + ".eslintrc", + ".editorconfig", + ".prettierrc", + ".prettierignore", + ".eslintignore", + ".nycrc", + ".babelrc", + ".pnp.*", + "node_modules/.cache", + "node_modules/.bin", + "*.map", + ".env.local", + ".env.*.local", + "npm-debug.log*", + "yarn-debug.log*", + "yarn-error.log*", + "package-lock.json", + "yarn.lock", + "*.dxt", + "*.d.ts", + "*.tsbuildinfo", + "tsconfig.json", +]; + +/** + * Read and parse .dxtignore file patterns + */ +export function readDxtIgnorePatterns(baseDir: string): string[] { + const dxtIgnorePath = join(baseDir, ".dxtignore"); + if (!existsSync(dxtIgnorePath)) { + return []; + } + + try { + const content = readFileSync(dxtIgnorePath, "utf-8"); + return content + .split(/\r?\n/) + .map((line) => line.trim()) + .filter((line) => line.length > 0 && !line.startsWith("#")); + } catch (error) { + console.warn( + `Warning: Could not read .dxtignore file: ${error instanceof Error ? error.message : "Unknown error"}`, + ); + return []; + } +} + +export function shouldExclude( + filePath: string, + additionalPatterns: string[] = [], +): boolean { + const fileName = basename(filePath); + const allPatterns = [...EXCLUDE_PATTERNS, ...additionalPatterns]; + + for (const pattern of allPatterns) { + if (pattern.includes("*")) { + // Enhanced glob matching to handle directory paths like "temp/*" + let patternToMatch = pattern; + + // Handle patterns like "dir/" by converting to "dir/**" + if (pattern.endsWith("/")) { + patternToMatch = pattern + "**"; + } + + // Convert glob pattern to regex, with case sensitivity + const regexPattern = + "^" + + patternToMatch + .replace(/\./g, "\\.") // Escape dots + .replace(/\*\*/g, ".*") // ** matches anything including / + .replace(/\*/g, "[^/]*") + // * matches anything except / + "$"; + + const regex = new RegExp(regexPattern); + + // Test full path + if (regex.test(filePath)) return true; + + // Test filename + if (regex.test(fileName)) return true; + + // Check if any part of the path matches for patterns like "node_modules" + const pathParts = filePath.split(sep); + for (const part of pathParts) { + if (regex.test(part)) return true; + } + } else { + // Exact match + if (fileName === pattern) return true; + + // Check if any part of the path matches + if (filePath.includes(pattern)) return true; + + // Handle directory patterns like "tests/" + if (pattern.endsWith("/") && filePath.startsWith(pattern)) { + return true; + } + } + } + + return false; +} + +export function getAllFiles( + dirPath: string, + baseDir: string = dirPath, + fileList: Record = {}, + additionalPatterns: string[] = [], +): Record { + const files = readdirSync(dirPath); + + for (const file of files) { + const filePath = join(dirPath, file); + const relativePath = relative(baseDir, filePath); + + if (shouldExclude(relativePath, additionalPatterns)) { + continue; + } + + const stat = statSync(filePath); + + if (stat.isDirectory()) { + getAllFiles(filePath, baseDir, fileList, additionalPatterns); + } else { + // Use forward slashes in zip file paths + const zipPath = relativePath.split(sep).join("/"); + fileList[zipPath] = readFileSync(filePath); + } + } + + return fileList; +} + +export interface GetAllFilesResult { + files: Record; + ignoredCount: number; +} + +export function getAllFilesWithCount( + dirPath: string, + baseDir: string = dirPath, + fileList: Record = {}, + additionalPatterns: string[] = [], + ignoredCount = 0, +): GetAllFilesResult { + const files = readdirSync(dirPath); + + for (const file of files) { + const filePath = join(dirPath, file); + const relativePath = relative(baseDir, filePath); + + if (shouldExclude(relativePath, additionalPatterns)) { + ignoredCount++; + continue; + } + + const stat = statSync(filePath); + + if (stat.isDirectory()) { + const result = getAllFilesWithCount( + filePath, + baseDir, + fileList, + additionalPatterns, + ignoredCount, + ); + ignoredCount = result.ignoredCount; + } else { + // Use forward slashes in zip file paths + const zipPath = relativePath.split(sep).join("/"); + fileList[zipPath] = readFileSync(filePath); + } + } + + return { files: fileList, ignoredCount }; +} diff --git a/src/node/sign.ts b/src/node/sign.ts new file mode 100644 index 0000000..48b311d --- /dev/null +++ b/src/node/sign.ts @@ -0,0 +1,409 @@ +import { execFile } from "child_process"; +import { readFileSync, writeFileSync } from "fs"; +import { mkdtemp, rm, writeFile } from "fs/promises"; +import forge from "node-forge"; +import { tmpdir } from "os"; +import { join } from "path"; +import { promisify } from "util"; + +import type { DxtSignatureInfo } from "../types.js"; + +// Signature block markers +const SIGNATURE_HEADER = "DXT_SIG_V1"; +const SIGNATURE_FOOTER = "DXT_SIG_END"; + +const execFileAsync = promisify(execFile); + +/** + * Signs a DXT file with the given certificate and private key using PKCS#7 + * + * @param dxtPath Path to the DXT file to sign + * @param certPath Path to the certificate file (PEM format) + * @param keyPath Path to the private key file (PEM format) + * @param intermediates Optional array of intermediate certificate paths + */ +export function signDxtFile( + dxtPath: string, + certPath: string, + keyPath: string, + intermediates?: string[], +): void { + // Read the original DXT file + const dxtContent = readFileSync(dxtPath); + + // Read certificate and key + const certificatePem = readFileSync(certPath, "utf-8"); + const privateKeyPem = readFileSync(keyPath, "utf-8"); + + // Read intermediate certificates if provided + const intermediatePems = intermediates?.map((path) => + readFileSync(path, "utf-8"), + ); + + // Create PKCS#7 signed data + const p7 = forge.pkcs7.createSignedData(); + p7.content = forge.util.createBuffer(dxtContent); + + // Parse and add certificates + const signingCert = forge.pki.certificateFromPem(certificatePem); + const privateKey = forge.pki.privateKeyFromPem(privateKeyPem); + + p7.addCertificate(signingCert); + + // Add intermediate certificates + if (intermediatePems) { + for (const pem of intermediatePems) { + p7.addCertificate(forge.pki.certificateFromPem(pem)); + } + } + + // Add signer + p7.addSigner({ + key: privateKey, + certificate: signingCert, + digestAlgorithm: forge.pki.oids.sha256, + authenticatedAttributes: [ + { + type: forge.pki.oids.contentType, + value: forge.pki.oids.data, + }, + { + type: forge.pki.oids.messageDigest, + // Value will be auto-populated + }, + { + type: forge.pki.oids.signingTime, + // Value will be auto-populated with current time + }, + ], + }); + + // Sign with detached signature + p7.sign({ detached: true }); + + // Convert to DER format + const asn1 = forge.asn1.toDer(p7.toAsn1()); + const pkcs7Signature = Buffer.from(asn1.getBytes(), "binary"); + + // Create signature block with PKCS#7 data + const signatureBlock = createSignatureBlock(pkcs7Signature); + + // Append signature block to DXT file + const signedContent = Buffer.concat([dxtContent, signatureBlock]); + writeFileSync(dxtPath, signedContent); +} + +/** + * Verifies a signed DXT file using OS certificate store + * + * @param dxtPath Path to the signed DXT file + * @returns Signature information including verification status + */ +export async function verifyDxtFile( + dxtPath: string, +): Promise { + try { + const fileContent = readFileSync(dxtPath); + + // Find and extract signature block + const { originalContent, pkcs7Signature } = + extractSignatureBlock(fileContent); + if (!pkcs7Signature) { + return { status: "unsigned" }; + } + + // Parse PKCS#7 signature + const asn1 = forge.asn1.fromDer(pkcs7Signature.toString("binary")); + const p7Message = forge.pkcs7.messageFromAsn1(asn1); + + // Verify it's signed data and cast to correct type + if ( + !("type" in p7Message) || + p7Message.type !== forge.pki.oids.signedData + ) { + return { status: "unsigned" }; + } + + // Now we know it's PkcsSignedData. The types are incorrect, so we'll + // fix them there + const p7 = p7Message as unknown as forge.pkcs7.PkcsSignedData & { + signerInfos: Array<{ + authenticatedAttributes: Array<{ + type: string; + value: unknown; + }>; + }>; + verify: (options?: { authenticatedAttributes?: boolean }) => boolean; + }; + + // Extract certificates from PKCS#7 + const certificates = p7.certificates || []; + if (certificates.length === 0) { + return { status: "unsigned" }; + } + + // Get the signing certificate (first one) + const signingCert = certificates[0]; + + // Verify PKCS#7 signature + const contentBuf = forge.util.createBuffer(originalContent); + + try { + p7.verify({ authenticatedAttributes: true }); + + // Also verify the content matches + const signerInfos = p7.signerInfos; + const signerInfo = signerInfos?.[0]; + if (signerInfo) { + const md = forge.md.sha256.create(); + md.update(contentBuf.getBytes()); + const digest = md.digest().getBytes(); + + // Find the message digest attribute + let messageDigest = null; + for (const attr of signerInfo.authenticatedAttributes) { + if (attr.type === forge.pki.oids.messageDigest) { + messageDigest = attr.value; + break; + } + } + + if (!messageDigest || messageDigest !== digest) { + return { status: "unsigned" }; + } + } + } catch (error) { + return { status: "unsigned" }; + } + + // Convert forge certificate to PEM for OS verification + const certPem = forge.pki.certificateToPem(signingCert); + const intermediatePems = certificates + .slice(1) + .map((cert) => Buffer.from(forge.pki.certificateToPem(cert))); + + // Verify certificate chain against OS trust store + const chainValid = await verifyCertificateChain( + Buffer.from(certPem), + intermediatePems, + ); + + if (!chainValid) { + // Signature is valid but certificate is not trusted + return { status: "unsigned" }; + } + + // Extract certificate info + const isSelfSigned = + signingCert.issuer.getField("CN")?.value === + signingCert.subject.getField("CN")?.value; + + return { + status: isSelfSigned ? "self-signed" : "signed", + publisher: signingCert.subject.getField("CN")?.value || "Unknown", + issuer: signingCert.issuer.getField("CN")?.value || "Unknown", + valid_from: signingCert.validity.notBefore.toISOString(), + valid_to: signingCert.validity.notAfter.toISOString(), + fingerprint: forge.md.sha256 + .create() + .update( + forge.asn1.toDer(forge.pki.certificateToAsn1(signingCert)).getBytes(), + ) + .digest() + .toHex(), + }; + } catch (error) { + throw new Error(`Failed to verify DXT file: ${error}`); + } +} + +/** + * Creates a signature block buffer with PKCS#7 signature + */ +function createSignatureBlock(pkcs7Signature: Buffer): Buffer { + const parts: Buffer[] = []; + + // Header + parts.push(Buffer.from(SIGNATURE_HEADER, "utf-8")); + + // PKCS#7 signature length and data + const sigLengthBuffer = Buffer.alloc(4); + sigLengthBuffer.writeUInt32LE(pkcs7Signature.length, 0); + parts.push(sigLengthBuffer); + parts.push(pkcs7Signature); + + // Footer + parts.push(Buffer.from(SIGNATURE_FOOTER, "utf-8")); + + return Buffer.concat(parts); +} + +/** + * Extracts the signature block from a signed DXT file + */ +function extractSignatureBlock(fileContent: Buffer): { + originalContent: Buffer; + pkcs7Signature?: Buffer; +} { + // Look for signature footer at the end + const footerBytes = Buffer.from(SIGNATURE_FOOTER, "utf-8"); + const footerIndex = fileContent.lastIndexOf(footerBytes); + + if (footerIndex === -1) { + return { originalContent: fileContent }; + } + + // Look for signature header before footer + const headerBytes = Buffer.from(SIGNATURE_HEADER, "utf-8"); + let headerIndex = -1; + + // Search backwards from footer + for (let i = footerIndex - 1; i >= 0; i--) { + if (fileContent.slice(i, i + headerBytes.length).equals(headerBytes)) { + headerIndex = i; + break; + } + } + + if (headerIndex === -1) { + return { originalContent: fileContent }; + } + + // Extract original content (everything before signature block) + const originalContent = fileContent.slice(0, headerIndex); + + // Parse signature block + let offset = headerIndex + headerBytes.length; + + try { + // Read PKCS#7 signature length + const sigLength = fileContent.readUInt32LE(offset); + offset += 4; + + // Read PKCS#7 signature + const pkcs7Signature = fileContent.slice(offset, offset + sigLength); + + return { + originalContent, + pkcs7Signature, + }; + } catch { + return { originalContent: fileContent }; + } +} + +/** + * Verifies certificate chain against OS trust store + */ +export async function verifyCertificateChain( + certificate: Buffer, + intermediates?: Buffer[], +): Promise { + let tempDir: string | null = null; + + try { + tempDir = await mkdtemp(join(tmpdir(), "dxt-verify-")); + const certChainPath = join(tempDir, "chain.pem"); + const certChain = [certificate, ...(intermediates || [])].join("\n"); + await writeFile(certChainPath, certChain); + + // Platform-specific verification + if (process.platform === "darwin") { + try { + await execFileAsync("security", [ + "verify-cert", + "-c", + certChainPath, + "-p", + "codeSign", + ]); + return true; + } catch (error) { + return false; + } + } else if (process.platform === "win32") { + const psCommand = ` + $ErrorActionPreference = 'Stop' + $certCollection = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2Collection + $certCollection.Import('${certChainPath}') + + if ($certCollection.Count -eq 0) { + Write-Error 'No certificates found' + exit 1 + } + + $leafCert = $certCollection[0] + $chain = New-Object System.Security.Cryptography.X509Certificates.X509Chain + + # Enable revocation checking + $chain.ChainPolicy.RevocationMode = 'Online' + $chain.ChainPolicy.RevocationFlag = 'EntireChain' + $chain.ChainPolicy.UrlRetrievalTimeout = New-TimeSpan -Seconds 30 + + # Add code signing application policy + $codeSignOid = New-Object System.Security.Cryptography.Oid '1.3.6.1.5.5.7.3.3' + $chain.ChainPolicy.ApplicationPolicy.Add($codeSignOid) + + # Add intermediate certificates to extra store + for ($i = 1; $i -lt $certCollection.Count; $i++) { + [void]$chain.ChainPolicy.ExtraStore.Add($certCollection[$i]) + } + + # Build and validate chain + $result = $chain.Build($leafCert) + + if ($result) { + 'Valid' + } else { + $chain.ChainStatus | ForEach-Object { + Write-Error "$($_.Status): $($_.StatusInformation)" + } + exit 1 + } + `.trim(); + + const { stdout } = await execFileAsync("powershell.exe", [ + "-NoProfile", + "-NonInteractive", + "-Command", + psCommand, + ]); + + return stdout.includes("Valid"); + } else { + // Linux: Use openssl + try { + await execFileAsync("openssl", [ + "verify", + "-purpose", + "codesigning", + "-CApath", + "/etc/ssl/certs", + certChainPath, + ]); + return true; + } catch (error) { + return false; + } + } + } catch (error) { + return false; + } finally { + if (tempDir) { + try { + await rm(tempDir, { recursive: true, force: true }); + } catch { + // Ignore cleanup errors + } + } + } +} + +/** + * Removes signature from a DXT file + */ +export function unsignDxtFile(dxtPath: string): void { + const fileContent = readFileSync(dxtPath); + const { originalContent } = extractSignatureBlock(fileContent); + writeFileSync(dxtPath, originalContent); +} diff --git a/src/node/validate.ts b/src/node/validate.ts new file mode 100644 index 0000000..09afa7e --- /dev/null +++ b/src/node/validate.ts @@ -0,0 +1,52 @@ +import { existsSync, readFileSync, statSync } from "fs"; +import { join, resolve } from "path"; + +import { DxtManifestSchema } from "../schemas.js"; + +export function validateManifest(inputPath: string): boolean { + try { + const resolvedPath = resolve(inputPath); + let manifestPath = resolvedPath; + + // If input is a directory, look for manifest.json inside it + if (existsSync(resolvedPath) && statSync(resolvedPath).isDirectory()) { + manifestPath = join(resolvedPath, "manifest.json"); + } + + const manifestContent = readFileSync(manifestPath, "utf-8"); + const manifestData = JSON.parse(manifestContent); + + const result = DxtManifestSchema.safeParse(manifestData); + + if (result.success) { + console.log("Manifest is valid!"); + return true; + } else { + console.log("ERROR: Manifest validation failed:\n"); + result.error.issues.forEach((issue) => { + const path = issue.path.join("."); + console.log(` - ${path ? `${path}: ` : ""}${issue.message}`); + }); + return false; + } + } catch (error) { + if (error instanceof Error) { + if (error.message.includes("ENOENT")) { + console.error(`ERROR: File not found: ${inputPath}`); + if ( + existsSync(resolve(inputPath)) && + statSync(resolve(inputPath)).isDirectory() + ) { + console.error(` (No manifest.json found in directory)`); + } + } else if (error.message.includes("JSON")) { + console.error(`ERROR: Invalid JSON in manifest file: ${error.message}`); + } else { + console.error(`ERROR: Error reading manifest: ${error.message}`); + } + } else { + console.error("ERROR: Unknown error occurred"); + } + return false; + } +} diff --git a/src/schemas.ts b/src/schemas.ts new file mode 100644 index 0000000..8c42091 --- /dev/null +++ b/src/schemas.ts @@ -0,0 +1,101 @@ +import { z } from "zod"; + +export const McpServerConfigSchema = z.object({ + command: z.string(), + args: z.array(z.string()).optional(), + env: z.record(z.string()).optional(), +}); + +export const DxtManifestAuthorSchema = z.object({ + name: z.string(), + email: z.string().email().optional(), + url: z.string().url().optional(), +}); + +export const DxtManifestRepositorySchema = z.object({ + type: z.string(), + url: z.string().url(), +}); + +export const DxtManifestPlatformOverrideSchema = + McpServerConfigSchema.partial(); + +export const DxtManifestMcpConfigSchema = McpServerConfigSchema.extend({ + platform_overrides: z + .record(z.string(), DxtManifestPlatformOverrideSchema) + .optional(), +}); + +export const DxtManifestServerSchema = z.object({ + type: z.enum(["python", "node", "binary"]), + entry_point: z.string(), + mcp_config: DxtManifestMcpConfigSchema, +}); + +export const DxtManifestCompatibilitySchema = z + .object({ + claude_desktop: z.string().optional(), + platforms: z.array(z.enum(["darwin", "win32", "linux"])).optional(), + runtimes: z + .object({ + python: z.string().optional(), + node: z.string().optional(), + }) + .optional(), + }) + .passthrough(); + +export const DxtManifestToolSchema = z.object({ + name: z.string(), + description: z.string().optional(), +}); + +export const DxtManifestPromptSchema = z.object({ + name: z.string(), + description: z.string().optional(), + arguments: z.array(z.string()).optional(), + text: z.string(), +}); + +export const DxtUserConfigurationOptionSchema = z.object({ + type: z.enum(["string", "number", "boolean", "directory", "file"]), + title: z.string(), + description: z.string(), + required: z.boolean().optional(), + default: z + .union([z.string(), z.number(), z.boolean(), z.array(z.string())]) + .optional(), + multiple: z.boolean().optional(), + sensitive: z.boolean().optional(), + min: z.number().optional(), + max: z.number().optional(), +}); + +export const DxtUserConfigValuesSchema = z.record( + z.union([z.string(), z.number(), z.boolean(), z.array(z.string())]), +); + +export const DxtManifestSchema = z.object({ + dxt_version: z.string(), + name: z.string(), + display_name: z.string().optional(), + version: z.string(), + description: z.string(), + long_description: z.string().optional(), + author: DxtManifestAuthorSchema, + repository: DxtManifestRepositorySchema.optional(), + homepage: z.string().url().optional(), + documentation: z.string().url().optional(), + support: z.string().url().optional(), + icon: z.string().optional(), + screenshots: z.array(z.string()).optional(), + server: DxtManifestServerSchema, + tools: z.array(DxtManifestToolSchema).optional(), + tools_generated: z.boolean().optional(), + prompts: z.array(DxtManifestPromptSchema).optional(), + prompts_generated: z.boolean().optional(), + keywords: z.array(z.string()).optional(), + license: z.string().optional(), + compatibility: DxtManifestCompatibilitySchema.optional(), + user_config: z.record(DxtUserConfigurationOptionSchema).optional(), +}); diff --git a/src/shared/config.ts b/src/shared/config.ts new file mode 100644 index 0000000..32cfc7a --- /dev/null +++ b/src/shared/config.ts @@ -0,0 +1,217 @@ +import type { + DxtManifest, + DxtUserConfigValues, + Logger, + McpServerConfig, +} from "../types"; + +/** + * This file contains utility functions for handling DXT configuration, + * including variable replacement and MCP server configuration generation. + */ + +/** + * Recursively replaces variables in any value. Handles strings, arrays, and objects. + * + * @param value The value to process + * @param variables Object containing variable replacements + * @returns The processed value with all variables replaced + */ +export function replaceVariables( + value: unknown, + variables: Record, +): unknown { + if (typeof value === "string") { + let result = value; + + // Replace all variables in the string + for (const [key, replacement] of Object.entries(variables)) { + const pattern = new RegExp(`\\$\\{${key}\\}`, "g"); + + // Check if this pattern actually exists in the string + if (result.match(pattern)) { + if (Array.isArray(replacement)) { + console.warn( + `Cannot replace ${key} with array value in string context: "${value}"`, + { key, replacement }, + ); + } else { + result = result.replace(pattern, replacement); + } + } + } + + return result; + } else if (Array.isArray(value)) { + // For arrays, we need to handle special case of array expansion + const result: unknown[] = []; + + for (const item of value) { + if ( + typeof item === "string" && + item.match(/^\$\{user_config\.[^}]+\}$/) + ) { + // This is a user config variable that might expand to multiple values + const varName = item.match(/^\$\{([^}]+)\}$/)?.[1]; + if (varName && variables[varName]) { + const replacement = variables[varName]; + if (Array.isArray(replacement)) { + // Expand array inline + result.push(...replacement); + } else { + result.push(replacement); + } + } else { + // Variable not found, keep original + result.push(item); + } + } else { + // Recursively process non-variable items + result.push(replaceVariables(item, variables)); + } + } + + return result; + } else if (value && typeof value === "object") { + const result: Record = {}; + for (const [key, val] of Object.entries(value)) { + result[key] = replaceVariables(val, variables); + } + + return result; + } + + return value; +} + +interface GetMcpConfigForManifestOptions { + manifest: DxtManifest; + extensionPath: string; + systemDirs: Record; + userConfig: DxtUserConfigValues; + pathSeparator: string; + logger?: Logger; +} + +export async function getMcpConfigForManifest( + options: GetMcpConfigForManifestOptions, +): Promise { + const { + manifest, + extensionPath, + systemDirs, + userConfig, + pathSeparator, + logger, + } = options; + const baseConfig = manifest.server?.mcp_config; + if (!baseConfig) { + return undefined; + } + + let result: McpServerConfig = { + ...baseConfig, + }; + + if (baseConfig.platform_overrides) { + if (process.platform in baseConfig.platform_overrides) { + const platformConfig = baseConfig.platform_overrides[process.platform]; + + result.command = platformConfig.command || result.command; + result.args = platformConfig.args || result.args; + result.env = platformConfig.env || result.env; + } + } + + // Check if required configuration is missing + if (hasRequiredConfigMissing({ manifest, userConfig })) { + logger?.warn( + `Extension ${manifest.name} has missing required configuration, skipping MCP config`, + ); + return undefined; + } + + const variables: Record = { + __dirname: extensionPath, + pathSeparator, + "/": pathSeparator, + ...systemDirs, + }; + + // Build merged configuration from defaults and user settings + const mergedConfig: Record = {}; + + // First, add defaults from manifest + if (manifest.user_config) { + for (const [key, configOption] of Object.entries(manifest.user_config)) { + if (configOption.default !== undefined) { + mergedConfig[key] = configOption.default; + } + } + } + + // Then, override with user settings + if (userConfig) { + Object.assign(mergedConfig, userConfig); + } + + // Add merged configuration variables for substitution + for (const [key, value] of Object.entries(mergedConfig)) { + // Convert user config to the format expected by variable substitution + const userConfigKey = `user_config.${key}`; + + if (Array.isArray(value)) { + // Keep arrays as arrays for proper expansion + variables[userConfigKey] = value.map(String); + } else if (typeof value === "boolean") { + // Convert booleans to "true"/"false" strings as per spec + variables[userConfigKey] = value ? "true" : "false"; + } else { + // Convert other types to strings + variables[userConfigKey] = String(value); + } + } + + // Replace all variables in the config + result = replaceVariables(result, variables) as McpServerConfig; + + return result; +} + +interface HasRequiredConfigMissingOptions { + manifest: DxtManifest; + userConfig?: DxtUserConfigValues; +} + +/** + * Check if an extension has missing required configuration + * @param manifest The extension manifest + * @param userConfig The user configuration + * @returns true if required configuration is missing + */ +export function hasRequiredConfigMissing({ + manifest, + userConfig, +}: HasRequiredConfigMissingOptions): boolean { + if (!manifest.user_config) { + return false; + } + + const config = userConfig || {}; + + for (const [key, configOption] of Object.entries(manifest.user_config)) { + if (configOption.required) { + const value = config[key]; + if ( + value === undefined || + value === null || + value === "" || + (Array.isArray(value) && value.length === 0) + ) { + return true; + } + } + } + + return false; +} diff --git a/src/shared/log.ts b/src/shared/log.ts new file mode 100644 index 0000000..b644895 --- /dev/null +++ b/src/shared/log.ts @@ -0,0 +1,33 @@ +interface LoggerOptions { + silent?: boolean; +} + +export function getLogger({ silent = false }: LoggerOptions = {}) { + return { + log: (...args: unknown[]) => { + if (!silent) { + console.log(...args); + } + }, + error: (...args: unknown[]) => { + if (!silent) { + console.error(...args); + } + }, + warn: (...args: unknown[]) => { + if (!silent) { + console.warn(...args); + } + }, + info: (...args: unknown[]) => { + if (!silent) { + console.info(...args); + } + }, + debug: (...args: unknown[]) => { + if (!silent) { + console.debug(...args); + } + }, + }; +} diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..8a6f908 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,64 @@ +import type { z } from "zod"; + +import type { + DxtManifestAuthorSchema, + DxtManifestCompatibilitySchema, + DxtManifestMcpConfigSchema, + DxtManifestPlatformOverrideSchema, + DxtManifestPromptSchema, + DxtManifestRepositorySchema, + DxtManifestSchema, + DxtManifestServerSchema, + DxtManifestToolSchema, + DxtUserConfigurationOptionSchema, + DxtUserConfigValuesSchema, + McpServerConfigSchema, +} from "./schemas.js"; + +export type McpServerConfig = z.infer; + +export type DxtManifestAuthor = z.infer; + +export type DxtManifestRepository = z.infer; + +export type DxtManifestPlatformOverride = z.infer< + typeof DxtManifestPlatformOverrideSchema +>; + +export type DxtManifestMcpConfig = z.infer; + +export type DxtManifestServer = z.infer; + +export type DxtManifestCompatibility = z.infer< + typeof DxtManifestCompatibilitySchema +>; + +export type DxtManifestTool = z.infer; + +export type DxtManifestPrompt = z.infer; + +export type DxtUserConfigurationOption = z.infer< + typeof DxtUserConfigurationOptionSchema +>; + +export type DxtUserConfigValues = z.infer; + +export type DxtManifest = z.infer; + +/** + * Information about a DXT package signature + */ +export interface DxtSignatureInfo { + status: "signed" | "unsigned" | "self-signed"; + publisher?: string; + issuer?: string; + valid_from?: string; + valid_to?: string; + fingerprint?: string; +} + +export interface Logger { + log: (...args: unknown[]) => void; + error: (...args: unknown[]) => void; + warn: (...args: unknown[]) => void; +} diff --git a/test/cli.test.ts b/test/cli.test.ts new file mode 100644 index 0000000..e059aae --- /dev/null +++ b/test/cli.test.ts @@ -0,0 +1,80 @@ +import { execSync } from "node:child_process"; +import fs from "node:fs"; +import { join } from "node:path"; + +interface ExecSyncError extends Error { + stdout: Buffer; + stderr: Buffer; + status: number | null; + signal: string | null; +} + +describe("DXT CLI", () => { + const cliPath = join(__dirname, "../dist/cli/cli.js"); + const validManifestPath = join(__dirname, "valid-manifest.json"); + const invalidManifestPath = join(__dirname, "invalid-manifest.json"); + + beforeAll(() => { + // Ensure the CLI is built + execSync("yarn build", { cwd: join(__dirname, "..") }); + }); + + it("should validate a valid manifest", () => { + const result = execSync(`node ${cliPath} validate ${validManifestPath}`, { + encoding: "utf-8", + }); + expect(result).toContain("Manifest is valid!"); + }); + + it("should reject an invalid manifest", () => { + expect(() => { + execSync(`node ${cliPath} validate ${invalidManifestPath}`, { + encoding: "utf-8", + }); + }).toThrow(); + }); + + it("should show usage when no arguments provided", () => { + try { + execSync(`node ${cliPath}`, { encoding: "utf-8", stdio: "pipe" }); + } catch (error) { + // Commander outputs help to stderr when no command is provided + const execError = error as ExecSyncError; + expect(execError.stderr.toString()).toContain( + "Usage: dxt [options] [command]", + ); + } + }); + + it("should handle non-existent files", () => { + try { + execSync(`node ${cliPath} validate /non/existent/file.json`, { + encoding: "utf-8", + stdio: "pipe", + }); + fail("Should have thrown an error"); + } catch (error) { + const execError = error as ExecSyncError; + expect(execError.stderr.toString()).toContain("ERROR: File not found"); + } + }); + + it("should handle invalid JSON", () => { + const invalidJsonPath = join(__dirname, "invalid-json.json"); + fs.writeFileSync(invalidJsonPath, "{ invalid json }"); + + try { + execSync(`node ${cliPath} validate ${invalidJsonPath}`, { + encoding: "utf-8", + stdio: "pipe", + }); + fail("Should have thrown an error"); + } catch (error) { + const execError = error as ExecSyncError; + expect(execError.stderr.toString()).toContain("ERROR: Invalid JSON"); + } + + // Clean up + fs.unlinkSync(invalidJsonPath); + }); +}); diff --git a/test/config.test.ts b/test/config.test.ts new file mode 100644 index 0000000..da70ea2 --- /dev/null +++ b/test/config.test.ts @@ -0,0 +1,483 @@ +import { + getMcpConfigForManifest, + hasRequiredConfigMissing, + replaceVariables, +} from "../src/shared/config"; +import type { DxtManifest, Logger } from "../src/types"; + +describe("replaceVariables", () => { + it("should replace variables in strings", () => { + const result = replaceVariables("Hello ${name}!", { name: "World" }); + expect(result).toBe("Hello World!"); + }); + + it("should replace multiple variables in strings", () => { + const result = replaceVariables("${greeting} ${name}!", { + greeting: "Hello", + name: "World", + }); + expect(result).toBe("Hello World!"); + }); + + it("should warn and not replace arrays in string context", () => { + const consoleWarnSpy = jest.spyOn(console, "warn").mockImplementation(); + const result = replaceVariables("Hello ${names}!", { + names: ["Alice", "Bob"], + }); + expect(result).toBe("Hello ${names}!"); + expect(consoleWarnSpy).toHaveBeenCalled(); + consoleWarnSpy.mockRestore(); + }); + + it("should replace variables in objects", () => { + const result = replaceVariables( + { message: "Hello ${name}!" }, + { name: "World" }, + ); + expect(result).toEqual({ message: "Hello World!" }); + }); + + it("should handle user config variables in arrays with string expansion", () => { + const result = replaceVariables(["${user_config.path}"], { + "user_config.path": "/some/path", + }); + expect(result).toEqual(["/some/path"]); + }); + + it("should handle user config variables in arrays with array expansion", () => { + const result = replaceVariables(["${user_config.paths}"], { + "user_config.paths": ["/path1", "/path2"], + }); + expect(result).toEqual(["/path1", "/path2"]); + }); + + it("should recursively process arrays", () => { + const result = replaceVariables(["Hello ${name}!", "Goodbye ${name}!"], { + name: "World", + }); + expect(result).toEqual(["Hello World!", "Goodbye World!"]); + }); + + it("should handle mixed arrays with variable expansion", () => { + const result = replaceVariables(["start", "${user_config.items}", "end"], { + "user_config.items": ["item1", "item2"], + }); + expect(result).toEqual(["start", "item1", "item2", "end"]); + }); + + it("should return primitive values unchanged", () => { + expect(replaceVariables(42, {})).toBe(42); + expect(replaceVariables(true, {})).toBe(true); + expect(replaceVariables(null, {})).toBe(null); + }); + + it("should handle undefined variables by keeping them as-is", () => { + const result = replaceVariables("Hello ${unknown}!", {}); + expect(result).toBe("Hello ${unknown}!"); + }); +}); + +describe("getMcpConfigForManifest", () => { + const mockLogger: Logger = { + log: jest.fn(), + error: jest.fn(), + warn: jest.fn(), + }; + + const mockSystemDirs = { + home: "/home/user", + data: "/data", + }; + + const baseManifest: DxtManifest = { + dxt_version: "1.0.0", + name: "test-extension", + version: "1.0.0", + description: "Test extension", + author: { name: "Test Author" }, + server: { + type: "node", + entry_point: "server.js", + mcp_config: { + command: "node", + args: ["server.js", "${__dirname}"], + }, + }, + compatibility: { claude_desktop: "0.1.0" }, + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("should return undefined when manifest has no mcp_config", async () => { + const manifest = { + ...baseManifest, + server: undefined, + } as unknown as DxtManifest; + + const result = await getMcpConfigForManifest({ + manifest, + extensionPath: "/ext/path", + systemDirs: mockSystemDirs, + userConfig: {}, + pathSeparator: "/", + logger: mockLogger, + }); + + expect(result).toBeUndefined(); + }); + + it("should return undefined when required config is missing", async () => { + const manifest: DxtManifest = { + ...baseManifest, + user_config: { + apiKey: { + type: "string", + title: "API Key", + description: "API Key", + required: true, + }, + }, + }; + + const result = await getMcpConfigForManifest({ + manifest, + extensionPath: "/ext/path", + systemDirs: mockSystemDirs, + userConfig: {}, + pathSeparator: "/", + logger: mockLogger, + }); + + expect(result).toBeUndefined(); + expect(mockLogger.warn).toHaveBeenCalled(); + }); + + it("should replace variables in basic config", async () => { + const result = await getMcpConfigForManifest({ + manifest: baseManifest, + extensionPath: "/ext/path", + systemDirs: mockSystemDirs, + userConfig: {}, + pathSeparator: "/", + logger: mockLogger, + }); + + expect(result).toEqual({ + command: "node", + args: ["server.js", "/ext/path"], + }); + }); + + it("should apply platform overrides", async () => { + const manifest: DxtManifest = { + ...baseManifest, + server: { + type: "node", + entry_point: "server.js", + mcp_config: { + command: "default-command", + args: ["default"], + platform_overrides: { + [process.platform]: { + command: "platform-command", + args: ["platform-specific"], + }, + }, + }, + }, + }; + + const result = await getMcpConfigForManifest({ + manifest, + extensionPath: "/ext/path", + systemDirs: mockSystemDirs, + userConfig: {}, + pathSeparator: "/", + logger: mockLogger, + }); + + expect(result?.command).toBe("platform-command"); + expect(result?.args).toEqual(["platform-specific"]); + }); + + it("should handle user config variable replacement with defaults", async () => { + const manifest: DxtManifest = { + ...baseManifest, + user_config: { + port: { + type: "number", + title: "Port Number", + description: "Port number", + default: 8080, + }, + }, + server: { + type: "node", + entry_point: "server.js", + mcp_config: { + command: "node", + args: ["server.js", "--port=${user_config.port}"], + }, + }, + }; + + const result = await getMcpConfigForManifest({ + manifest, + extensionPath: "/ext/path", + systemDirs: mockSystemDirs, + userConfig: {}, + pathSeparator: "/", + logger: mockLogger, + }); + + expect(result?.args).toEqual(["server.js", "--port=8080"]); + }); + + it("should handle user config variable replacement with user values", async () => { + const manifest: DxtManifest = { + ...baseManifest, + user_config: { + paths: { + type: "string", + title: "File Paths", + description: "File paths", + default: ["/default"], + multiple: true, + }, + }, + server: { + type: "node", + entry_point: "server.js", + mcp_config: { + command: "node", + args: ["server.js", "${user_config.paths}"], + }, + }, + }; + + const result = await getMcpConfigForManifest({ + manifest, + extensionPath: "/ext/path", + systemDirs: mockSystemDirs, + userConfig: { paths: ["/user/path1", "/user/path2"] }, + pathSeparator: "/", + logger: mockLogger, + }); + + expect(result?.args).toEqual(["server.js", "/user/path1", "/user/path2"]); + }); + + it("should convert boolean user config values to strings", async () => { + const manifest: DxtManifest = { + ...baseManifest, + user_config: { + verbose: { + type: "boolean", + title: "Verbose Mode", + description: "Verbose output", + default: false, + }, + }, + server: { + type: "node", + entry_point: "server.js", + mcp_config: { + command: "node", + args: ["server.js", "--verbose=${user_config.verbose}"], + }, + }, + }; + + const result = await getMcpConfigForManifest({ + manifest, + extensionPath: "/ext/path", + systemDirs: mockSystemDirs, + userConfig: { verbose: true }, + pathSeparator: "/", + logger: mockLogger, + }); + + expect(result?.args).toEqual(["server.js", "--verbose=true"]); + }); +}); + +describe("hasRequiredConfigMissing", () => { + const baseManifest: DxtManifest = { + dxt_version: "1.0.0", + name: "test-extension", + version: "1.0.0", + description: "Test extension", + author: { name: "Test Author" }, + server: { + type: "node", + entry_point: "server.js", + mcp_config: { + command: "node", + args: ["server.js"], + }, + }, + }; + + it("should return false when manifest has no user_config", () => { + const result = hasRequiredConfigMissing({ + manifest: baseManifest, + userConfig: {}, + }); + expect(result).toBe(false); + }); + + it("should return false when no config fields are required", () => { + const manifest: DxtManifest = { + ...baseManifest, + user_config: { + port: { + type: "number", + title: "Port", + description: "Port number", + required: false, + }, + }, + }; + + const result = hasRequiredConfigMissing({ + manifest, + userConfig: {}, + }); + expect(result).toBe(false); + }); + + it("should return false when required config is provided", () => { + const manifest: DxtManifest = { + ...baseManifest, + user_config: { + apiKey: { + type: "string", + title: "API Key", + description: "API Key", + required: true, + }, + }, + }; + + const result = hasRequiredConfigMissing({ + manifest, + userConfig: { apiKey: "test-key" }, + }); + expect(result).toBe(false); + }); + + it("should return true when required config is undefined", () => { + const manifest: DxtManifest = { + ...baseManifest, + user_config: { + apiKey: { + type: "string", + title: "API Key", + description: "API Key", + required: true, + }, + }, + }; + + const result = hasRequiredConfigMissing({ + manifest, + userConfig: {}, + }); + expect(result).toBe(true); + }); + + it("should return true when required config is empty string", () => { + const manifest: DxtManifest = { + ...baseManifest, + user_config: { + apiKey: { + type: "string", + title: "API Key", + description: "API Key", + required: true, + }, + }, + }; + + const result = hasRequiredConfigMissing({ + manifest, + userConfig: { apiKey: "" }, + }); + expect(result).toBe(true); + }); + + it("should return true when required config is empty array", () => { + const manifest: DxtManifest = { + ...baseManifest, + user_config: { + paths: { + type: "string", + title: "Paths", + description: "File paths", + required: true, + multiple: true, + }, + }, + }; + + const result = hasRequiredConfigMissing({ + manifest, + userConfig: { paths: [] }, + }); + expect(result).toBe(true); + }); + + it("should return false when no user config is provided but nothing is required", () => { + const result = hasRequiredConfigMissing({ + manifest: baseManifest, + // userConfig not provided + }); + expect(result).toBe(false); + }); + + it("should handle multiple required config fields", () => { + const manifest: DxtManifest = { + ...baseManifest, + user_config: { + apiKey: { + type: "string", + title: "API Key", + description: "API Key", + required: true, + }, + database: { + type: "string", + title: "Database", + description: "Database connection", + required: true, + }, + port: { + type: "number", + title: "Port", + description: "Port number", + required: false, + }, + }, + }; + + const resultMissingBoth = hasRequiredConfigMissing({ + manifest, + userConfig: {}, + }); + expect(resultMissingBoth).toBe(true); + + const resultMissingOne = hasRequiredConfigMissing({ + manifest, + userConfig: { apiKey: "test-key" }, + }); + expect(resultMissingOne).toBe(true); + + const resultHasBoth = hasRequiredConfigMissing({ + manifest, + userConfig: { apiKey: "test-key", database: "test-db" }, + }); + expect(resultHasBoth).toBe(false); + }); +}); diff --git a/test/dxtignore.test.ts b/test/dxtignore.test.ts new file mode 100644 index 0000000..f5ebe4c --- /dev/null +++ b/test/dxtignore.test.ts @@ -0,0 +1,261 @@ +import * as fs from "fs"; +import * as os from "os"; +import * as path from "path"; + +import { + getAllFiles, + readDxtIgnorePatterns, + shouldExclude, +} from "../src/node/files.js"; + +describe("DxtIgnore functionality", () => { + let tempDir: string; + let dxtIgnorePath: string; + + beforeEach(() => { + // Create a temp directory for each test + tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "dxt-test-")); + dxtIgnorePath = path.join(tempDir, ".dxtignore"); + }); + + afterEach(() => { + // Clean up temp directory after each test + fs.rmSync(tempDir, { recursive: true, force: true }); + }); + + describe("readDxtIgnorePatterns", () => { + it("should return empty array when .dxtignore doesn't exist", () => { + const patterns = readDxtIgnorePatterns(tempDir); + expect(patterns).toEqual([]); + }); + + it("should read patterns from .dxtignore file", () => { + const content = `*.log +node_modules/ +temp/ +.env`; + fs.writeFileSync(dxtIgnorePath, content); + + const patterns = readDxtIgnorePatterns(tempDir); + expect(patterns).toEqual(["*.log", "node_modules/", "temp/", ".env"]); + }); + + it("should ignore empty lines and comments", () => { + const content = `# Comment line +*.log + +# Another comment +node_modules/ + +.env`; + fs.writeFileSync(dxtIgnorePath, content); + + const patterns = readDxtIgnorePatterns(tempDir); + expect(patterns).toEqual(["*.log", "node_modules/", ".env"]); + }); + + it("should trim whitespace from lines", () => { + const content = ` *.log + node_modules/ +temp/`; + fs.writeFileSync(dxtIgnorePath, content); + + const patterns = readDxtIgnorePatterns(tempDir); + expect(patterns).toEqual(["*.log", "node_modules/", "temp/"]); + }); + + it("should handle Windows line endings", () => { + const content = `*.log\r\nnode_modules/\r\ntemp/`; + fs.writeFileSync(dxtIgnorePath, content); + + const patterns = readDxtIgnorePatterns(tempDir); + expect(patterns).toEqual(["*.log", "node_modules/", "temp/"]); + }); + + it("should return empty array if file cannot be read", () => { + const content = "*.log"; + fs.writeFileSync(dxtIgnorePath, content); + fs.chmodSync(dxtIgnorePath, 0); // Make file unreadable + + const patterns = readDxtIgnorePatterns(tempDir); + expect(patterns).toEqual([]); + + // Restore permissions for cleanup + fs.chmodSync(dxtIgnorePath, 0o644); + }); + }); + + describe("shouldExclude with additional patterns", () => { + it("should exclude files matching additional patterns", () => { + const additionalPatterns = ["*.test.js", "coverage/"]; + + expect(shouldExclude("test.test.js", additionalPatterns)).toBe(true); + expect(shouldExclude("coverage/file.txt", additionalPatterns)).toBe(true); + expect(shouldExclude("src/index.js", additionalPatterns)).toBe(false); + }); + + it("should still exclude default patterns", () => { + const additionalPatterns = ["*.test.js"]; + + // Test default pattern + expect(shouldExclude(".DS_Store", additionalPatterns)).toBe(true); + // Test additional pattern + expect(shouldExclude("test.test.js", additionalPatterns)).toBe(true); + // Test non-excluded file + expect(shouldExclude("src/index.js", additionalPatterns)).toBe(false); + }); + + it("should handle glob patterns correctly", () => { + const additionalPatterns = ["*.log", "temp/*"]; + + expect(shouldExclude("debug.log", additionalPatterns)).toBe(true); + expect(shouldExclude("temp/file.txt", additionalPatterns)).toBe(true); + expect(shouldExclude("src/main.js", additionalPatterns)).toBe(false); + }); + + it("should handle exact path matches", () => { + const additionalPatterns = ["node_modules", "dist"]; + + expect(shouldExclude("node_modules", additionalPatterns)).toBe(true); + expect(shouldExclude("dist", additionalPatterns)).toBe(true); + expect(shouldExclude("src/node_modules", additionalPatterns)).toBe(true); + expect(shouldExclude("src", additionalPatterns)).toBe(false); + }); + }); + + describe("getAllFiles with .dxtignore", () => { + let testStructure: string; + + beforeEach(() => { + // Create test directory structure + testStructure = path.join(tempDir, "test-extension"); + fs.mkdirSync(testStructure); + fs.mkdirSync(path.join(testStructure, "src")); + fs.mkdirSync(path.join(testStructure, "tests")); + fs.mkdirSync(path.join(testStructure, "coverage")); + fs.mkdirSync(path.join(testStructure, "logs")); + + // Create test files + fs.writeFileSync(path.join(testStructure, "manifest.json"), "{}"); + fs.writeFileSync( + path.join(testStructure, "src/index.js"), + "console.log('hi')", + ); + fs.writeFileSync(path.join(testStructure, "tests/test.js"), "test()"); + fs.writeFileSync( + path.join(testStructure, "coverage/report.txt"), + "coverage", + ); + fs.writeFileSync(path.join(testStructure, "logs/debug.log"), "log"); + fs.writeFileSync(path.join(testStructure, "debug.log"), "log"); + }); + + it("should exclude files matching .dxtignore patterns", () => { + // Create .dxtignore + const dxtIgnoreContent = `*.log +tests/ +coverage/`; + fs.writeFileSync( + path.join(testStructure, ".dxtignore"), + dxtIgnoreContent, + ); + + const patterns = readDxtIgnorePatterns(testStructure); + const files = getAllFiles(testStructure, testStructure, {}, patterns); + + const fileNames = Object.keys(files); + + // Should include + expect(fileNames).toContain("manifest.json"); + expect(fileNames).toContain("src/index.js"); + + // Should exclude + expect(fileNames).not.toContain("debug.log"); + expect(fileNames).not.toContain("logs/debug.log"); + expect(fileNames).not.toContain("tests/test.js"); + expect(fileNames).not.toContain("coverage/report.txt"); + expect(fileNames).not.toContain(".dxtignore"); + }); + + it("should exclude both default patterns and .dxtignore patterns", () => { + // Create .dxtignore + const dxtIgnoreContent = `tests/`; + fs.writeFileSync( + path.join(testStructure, ".dxtignore"), + dxtIgnoreContent, + ); + + // Create a .git file (default exclusion) + fs.writeFileSync(path.join(testStructure, ".gitignore"), "ignore"); + + const patterns = readDxtIgnorePatterns(testStructure); + const files = getAllFiles(testStructure, testStructure, {}, patterns); + + const fileNames = Object.keys(files); + + // Should include + expect(fileNames).toContain("manifest.json"); + expect(fileNames).toContain("src/index.js"); + + // Should exclude (from .dxtignore) + expect(fileNames).not.toContain("tests/test.js"); + + // Should exclude (from default patterns) + expect(fileNames).not.toContain(".gitignore"); + }); + + it("should work without .dxtignore file", () => { + const files = getAllFiles(testStructure, testStructure, {}, []); + const fileNames = Object.keys(files); + + // Should include all files except default exclusions + expect(fileNames).toContain("manifest.json"); + expect(fileNames).toContain("src/index.js"); + expect(fileNames).toContain("tests/test.js"); + expect(fileNames).toContain("coverage/report.txt"); + // Note: *.log files are excluded by default, so these won't be included + expect(fileNames).not.toContain("logs/debug.log"); + expect(fileNames).not.toContain("debug.log"); + }); + }); + + describe("Pattern matching edge cases", () => { + it("should handle nested directories", () => { + const additionalPatterns = ["node_modules/"]; + + expect( + shouldExclude("node_modules/package/index.js", additionalPatterns), + ).toBe(true); + expect( + shouldExclude("src/node_modules/package/index.js", additionalPatterns), + ).toBe(true); + }); + + it("should handle paths with directory patterns", () => { + const additionalPatterns = ["tests/"]; + + expect(shouldExclude("tests/unit/test.js", additionalPatterns)).toBe( + true, + ); + expect( + shouldExclude("tests/integration/test.js", additionalPatterns), + ).toBe(true); + // Note: "tests" appears anywhere in path due to current implementation + expect(shouldExclude("src/tests/test.js", additionalPatterns)).toBe(true); + // But paths without "tests" should not be excluded + expect(shouldExclude("src/main.js", additionalPatterns)).toBe(false); + }); + + it("should match patterns (implementation details)", () => { + const additionalPatterns = ["specific-file.LOG"]; + + // Test that the pattern is matched + expect(shouldExclude("specific-file.LOG", additionalPatterns)).toBe(true); + + // Test completely different file name + expect(shouldExclude("totally-different.txt", additionalPatterns)).toBe( + false, + ); + }); + }); +}); diff --git a/test/init.test.ts b/test/init.test.ts new file mode 100644 index 0000000..d01387a --- /dev/null +++ b/test/init.test.ts @@ -0,0 +1,363 @@ +import { existsSync, readFileSync } from "fs"; + +import { + buildManifest, + createMcpConfig, + getDefaultAuthorEmail, + getDefaultAuthorName, + getDefaultAuthorUrl, + getDefaultEntryPoint, + getDefaultRepositoryUrl, + readPackageJson, +} from "../src/cli/init.js"; + +// Mock the fs module +jest.mock("fs", () => ({ + existsSync: jest.fn(), + readFileSync: jest.fn(), + writeFileSync: jest.fn(), +})); + +describe("init functions", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe("readPackageJson", () => { + it("should return empty object when package.json doesn't exist", () => { + (existsSync as jest.Mock).mockReturnValue(false); + const result = readPackageJson("/test/path"); + expect(result).toEqual({}); + }); + + it("should parse package.json when it exists", () => { + (existsSync as jest.Mock).mockReturnValue(true); + const mockPackageData = { name: "test-package", version: "1.0.0" }; + (readFileSync as jest.Mock).mockReturnValue( + JSON.stringify(mockPackageData), + ); + + const result = readPackageJson("/test/path"); + expect(result).toEqual(mockPackageData); + }); + + it("should return empty object when package.json is invalid", () => { + (existsSync as jest.Mock).mockReturnValue(true); + (readFileSync as jest.Mock).mockReturnValue("invalid json"); + + const result = readPackageJson("/test/path"); + expect(result).toEqual({}); + }); + }); + + describe("getDefaultAuthorName", () => { + it("should return string author when author is string", () => { + const result = getDefaultAuthorName({ author: "John Doe" }); + expect(result).toBe("John Doe"); + }); + + it("should return author.name when author is object", () => { + const result = getDefaultAuthorName({ author: { name: "John Doe" } }); + expect(result).toBe("John Doe"); + }); + + it("should return empty string when no author", () => { + const result = getDefaultAuthorName({}); + expect(result).toBe(""); + }); + }); + + describe("getDefaultAuthorEmail", () => { + it("should return author.email when author is object with email", () => { + const result = getDefaultAuthorEmail({ + author: { email: "john@example.com" }, + }); + expect(result).toBe("john@example.com"); + }); + + it("should return empty string when author is string", () => { + const result = getDefaultAuthorEmail({ author: "John Doe" }); + expect(result).toBe(""); + }); + + it("should return empty string when no email", () => { + const result = getDefaultAuthorEmail({ author: { name: "John" } }); + expect(result).toBe(""); + }); + }); + + describe("getDefaultAuthorUrl", () => { + it("should return author.url when author is object with url", () => { + const result = getDefaultAuthorUrl({ + author: { url: "https://example.com" }, + }); + expect(result).toBe("https://example.com"); + }); + + it("should return empty string when author is string", () => { + const result = getDefaultAuthorUrl({ author: "John Doe" }); + expect(result).toBe(""); + }); + + it("should return empty string when no url", () => { + const result = getDefaultAuthorUrl({ author: { name: "John" } }); + expect(result).toBe(""); + }); + }); + + describe("getDefaultRepositoryUrl", () => { + it("should return string repository when repository is string", () => { + const result = getDefaultRepositoryUrl({ + repository: "https://github.com/user/repo", + }); + expect(result).toBe("https://github.com/user/repo"); + }); + + it("should return repository.url when repository is object", () => { + const result = getDefaultRepositoryUrl({ + repository: { type: "git", url: "https://github.com/user/repo" }, + }); + expect(result).toBe("https://github.com/user/repo"); + }); + + it("should return empty string when no repository", () => { + const result = getDefaultRepositoryUrl({}); + expect(result).toBe(""); + }); + }); + + describe("createMcpConfig", () => { + it("should create node config", () => { + const result = createMcpConfig("node", "server/index.js"); + expect(result).toEqual({ + command: "node", + args: ["${__dirname}/server/index.js"], + env: {}, + }); + }); + + it("should create python config", () => { + const result = createMcpConfig("python", "server/main.py"); + expect(result).toEqual({ + command: "python", + args: ["${__dirname}/server/main.py"], + env: { + PYTHONPATH: "server/lib", + }, + }); + }); + + it("should create binary config", () => { + const result = createMcpConfig("binary", "server/my-server"); + expect(result).toEqual({ + command: "${__dirname}/server/my-server", + args: [], + env: {}, + }); + }); + }); + + describe("getDefaultEntryPoint", () => { + it("should return node default", () => { + expect(getDefaultEntryPoint("node")).toBe("server/index.js"); + }); + + it("should return python default", () => { + expect(getDefaultEntryPoint("python")).toBe("server/main.py"); + }); + + it("should return binary default", () => { + expect(getDefaultEntryPoint("binary")).toBe("server/my-server"); + }); + }); + + describe("buildManifest", () => { + it("should build minimal manifest", () => { + const manifest = buildManifest( + { + name: "test-extension", + displayName: "test-extension", + version: "1.0.0", + description: "Test description", + authorName: "John Doe", + }, + undefined, // longDescription + { + authorEmail: "", + authorUrl: "", + }, + { + homepage: "", + documentation: "", + support: "", + }, + { + icon: "", + screenshots: [], + }, + { + serverType: "node", + entryPoint: "server/index.js", + mcp_config: { + command: "node", + args: ["${__dirname}/server/index.js"], + env: {}, + }, + }, + [], // tools + false, // toolsGenerated + [], // prompts + false, // promptsGenerated + undefined, // compatibility + {}, // userConfig + { + keywords: "", + license: "", + }, + ); + + expect(manifest).toEqual({ + dxt_version: "0.1", + name: "test-extension", + version: "1.0.0", + description: "Test description", + author: { + name: "John Doe", + }, + server: { + type: "node", + entry_point: "server/index.js", + mcp_config: { + command: "node", + args: ["${__dirname}/server/index.js"], + env: {}, + }, + }, + }); + }); + + it("should include optional fields when provided", () => { + const manifest = buildManifest( + { + name: "test-extension", + displayName: "Test Extension", + version: "1.0.0", + description: "Test description", + authorName: "John Doe", + }, + "This is a detailed long description with more information.", // longDescription + { + authorEmail: "john@example.com", + authorUrl: "https://example.com", + }, + { + homepage: "https://homepage.example.com", + documentation: "https://docs.example.com", + support: "https://support.example.com", + }, + { + icon: "icon.png", + screenshots: ["screen1.png", "screen2.png"], + }, + { + serverType: "python", + entryPoint: "server/main.py", + mcp_config: { + command: "python", + args: ["server/main.py"], + env: { PYTHONPATH: "server/lib" }, + }, + }, + [ + { name: "tool1", description: "Tool 1 description" }, + { name: "tool2" }, + ], // tools + false, // toolsGenerated + [ + { + name: "analyze_code", + description: "Code analysis prompt", + text: "Analyze the following code...", + }, + ], // prompts + false, // promptsGenerated + { + claude_desktop: ">=0.4.0", + platforms: ["darwin", "linux"], + runtimes: { python: ">=3.8,<4.0" }, + }, // compatibility + { + api_key: { + type: "string", + title: "API Key", + description: "Your API key", + required: true, + sensitive: true, + }, + }, // userConfig + { + keywords: "test, extension, mcp", + license: "MIT", + repository: { type: "git", url: "https://github.com/user/repo" }, + }, + ); + + expect(manifest).toEqual({ + dxt_version: "0.1", + name: "test-extension", + display_name: "Test Extension", + version: "1.0.0", + description: "Test description", + long_description: + "This is a detailed long description with more information.", + author: { + name: "John Doe", + email: "john@example.com", + url: "https://example.com", + }, + homepage: "https://homepage.example.com", + documentation: "https://docs.example.com", + support: "https://support.example.com", + icon: "icon.png", + screenshots: ["screen1.png", "screen2.png"], + server: { + type: "python", + entry_point: "server/main.py", + mcp_config: { + command: "python", + args: ["server/main.py"], + env: { PYTHONPATH: "server/lib" }, + }, + }, + tools: [ + { name: "tool1", description: "Tool 1 description" }, + { name: "tool2" }, + ], + prompts: [ + { + name: "analyze_code", + description: "Code analysis prompt", + text: "Analyze the following code...", + }, + ], + compatibility: { + claude_desktop: ">=0.4.0", + platforms: ["darwin", "linux"], + runtimes: { python: ">=3.8,<4.0" }, + }, + user_config: { + api_key: { + type: "string", + title: "API Key", + description: "Your API key", + required: true, + sensitive: true, + }, + }, + keywords: ["test", "extension", "mcp"], + license: "MIT", + repository: { type: "git", url: "https://github.com/user/repo" }, + }); + }); + }); +}); diff --git a/test/invalid-manifest.json b/test/invalid-manifest.json new file mode 100644 index 0000000..21a2013 --- /dev/null +++ b/test/invalid-manifest.json @@ -0,0 +1,13 @@ +{ + "dxt_version": "1.0", + "name": "test-extension", + "version": "1.0.0", + "description": "A test DXT extension", + "author": { + "email": "not-a-valid-email" + }, + "server": { + "type": "invalid-type", + "entry_point": "server/index.js" + } +} diff --git a/test/schemas.test.ts b/test/schemas.test.ts new file mode 100644 index 0000000..a80ff7b --- /dev/null +++ b/test/schemas.test.ts @@ -0,0 +1,150 @@ +import { readFileSync } from "fs"; +import { join } from "path"; + +import { DxtManifestSchema } from "../src/schemas"; + +describe("DxtManifestSchema", () => { + it("should validate a valid manifest", () => { + const manifestPath = join(__dirname, "valid-manifest.json"); + const manifestContent = readFileSync(manifestPath, "utf-8"); + const manifestData = JSON.parse(manifestContent); + + const result = DxtManifestSchema.safeParse(manifestData); + + expect(result.success).toBe(true); + if (result.success) { + expect(result.data.name).toBe("test-extension"); + expect(result.data.server.type).toBe("node"); + } + }); + + it("should reject an invalid manifest", () => { + const manifestPath = join(__dirname, "invalid-manifest.json"); + const manifestContent = readFileSync(manifestPath, "utf-8"); + const manifestData = JSON.parse(manifestContent); + + const result = DxtManifestSchema.safeParse(manifestData); + + expect(result.success).toBe(false); + if (!result.success) { + const errors = result.error.issues.map((issue) => issue.path.join(".")); + expect(errors).toContain("author.name"); + expect(errors).toContain("author.email"); + expect(errors).toContain("server.type"); + expect(errors).toContain("server.mcp_config"); + } + }); + + it("should validate manifest with all optional fields", () => { + const fullManifest = { + dxt_version: "1.0", + name: "full-extension", + display_name: "Full Featured Extension", + version: "2.0.0", + description: "An extension with all features", + long_description: "This is a detailed description of the extension", + author: { + name: "Test Author", + email: "test@example.com", + url: "https://example.com", + }, + repository: { + type: "git", + url: "https://github.com/example/extension", + }, + homepage: "https://example.com/extension", + documentation: "https://docs.example.com", + support: "https://support.example.com", + icon: "icon.png", + screenshots: ["screenshot1.png", "screenshot2.png"], + server: { + type: "python", + entry_point: "main.py", + mcp_config: { + command: "python", + args: ["main.py"], + env: { PYTHONPATH: "." }, + }, + runtime_requirements: { + python: ">=3.8", + }, + }, + tools: [ + { + name: "my_tool", + description: "A useful tool", + input_schema: { type: "object" }, + }, + ], + keywords: ["test", "example"], + license: "MIT", + compatibility: { + claude_desktop: ">=1.0.0", + platforms: ["darwin", "win32"], + runtimes: { + python: ">=3.8", + node: ">=16.0.0", + }, + }, + settings: { + configurable: true, + schema: { + type: "object", + properties: {}, + }, + }, + user_config: { + api_key: { + type: "string", + title: "API Key", + description: "Your API key", + required: true, + sensitive: true, + }, + max_results: { + type: "number", + title: "Max Results", + description: "Maximum number of results", + default: 10, + min: 1, + max: 100, + }, + }, + }; + + const result = DxtManifestSchema.safeParse(fullManifest); + + expect(result.success).toBe(true); + if (result.success) { + expect(result.data.display_name).toBe("Full Featured Extension"); + expect(result.data.tools).toHaveLength(1); + expect(result.data.compatibility?.platforms).toContain("darwin"); + expect(result.data.user_config?.api_key.type).toBe("string"); + } + }); + + it("should validate server types correctly", () => { + const serverTypes = ["python", "node", "binary"]; + + serverTypes.forEach((type) => { + const manifest = { + dxt_version: "1.0", + name: "test", + version: "1.0.0", + description: "Test", + author: { name: "Test" }, + server: { + type, + entry_point: "main", + mcp_config: { + command: type === "binary" ? "./main" : type, + args: ["main"], + }, + }, + }; + + const result = DxtManifestSchema.safeParse(manifest); + expect(result.success).toBe(true); + }); + }); +}); diff --git a/test/sign.e2e.test.ts b/test/sign.e2e.test.ts new file mode 100755 index 0000000..999c039 --- /dev/null +++ b/test/sign.e2e.test.ts @@ -0,0 +1,467 @@ +/** + * End-to-end test for DXT signing and verification + * + * This test: + * 1. Creates a test DXT file + * 2. Generates a self-signed certificate for testing + * 3. Signs the DXT file + * 4. Verifies the signature + * 5. Tests various failure scenarios + */ + +import * as fs from "fs"; +import forge from "node-forge"; +import * as path from "path"; + +import { signDxtFile, unsignDxtFile, verifyDxtFile } from "../src/node/sign"; + +// Test directory +const TEST_DIR = path.join(__dirname, "test-output"); + +// Ensure test directory exists +if (!fs.existsSync(TEST_DIR)) { + fs.mkdirSync(TEST_DIR, { recursive: true }); +} + +// Test file paths +const TEST_DXT = path.join(TEST_DIR, "test.dxt"); +const SELF_SIGNED_CERT = path.join(TEST_DIR, "self-signed.crt"); +const SELF_SIGNED_KEY = path.join(TEST_DIR, "self-signed.key"); +const CA_CERT = path.join(TEST_DIR, "ca.crt"); +const CA_KEY = path.join(TEST_DIR, "ca.key"); +const SIGNED_CERT = path.join(TEST_DIR, "signed.crt"); +const SIGNED_KEY = path.join(TEST_DIR, "signed.key"); + +/** + * Generate a self-signed certificate for testing + */ +function generateSelfSignedCert() { + const keys = forge.pki.rsa.generateKeyPair(2048); + const cert = forge.pki.createCertificate(); + + cert.publicKey = keys.publicKey; + cert.serialNumber = "01"; + cert.validity.notBefore = new Date(); + cert.validity.notAfter = new Date(); + cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1); + + const attrs = [ + { name: "commonName", value: "Test DXT Publisher" }, + { name: "countryName", value: "US" }, + { name: "organizationName", value: "Test Org" }, + ]; + + cert.setSubject(attrs); + cert.setIssuer(attrs); + + // Add extensions + cert.setExtensions([ + { + name: "basicConstraints", + cA: false, + }, + { + name: "keyUsage", + keyCertSign: false, + digitalSignature: true, + nonRepudiation: true, + keyEncipherment: false, + dataEncipherment: false, + }, + { + name: "extKeyUsage", + codeSigning: true, + }, + ]); + + // Self-sign + cert.sign(keys.privateKey, forge.md.sha256.create()); + + // Write files + fs.writeFileSync(SELF_SIGNED_CERT, forge.pki.certificateToPem(cert)); + fs.writeFileSync(SELF_SIGNED_KEY, forge.pki.privateKeyToPem(keys.privateKey)); +} + +/** + * Generate a CA and signed certificate for testing + */ +function generateCASignedCert() { + // Generate CA + const caKeys = forge.pki.rsa.generateKeyPair(2048); + const caCert = forge.pki.createCertificate(); + + caCert.publicKey = caKeys.publicKey; + caCert.serialNumber = "01"; + caCert.validity.notBefore = new Date(); + caCert.validity.notAfter = new Date(); + caCert.validity.notAfter.setFullYear( + caCert.validity.notBefore.getFullYear() + 10, + ); + + const caAttrs = [ + { name: "commonName", value: "Test CA" }, + { name: "countryName", value: "US" }, + { name: "organizationName", value: "Test CA Org" }, + ]; + + caCert.setSubject(caAttrs); + caCert.setIssuer(caAttrs); + + caCert.setExtensions([ + { + name: "basicConstraints", + cA: true, + }, + { + name: "keyUsage", + keyCertSign: true, + digitalSignature: true, + cRLSign: true, + }, + ]); + + caCert.sign(caKeys.privateKey, forge.md.sha256.create()); + + // Generate signed certificate + const keys = forge.pki.rsa.generateKeyPair(2048); + const cert = forge.pki.createCertificate(); + + cert.publicKey = keys.publicKey; + cert.serialNumber = "02"; + cert.validity.notBefore = new Date(); + cert.validity.notAfter = new Date(); + cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1); + + const attrs = [ + { name: "commonName", value: "Test Publisher (CA Signed)" }, + { name: "countryName", value: "US" }, + { name: "organizationName", value: "Test Publisher Org" }, + ]; + + cert.setSubject(attrs); + cert.setIssuer(caCert.subject.attributes); + + cert.setExtensions([ + { + name: "basicConstraints", + cA: false, + }, + { + name: "keyUsage", + digitalSignature: true, + nonRepudiation: true, + }, + { + name: "extKeyUsage", + codeSigning: true, + }, + ]); + + // Sign with CA + cert.sign(caKeys.privateKey, forge.md.sha256.create()); + + // Write files + fs.writeFileSync(CA_CERT, forge.pki.certificateToPem(caCert)); + fs.writeFileSync(CA_KEY, forge.pki.privateKeyToPem(caKeys.privateKey)); + fs.writeFileSync(SIGNED_CERT, forge.pki.certificateToPem(cert)); + fs.writeFileSync(SIGNED_KEY, forge.pki.privateKeyToPem(keys.privateKey)); +} + +/** + * Create a test DXT file (just a simple ZIP) + */ +function createTestDxt() { + // Create a simple ZIP file content + // This is a minimal valid ZIP with one file + const zipContent = Buffer.from([ + 0x50, + 0x4b, + 0x03, + 0x04, // Local file header signature + 0x14, + 0x00, // Version needed + 0x00, + 0x00, // Flags + 0x00, + 0x00, // Compression method (stored) + 0x00, + 0x00, // Last mod time + 0x00, + 0x00, // Last mod date + 0x00, + 0x00, + 0x00, + 0x00, // CRC-32 + 0x0d, + 0x00, + 0x00, + 0x00, // Compressed size + 0x0d, + 0x00, + 0x00, + 0x00, // Uncompressed size + 0x0c, + 0x00, // Filename length + 0x00, + 0x00, // Extra field length + // Filename: "manifest.json" + 0x6d, + 0x61, + 0x6e, + 0x69, + 0x66, + 0x65, + 0x73, + 0x74, + 0x2e, + 0x6a, + 0x73, + 0x6f, + 0x6e, + // File content: '{"test":true}' + 0x7b, + 0x22, + 0x74, + 0x65, + 0x73, + 0x74, + 0x22, + 0x3a, + 0x74, + 0x72, + 0x75, + 0x65, + 0x7d, + // Central directory + 0x50, + 0x4b, + 0x01, + 0x02, // Central directory signature + 0x14, + 0x00, // Version made by + 0x14, + 0x00, // Version needed + 0x00, + 0x00, // Flags + 0x00, + 0x00, // Compression method + 0x00, + 0x00, // Last mod time + 0x00, + 0x00, // Last mod date + 0x00, + 0x00, + 0x00, + 0x00, // CRC-32 + 0x0d, + 0x00, + 0x00, + 0x00, // Compressed size + 0x0d, + 0x00, + 0x00, + 0x00, // Uncompressed size + 0x0c, + 0x00, // Filename length + 0x00, + 0x00, // Extra field length + 0x00, + 0x00, // File comment length + 0x00, + 0x00, // Disk number + 0x00, + 0x00, // Internal attributes + 0x00, + 0x00, + 0x00, + 0x00, // External attributes + 0x00, + 0x00, + 0x00, + 0x00, // Offset of local header + // Filename: "manifest.json" + 0x6d, + 0x61, + 0x6e, + 0x69, + 0x66, + 0x65, + 0x73, + 0x74, + 0x2e, + 0x6a, + 0x73, + 0x6f, + 0x6e, + // End of central directory + 0x50, + 0x4b, + 0x05, + 0x06, // End of central directory signature + 0x00, + 0x00, // Disk number + 0x00, + 0x00, // Start disk + 0x01, + 0x00, // Number of central directory records on this disk + 0x01, + 0x00, // Total number of central directory records + 0x3a, + 0x00, + 0x00, + 0x00, // Size of central directory + 0x34, + 0x00, + 0x00, + 0x00, // Offset of central directory + 0x00, + 0x00, // Comment length + ]); + + fs.writeFileSync(TEST_DXT, zipContent); +} + +/** + * Test signing with self-signed certificate + */ +async function testSelfSignedSigning() { + // Create a copy for this test + const testFile = path.join(TEST_DIR, "test-self-signed.dxt"); + fs.copyFileSync(TEST_DXT, testFile); + + // Sign the file + expect(() => + signDxtFile(testFile, SELF_SIGNED_CERT, SELF_SIGNED_KEY), + ).not.toThrow(); + + // Verify the signature + const result = await verifyDxtFile(testFile); + + // Self-signed certs may not be trusted by OS, so we accept either status + expect(["self-signed", "unsigned"]).toContain(result.status); + + // Clean up + fs.unlinkSync(testFile); +} + +/** + * Test signing with CA-signed certificate + */ +async function testCASignedSigning() { + // Create a copy for this test + const testFile = path.join(TEST_DIR, "test-ca-signed.dxt"); + fs.copyFileSync(TEST_DXT, testFile); + + // Sign the file with intermediate + expect(() => + signDxtFile(testFile, SIGNED_CERT, SIGNED_KEY, [CA_CERT]), + ).not.toThrow(); + + // Verify the signature + const result = await verifyDxtFile(testFile); + + // CA-signed status depends on whether test CA is trusted by OS + expect(["signed", "unsigned"]).toContain(result.status); + + // Clean up + fs.unlinkSync(testFile); +} + +/** + * Test tampering detection + */ +async function testTamperingDetection() { + // Create a copy and sign it + const testFile = path.join(TEST_DIR, "test-tampered.dxt"); + fs.copyFileSync(TEST_DXT, testFile); + signDxtFile(testFile, SELF_SIGNED_CERT, SELF_SIGNED_KEY); + + // Read the signed file + const signedContent = fs.readFileSync(testFile); + + // Tamper with the content (change a byte in the ZIP portion) + const tamperedContent = Buffer.from(signedContent); + tamperedContent[10] = (tamperedContent[10] + 1) % 256; + fs.writeFileSync(testFile, tamperedContent); + + // Try to verify - should fail + const result = await verifyDxtFile(testFile); + expect(result.status).toBe("unsigned"); + + // Clean up + fs.unlinkSync(testFile); +} + +/** + * Test unsigned file verification + */ +async function testUnsignedFile() { + const result = await verifyDxtFile(TEST_DXT); + expect(result.status).toBe("unsigned"); +} + +/** + * Test signature removal + */ +async function testSignatureRemoval() { + // Create a copy and sign it + const testFile = path.join(TEST_DIR, "test-remove-sig.dxt"); + fs.copyFileSync(TEST_DXT, testFile); + signDxtFile(testFile, SELF_SIGNED_CERT, SELF_SIGNED_KEY); + + // Verify it's signed (or at least has signature data) + await verifyDxtFile(testFile); + + // Remove signature + expect(() => unsignDxtFile(testFile)).not.toThrow(); + + // Verify it's unsigned + const afterResult = await verifyDxtFile(testFile); + expect(afterResult.status).toBe("unsigned"); + + // Clean up + fs.unlinkSync(testFile); +} + +describe("DXT Signing E2E Tests", () => { + beforeAll(() => { + // Ensure test directory exists + if (!fs.existsSync(TEST_DIR)) { + fs.mkdirSync(TEST_DIR, { recursive: true }); + } + + // Setup + generateSelfSignedCert(); + generateCASignedCert(); + createTestDxt(); + }); + + afterAll(() => { + // Cleanup + try { + fs.rmSync(TEST_DIR, { recursive: true, force: true }); + } catch (e) { + // Ignore cleanup errors + } + }); + + it("should sign and verify with self-signed certificate", async () => { + await testSelfSignedSigning(); + }); + + it("should sign and verify with CA-signed certificate", async () => { + await testCASignedSigning(); + }); + + it("should detect tampering", async () => { + await testTamperingDetection(); + }); + + it("should identify unsigned files", async () => { + await testUnsignedFile(); + }); + + it("should remove signatures", async () => { + await testSignatureRemoval(); + }); +}); diff --git a/test/valid-manifest.json b/test/valid-manifest.json new file mode 100644 index 0000000..a472aa6 --- /dev/null +++ b/test/valid-manifest.json @@ -0,0 +1,19 @@ +{ + "dxt_version": "1.0", + "name": "test-extension", + "display_name": "Test Extension", + "version": "1.0.0", + "description": "A test DXT extension", + "author": { + "name": "Test Author", + "email": "test@example.com" + }, + "server": { + "type": "node", + "entry_point": "server/index.js", + "mcp_config": { + "command": "node", + "args": ["${__dirname}/server/index.js"] + } + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c7cf40d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Default", + "compilerOptions": { + "target": "es2024", + "lib": ["ES2023"], + + "module": "es2022", + "moduleResolution": "node", + "esModuleInterop": true, + + // Path settings + "rootDir": "./src", + "outDir": "./dist", + + // Type checking + "strict": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + + // Emit settings + "declaration": true, + "noEmit": false, + "inlineSources": false, + "isolatedModules": false, + + // Other settings + "allowJs": true, + "resolveJsonModule": true, + "incremental": true, + "preserveWatchOutput": true, + "types": ["node", "jest"] + }, + "include": ["src/**/*.ts", "src/*.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/tsconfig.test.json b/tsconfig.test.json new file mode 100644 index 0000000..f85ef0c --- /dev/null +++ b/tsconfig.test.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": true, + "module": "es2022", + "moduleResolution": "node" + }, + "include": ["src/**/*.ts", "test/**/*.ts"] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..4a94d3c --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4051 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.27.1": + 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#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== + dependencies: + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.27.2": + version "7.27.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/compat-data/-/compat-data-7.27.2.tgz#4183f9e642fd84e74e3eea7ffa93a412e3b102c9" + integrity sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": + version "7.27.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/core/-/core-7.27.4.tgz#cc1fc55d0ce140a1828d1dd2a2eba285adbfb3ce" + integrity sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.3" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.27.3" + "@babel/helpers" "^7.27.4" + "@babel/parser" "^7.27.4" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.27.4" + "@babel/types" "^7.27.3" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.27.3", "@babel/generator@^7.7.2": + version "7.27.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/generator/-/generator-7.27.3.tgz#ef1c0f7cfe3b5fc8cbb9f6cc69f93441a68edefc" + integrity sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q== + dependencies: + "@babel/parser" "^7.27.3" + "@babel/types" "^7.27.3" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.27.2": + 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#46a0f6efab808d51d29ce96858dd10ce8732733d" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== + 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" + +"@babel/helper-module-imports@^7.27.1": + 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#7ef769a323e2655e126673bb6d2d6913bbead204" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.27.3": + 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#db0bbcfba5802f9ef7870705a7ef8788508ede02" + integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.3" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": + 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#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + +"@babel/helper-string-parser@^7.27.1": + 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#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.27.1": + 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#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/helper-validator-option@^7.27.1": + 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#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helpers@7.27.1", "@babel/helpers@^7.27.4": + version "7.27.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/helpers/-/helpers-7.27.1.tgz#ffc27013038607cdba3288e692c3611c06a18aa4" + integrity sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ== + dependencies: + "@babel/template" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/parser@7.27.3", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.27.2", "@babel/parser@^7.27.3", "@babel/parser@^7.27.4": + version "7.27.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/parser/-/parser-7.27.3.tgz#1b7533f0d908ad2ac545c4d05cbe2fb6dc8cfaaf" + integrity sha512-xyYxRj6+tLNDTWi0KCBcZ9V7yg3/lwL9DWh9Uwh/RIVlIfFidggcgxKX3GCXwCiswwcGRawBKbEg2LG/Y8eJhw== + dependencies: + "@babel/types" "^7.27.3" + +"@babel/plugin-syntax-async-generators@^7.8.4": + 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#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha1-qYP7Gusuw/btBCohD2QOkOeG/g0= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + 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#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha1-TJpvZp9dDN8bkKFnHpoUa+UwDOo= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + 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#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA= + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + 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#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha1-GV34mxRrS3izv4l/16JXyEZZ1AY= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-import-attributes@^7.24.7": + 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#b4f9ea95a79e6912480c4b626739f86a076624ca" + integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + +"@babel/plugin-syntax-import-meta@^7.10.4": + 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#ee601348c370fa334d2207be158777496521fd51" + integrity sha1-7mATSMNw+jNNIge+FYd3SWUh/VE= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + 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#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.7.2": + 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#a34313a178ea56f1951599b929c1ceacee719290" + integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + 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#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha1-ypHvRjA1MESLkGZSusLp/plB9pk= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + 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#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + 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#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + 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#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + 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#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha1-YRGiZbz7Ag6579D9/X0mQCue1sE= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + 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#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + 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#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha1-DcZnHsDqIrbpShEU+FeXDNOd4a0= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + 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#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw= + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + 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#67dda2b74da43727cf21d46cf9afef23f4365399" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/template@^7.27.1", "@babel/template@^7.27.2", "@babel/template@^7.3.3": + version "7.27.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.27.4": + version "7.27.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/traverse/-/traverse-7.27.4.tgz#b0045ac7023c8472c3d35effd7cc9ebd638da6ea" + integrity sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.3" + "@babel/parser" "^7.27.4" + "@babel/template" "^7.27.2" + "@babel/types" "^7.27.3" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.3.3": + version "7.27.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@babel/types/-/types-7.27.3.tgz#c0257bedf33aad6aad1f406d35c44758321eb3ec" + integrity sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + +"@bcoe/v8-coverage@^0.2.3": + 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#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha1-daLotRy3WKdVPWgEpZMteqznXDk= + +"@eslint-community/eslint-utils@^4.2.0": + version "4.7.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" + integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.12.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@eslint/eslintrc/2.1.4/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha1-OIomnw8lwbatwxe1osVXFIlMcK0= + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== + +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== + dependencies: + "@humanwhocodes/object-schema" "^2.0.3" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@humanwhocodes/object-schema/2.0.3/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha1-Siho111taWPkI7z5C3/RvjQ0CdM= + +"@inquirer/checkbox@^3.0.1": + version "3.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@inquirer/checkbox/-/checkbox-3.0.1.tgz#0a57f704265f78c36e17f07e421b98efb4b9867b" + integrity sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ== + dependencies: + "@inquirer/core" "^9.2.1" + "@inquirer/figures" "^1.0.6" + "@inquirer/type" "^2.0.0" + ansi-escapes "^4.3.2" + yoctocolors-cjs "^2.1.2" + +"@inquirer/confirm@^4.0.1": + version "4.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@inquirer/confirm/-/confirm-4.0.1.tgz#9106d6bffa0b2fdd0e4f60319b6f04f2e06e6e25" + integrity sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w== + dependencies: + "@inquirer/core" "^9.2.1" + "@inquirer/type" "^2.0.0" + +"@inquirer/core@^9.2.1": + version "9.2.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@inquirer/core/-/core-9.2.1.tgz#677c49dee399c9063f31e0c93f0f37bddc67add1" + integrity sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg== + dependencies: + "@inquirer/figures" "^1.0.6" + "@inquirer/type" "^2.0.0" + "@types/mute-stream" "^0.0.4" + "@types/node" "^22.5.5" + "@types/wrap-ansi" "^3.0.0" + ansi-escapes "^4.3.2" + cli-width "^4.1.0" + mute-stream "^1.0.0" + signal-exit "^4.1.0" + strip-ansi "^6.0.1" + wrap-ansi "^6.2.0" + yoctocolors-cjs "^2.1.2" + +"@inquirer/editor@^3.0.1": + version "3.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@inquirer/editor/-/editor-3.0.1.tgz#d109f21e050af6b960725388cb1c04214ed7c7bc" + integrity sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q== + dependencies: + "@inquirer/core" "^9.2.1" + "@inquirer/type" "^2.0.0" + external-editor "^3.1.0" + +"@inquirer/expand@^3.0.1": + version "3.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@inquirer/expand/-/expand-3.0.1.tgz#aed9183cac4d12811be47a4a895ea8e82a17e22c" + integrity sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ== + dependencies: + "@inquirer/core" "^9.2.1" + "@inquirer/type" "^2.0.0" + yoctocolors-cjs "^2.1.2" + +"@inquirer/figures@^1.0.6": + version "1.0.11" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@inquirer/figures/-/figures-1.0.11.tgz#4744e6db95288fea1dead779554859710a959a21" + integrity sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw== + +"@inquirer/input@^3.0.1": + version "3.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@inquirer/input/-/input-3.0.1.tgz#de63d49e516487388508d42049deb70f2cb5f28e" + integrity sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg== + dependencies: + "@inquirer/core" "^9.2.1" + "@inquirer/type" "^2.0.0" + +"@inquirer/number@^2.0.1": + version "2.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@inquirer/number/-/number-2.0.1.tgz#b9863080d02ab7dc2e56e16433d83abea0f2a980" + integrity sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ== + dependencies: + "@inquirer/core" "^9.2.1" + "@inquirer/type" "^2.0.0" + +"@inquirer/password@^3.0.1": + version "3.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@inquirer/password/-/password-3.0.1.tgz#2a9a9143591088336bbd573bcb05d5bf080dbf87" + integrity sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ== + dependencies: + "@inquirer/core" "^9.2.1" + "@inquirer/type" "^2.0.0" + ansi-escapes "^4.3.2" + +"@inquirer/prompts@^6.0.1": + version "6.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@inquirer/prompts/-/prompts-6.0.1.tgz#43f5c0ed35c5ebfe52f1d43d46da2d363d950071" + integrity sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A== + dependencies: + "@inquirer/checkbox" "^3.0.1" + "@inquirer/confirm" "^4.0.1" + "@inquirer/editor" "^3.0.1" + "@inquirer/expand" "^3.0.1" + "@inquirer/input" "^3.0.1" + "@inquirer/number" "^2.0.1" + "@inquirer/password" "^3.0.1" + "@inquirer/rawlist" "^3.0.1" + "@inquirer/search" "^2.0.1" + "@inquirer/select" "^3.0.1" + +"@inquirer/rawlist@^3.0.1": + version "3.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@inquirer/rawlist/-/rawlist-3.0.1.tgz#729def358419cc929045f264131878ed379e0af3" + integrity sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ== + dependencies: + "@inquirer/core" "^9.2.1" + "@inquirer/type" "^2.0.0" + yoctocolors-cjs "^2.1.2" + +"@inquirer/search@^2.0.1": + version "2.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@inquirer/search/-/search-2.0.1.tgz#69b774a0a826de2e27b48981d01bc5ad81e73721" + integrity sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg== + dependencies: + "@inquirer/core" "^9.2.1" + "@inquirer/figures" "^1.0.6" + "@inquirer/type" "^2.0.0" + yoctocolors-cjs "^2.1.2" + +"@inquirer/select@^3.0.1": + version "3.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@inquirer/select/-/select-3.0.1.tgz#1df9ed27fb85a5f526d559ac5ce7cc4e9dc4e7ec" + integrity sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q== + dependencies: + "@inquirer/core" "^9.2.1" + "@inquirer/figures" "^1.0.6" + "@inquirer/type" "^2.0.0" + ansi-escapes "^4.3.2" + yoctocolors-cjs "^2.1.2" + +"@inquirer/type@^2.0.0": + version "2.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@inquirer/type/-/type-2.0.0.tgz#08fa513dca2cb6264fe1b0a2fabade051444e3f6" + integrity sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag== + dependencies: + mute-stream "^1.0.0" + +"@istanbuljs/load-nyc-config@^1.0.0": + 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#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha1-/T2x1Z7PfPEh6AZQu4ZxL5tV7O0= + 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" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + 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#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha1-5F44TkuOwWvOL9kDr3hFD2v37Jg= + +"@jest/console@^29.7.0": + 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#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha1-zUgi29uEUpJlxaK9tSmjycyVD/w= + 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" + +"@jest/core@^29.7.0": + 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#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha1-tszMI58w/zZglljFpeIpF1fORI8= + 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" + +"@jest/environment@^29.7.0": + 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#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha1-JNYfVP8feG881Ac7S5RBY4O68qc= + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.7.0": + 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#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha1-Aj7+XSaopw8hZ30KGvwPCkTjocY= + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.7.0": + 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#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha1-dqPtsMt1O3Dfv+Iyg1ENPUVDK/I= + dependencies: + expect "^29.7.0" + jest-snapshot "^29.7.0" + +"@jest/fake-timers@^29.7.0": + 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#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha1-/ZG/H/+xbX0NJKQmqxpHpJiBpWU= + 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" + +"@jest/globals@^29.7.0": + 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#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha1-jZKQ+exH/3cmB/qGTKHVou+uHU0= + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + 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#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha1-BLJi7LO4+qg7Cz0yFiOXI5Po9Mc= + 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" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.3": + 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#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha1-2Quncglc83o0peuUE/G1YqCFVMQ= + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + 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#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha1-jbmoCqGgl7siYlcmhnNLrtmxZXw= + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + 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#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha1-bO+XfOHTmDSjrqiHoXJmKKbwcs4= + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + 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#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha1-3y3Zw0bH13aLigZjmZRkDGQuKEw= + 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" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + 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" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + 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#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pkgr/core@^0.2.3": + version "0.2.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@pkgr/core/-/core-0.2.4.tgz#d897170a2b0ba51f78a099edccd968f7b103387c" + integrity sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw== + +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + +"@sinclair/typebox@^0.27.8": + 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#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha1-Zmf6wWxDa1Q0o4ejTe2wExmPbm4= + +"@sinonjs/commons@^3.0.0": + 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#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha1-ECk1fkTKkBphVYX20nc428iQhM0= + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + 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#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha1-Vf3/Hsq581QBkSna9N8N1Nkj6mY= + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@types/babel__core@^7.1.14": + 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#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@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#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha1-+DbGH0ixNG59Kw2TxtrMW5U106s= + dependencies: + "@babel/types" "^7.0.0" + +"@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#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha1-VnJRNwHBshmbxtrWNqnXSRWGdm8= + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + 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#968cdc2366ec3da159f61166428ee40f370e56c2" + integrity sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng== + dependencies: + "@babel/types" "^7.20.7" + +"@types/graceful-fs@^4.1.3": + 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#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + 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#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@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#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha1-UwR2FK5y4Z/AQB2HLeOuK0zjUL8= + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + 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#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^29.5.14": + version "29.5.14" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" + integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/json5/0.0.29/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/mute-stream@^0.0.4": + version "0.0.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/mute-stream/-/mute-stream-0.0.4.tgz#77208e56a08767af6c5e1237be8888e2f255c478" + integrity sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow== + dependencies: + "@types/node" "*" + +"@types/node-forge@1.3.11": + version "1.3.11" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@^22.15.3", "@types/node@^22.5.5": + version "22.15.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/node/-/node-22.15.3.tgz#b7fb9396a8ec5b5dfb1345d8ac2502060e9af68b" + integrity sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw== + dependencies: + undici-types "~6.21.0" + +"@types/semver@^7.3.12": + version "7.7.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/semver/-/semver-7.7.0.tgz#64c441bdae033b378b6eef7d0c3d77c329b9378e" + integrity sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA== + +"@types/stack-utils@^2.0.0": + 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#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha1-YgkyHrLBcSp+dGZCK4yx/A2d1dg= + +"@types/wrap-ansi@^3.0.0": + version "3.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd" + integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== + +"@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#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha1-gV4wt4bS6PDc2F/VvPXhoE0AjxU= + +"@types/yargs@^17.0.8": + version "17.0.33" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.62.0": + version "5.62.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@typescript-eslint/eslint-plugin/5.62.0/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha1-ru8DKNFyueN9m6ttvBO4ftiJd9s= + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.62.0": + version "5.62.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@typescript-eslint/parser/5.62.0/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha1-G2PQgthJovyuilaSSPvi7huKVsc= + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@typescript-eslint/scope-manager/5.62.0/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha1-2UV8zGoLjWs30OslKiMCJHjFRgw= + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@typescript-eslint/type-utils/5.62.0/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha1-KG8DicQWgTds2tlrMJzt0X1wNGo= + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@typescript-eslint/types/5.62.0/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha1-JYYH5g7/ownwZ2CJMcPfb+1B/S8= + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@typescript-eslint/typescript-estree/5.62.0/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha1-fRd5S3f6vKxhXWpI+xQzMNli65s= + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@typescript-eslint/utils/5.62.0/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha1-FB6AnHFjbkp12qOfrtL7X0sQ34Y= + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@typescript-eslint/visitor-keys/5.62.0/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha1-IXQBGRfOWCh1lU/+L2kS1ZMeNT4= + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@ungap/structured-clone@^1.2.0": + version "1.3.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.9.0: + version "8.14.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" + integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.2: + version "4.3.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + +array-includes@^3.1.8: + version "3.1.8" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/array-includes/3.1.8/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha1-XjcMvhcv3V3WUwwdSq3aJSgbqX0= + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/array-union/2.1.0/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha1-t5hCCtvrHego2ErNii4j0+/oXo0= + +array.prototype.findlastindex@^1.2.5: + version "1.2.5" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/array.prototype.findlastindex/1.2.5/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha1-jDWnVccpCHGUU/hxRcoBHjkzTQ0= + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/array.prototype.flat/1.3.2/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha1-FHYhffjP8X1y7o87oGc421s4fRg= + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" + +async@^3.2.3: + version "3.2.6" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/available-typed-arrays/1.0.7/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha1-pcw3XWoDwu/IelU/PgsVIt7xSEY= + dependencies: + possible-typed-array-names "^1.0.0" + +babel-jest@^29.7.0: + 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#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha1-9DaZGSJbaExWCFmYrGPb0FvgINU= + 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" + +babel-plugin-istanbul@^6.1.1: + 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#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha1-+ojsWSMv2bTjbbvFQKjsmptH2nM= + 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" + +babel-plugin-jest-hoist@^29.6.3: + 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#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha1-qtvpQ0ZBgqiSLDySfDBn/0DSRiY= + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + 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#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== + 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" + +babel-preset-jest@^29.6.3: + 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#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha1-+gX6UQ59STiW17DdIDNgHIQPFxw= + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3: + version "3.0.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.24.0: + version "4.25.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/browserslist/-/browserslist-4.25.0.tgz#986aa9c6d87916885da2b50d8eb577ac8d133b2c" + integrity sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA== + dependencies: + caniuse-lite "^1.0.30001718" + electron-to-chromium "^1.5.160" + node-releases "^2.0.19" + update-browserslist-db "^1.1.3" + +bs-logger@^0.2.6: + version "0.2.6" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/buffer-from/1.1.2/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U= + +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + 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#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.2, call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + 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#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA= + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001718: + version "1.0.30001720" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/caniuse-lite/-/caniuse-lite-1.0.30001720.tgz#c138cb6026d362be9d8d7b0e4bcd0183a850edfd" + integrity sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g== + +chalk@^4.0.0, chalk@^4.0.2: + version "4.1.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + 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#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha1-10Q1giYhf5ge1Y9Hmx1rzClUXc8= + +chardet@^0.7.0: + version "0.7.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/chardet/0.7.0/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha1-kAlISfCTfy7twkJdDSip5fDLrZ4= + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +cjs-module-lexer@^1.0.0: + 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#0f79731eb8cfe1ec72acd4066efac9d61991b00d" + integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== + +cli-width@^4.1.0: + version "4.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +co@^4.6.0: + 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#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +collect-v8-coverage@^1.0.0: + 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#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha1-wLKbzTO80HeaE0TCE2BR5q/T2ek= + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^13.1.0: + version "13.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46" + integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^2.0.0: + 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#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +create-jest@^29.7.0: + 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#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha1-o1XFs8seGvAroXf+ev1/7uSaUyA= + 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" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.6" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@^3.2.7: + version "3.2.7" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/debug/3.2.7/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o= + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.4.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + +dedent@^1.0.0: + version "1.6.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/dedent/-/dedent-1.6.0.tgz#79d52d6389b1ffa67d2bcef59ba51847a9d503b2" + integrity sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/deepmerge/4.3.1/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha1-RLXyFHzTsA1LVhN2hZZvJv0l3Uo= + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +detect-newline@^3.0.0: + 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#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha1-V29d/GOuGhkv8ZLYrTr2MImRtlE= + +diff-sequences@^29.6.3: + 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#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha1-Ter4lNEUB8Ue/IQYAS+ecLhOqSE= + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/dir-glob/3.0.1/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8= + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/doctrine/2.1.0/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha1-XNAfwQFiG0LEzX9dGmYkNxbT850= + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +ejs@^3.1.10: + 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#69ab8358b14e896f80cc39e62087b88500c3ac3b" + integrity sha1-aauDWLFOiW+AzDnmIIe4hQDDrDs= + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.5.160: + version "1.5.160" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/electron-to-chromium/-/electron-to-chromium-1.5.160.tgz#243fa46b82563dbce23812d73b196d5a21cba3eb" + integrity sha512-8yQk54/CoCQT8GX3zuxqPBwMAQuIr6dWI/qO8Aah/JAZwB5XmCbEElsqb1n4pzc2vpkTdfc/kbyNPJOjswfbgg== + +emittery@^0.13.1: + 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#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha1-wEuMNFdJDghHrlH87Tr1LTOOPa0= + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enhanced-resolve@^5.12.0: + version "5.18.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz#728ab082f8b7b6836de51f1637aab5d3b9568faf" + integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.22.1, es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9: + version "1.23.9" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-abstract/-/es-abstract-1.23.9.tgz#5b45994b7de78dada5c1bebf1379646b32b9d606" + integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.3" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.2.7" + get-proto "^1.0.0" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" + is-callable "^1.2.7" + is-data-view "^1.0.2" + is-regex "^1.2.1" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.0" + math-intrinsics "^1.1.0" + object-inspect "^1.13.3" + object-keys "^1.1.1" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.3" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.18" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + 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#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + 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#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-shim-unscopables/1.0.2/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha1-H2lC5x7MeDXtHIqDAG2HcaY6N2M= + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== + dependencies: + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/escape-string-regexp/2.0.0/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha1-owME6Z2qMuI7L9IPUbq9B8/8o0Q= + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.10.0: + version "8.10.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eslint-config-prettier/8.10.0/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha1-OgamYhMIB+JQL8P/i0FD2KBljhE= + +eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eslint-import-resolver-node/0.3.9/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha1-1OqsUrii58PNGQPrAPfgUzVhGKw= + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-import-resolver-typescript@^3.6.1: + version "3.6.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eslint-import-resolver-typescript/3.6.1/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + integrity sha1-e5g2gO3T8cW84aWCmuC8LVf+nvo= + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + fast-glob "^3.3.1" + get-tsconfig "^4.5.0" + is-core-module "^2.11.0" + is-glob "^4.0.3" + +eslint-module-utils@^2.12.0, eslint-module-utils@^2.7.4: + version "2.12.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" + integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.29.1: + version "2.31.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" + integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== + dependencies: + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.12.0" + hasown "^2.0.2" + is-core-module "^2.15.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" + semver "^6.3.1" + string.prototype.trimend "^1.0.8" + tsconfig-paths "^3.15.0" + +eslint-plugin-prettier@^5.1.3: + version "5.2.6" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.6.tgz#be39e3bb23bb3eeb7e7df0927cdb46e4d7945096" + integrity sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ== + dependencies: + prettier-linter-helpers "^1.0.0" + synckit "^0.11.0" + +eslint-plugin-simple-import-sort@^10.0.0: + version "10.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eslint-plugin-simple-import-sort/10.0.0/eslint-plugin-simple-import-sort-10.0.0.tgz#cc4ceaa81ba73252427062705b64321946f61351" + integrity sha1-zEzqqBunMlJCcGJwW2QyGUb2E1E= + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eslint-scope/5.1.1/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw= + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eslint-scope/7.2.2/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha1-3rT5JWM5DzIAaJSvYqItuhxGQj8= + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8.43.0: + version "8.57.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/espree/9.6.1/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha1-oqF7jkNGkKVDLy+AGM5x0zGkjG8= + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.6.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/estraverse/4.3.0/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0= + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^5.0.0: + version "5.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/execa/5.1.1/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha1-+ArZy/Qpj3vR1MlVXCHpN0HEEd0= + dependencies: + 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" + +exit@^0.1.2: + 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#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expect@^29.0.0, expect@^29.7.0: + 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#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha1-V4h0WQ3LMhRRQITAgRXYruYeEbw= + dependencies: + "@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" + +external-editor@^3.1.0: + version "3.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + 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#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fast-diff/1.3.0/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha1-7OQH+lUKZNY4U2zXJ+EpxhYW4PA= + +fast-glob@^3.2.9, fast-glob@^3.3.1: + version "3.3.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + 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#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.19.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fflate@^0.8.2: + version "0.8.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" + integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/file-entry-cache/6.0.1/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha1-IRst2WWcsDlLBz5zI6w8kz1SICc= + dependencies: + flat-cache "^3.0.4" + +filelist@^1.0.4: + 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#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha1-94l4oelEd1/55i50RCTyFeWDUrU= + dependencies: + minimatch "^5.0.1" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^4.0.0, find-up@^4.1.0: + 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#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk= + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/flat-cache/3.2.0/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha1-LAwtUEDJmxYydxqdEFclwBFTY+4= + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.9: + version "3.3.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2: + version "2.3.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/functions-have-names/1.2.3/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha1-BAT+TuK6L2B/Dg7DyAuumUEzuDQ= + +gensync@^1.0.0-beta.2: + 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#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + 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#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + 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" + +get-package-type@^0.1.0: + 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#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha1-jeLYA8/0TfO8bEVuZmizbDkm4Ro= + +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-stream/6.0.1/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha1-omLY7vZ6ztV8KFKtYWdSakPL97c= + +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + +get-tsconfig@^4.5.0: + version "4.10.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/get-tsconfig/-/get-tsconfig-4.10.0.tgz#403a682b373a823612475a4c2928c7326fc0f6bb" + integrity sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A== + dependencies: + resolve-pkg-maps "^1.0.0" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + 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" + +globals@^11.1.0: + version "11.12.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.24.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.4: + version "1.0.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +globby@^11.1.0: + version "11.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/globby/11.1.0/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha1-vUvpi7BC+D15b344EZkfvoKg00s= + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/graphemer/1.4.0/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha1-+y8dVeDjoYSa7/yQxPoN1ToOZsY= + +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.2.0: + version "1.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.0, hasown@^2.0.2: + version "2.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +html-escaper@^2.0.0: + 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#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha1-39YAJ9o2o238viNiYsAKWCJoFFM= + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/human-signals/2.1.0/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha1-3JH8ukLk0G5Kuu0zs+ejwC9RTqA= + +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/iconv-lite/0.4.24/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^5.2.0: + version "5.3.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +import-fresh@^3.2.1: + version "3.3.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" + +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-arrayish/0.2.1/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-async-function/2.0.0/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha1-jkQY79Pl06brsBZMBe9a+2mqlkY= + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-callable/1.2.7/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha1-O8KoXqdC2eNiBdys3XLKH9xRsFU= + +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.16.0: + 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#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== + dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" + +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + +is-fullwidth-code-point@^3.0.0: + 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#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + 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#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha1-fRQK3DiarzARqPKipM+m+q3/sRg= + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-generator-function/1.0.10/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha1-8VWLrxrBfg3up8BBXEODUf8rPHI= + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.3: + version "2.0.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-map/2.0.3/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha1-7elrf+HicLPERl46RlZYdkkm1i4= + +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-path-inside/3.0.3/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha1-0jE2LlOgf/Kw4Op/7QSRYf/RYoM= + +is-regex@^1.2.1: + version "1.2.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-set/2.0.3/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha1-irIJ6kJGCBQTct7W4MsgDvHZ0B0= + +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== + dependencies: + call-bound "^1.0.3" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.7, is-string@^1.1.1: + version "1.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== + dependencies: + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" + +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: + version "1.1.15" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-weakmap/2.0.2/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha1-v3JhXWSd/l9pkHnFS4PkfRrhnP0= + +is-weakref@^1.0.2, is-weakref@^1.1.0: + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-weakref/-/is-weakref-1.1.0.tgz#47e3472ae95a63fa9cf25660bcf0c181c39770ef" + integrity sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q== + dependencies: + call-bound "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/is-weakset/2.0.3/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha1-6AFRnfjAxD4S/yg07q2E7J5iQAc= + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/isarray/2.0.5/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha1-ivHkwSISRMxiRZ+vOJQNTmRKVyM= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + 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#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha1-LRZsSwZE1Do58Ev2wu3R5YXzF1Y= + +istanbul-lib-instrument@^5.0.4: + 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#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha1-0QyIhcISVXThwjHKyt+VVnXhzj0= + 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" + +istanbul-lib-instrument@^6.0.0: + 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#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + dependencies: + "@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" + +istanbul-lib-report@^3.0.0: + 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#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha1-kIMFusmlvRdaxqdEier9D8JEWn0= + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + 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#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha1-iV86cJ/PujTG3lpCk5Ai8+Q1hVE= + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + 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#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha1-2u0SueHcpRjhXAVuHlN+dBKA+gs= + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jake@^10.8.5: + version "10.9.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-changed-files@^29.7.0: + 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#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha1-HAbQfnfHjhWF0CBCTe3BDW4XrDo= + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + 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#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha1-toF6RfzINdixbVli0MAmRz7jZoo= + 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" + +jest-cli@^29.7.0: + 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#5592c940798e0cae677eec169264f2d839a37995" + integrity sha1-VZLJQHmODK5nfuwWkmTy2DmjeZU= + dependencies: + "@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" + +jest-config@^29.7.0: + 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#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha1-vL2ogG28wBseMWpGu3QIWoSwJF8= + 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" + +jest-diff@^29.7.0: + 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#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha1-AXk0pm67fs9vIF6EaZvhCv1wRYo= + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + 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#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha1-j922rcPNyVXJPiqH9hz9NQ1dEZo= + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + 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#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha1-FiqbPyMovdmRvqq/+7dHReVld9E= + dependencies: + "@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" + +jest-environment-node@^29.7.0: + 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#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha1-C5PhEd2o7BILyDAObR+5V24WQ3Y= + 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" + +jest-get-type@^29.6.3: + 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#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.7.0: + 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#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@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" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.7.0: + 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#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha1-W37A2t/f7Ayjg9yaoBbTa16kxyg= + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^29.7.0: + 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#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha1-ro/sef8kn9WSzoDj7kdOg6bETxI= + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + 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#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha1-i8OS4gTpXf51ZKu+cqQE4o5R9/M= + 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" + +jest-mock@^29.7.0: + 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#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha1-ToNs9g6Zxvz6vp+Z0Bfz/dUKY0c= + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + 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#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + 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#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + 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#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha1-GwTywJXzf8d2/0CAPckpIbHohCg= + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + 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" + +jest-runner@^29.7.0: + 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#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha1-gJrwctQIpT3P0uhJpMl20xMvcY4= + 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" + +jest-runtime@^29.7.0: + 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#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha1-7+yzFBz303Z6OgzI98mZBYfT2Bc= + 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" + +jest-snapshot@^29.7.0: + 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#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha1-wsV0w/UYZdobsykDZ3imm/iKa+U= + 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" + +jest-util@^29.0.0, jest-util@^29.7.0: + version "29.7.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + 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" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@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" + +jest-watcher@^29.7.0: + 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#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha1-eBDTDWGcOmIJMiPOa7NZyhsoovI= + dependencies: + "@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" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.7.0: + version "29.7.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== + dependencies: + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + 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#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/json-schema-traverse/0.4.1/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/json5/1.0.2/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha1-Y9mNYPIbMTt3xNbaGL+mnYDh1ZM= + dependencies: + minimist "^1.2.0" + +json5@^2.2.3: + version "2.2.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +keyv@^4.5.3: + version "4.5.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/kleur/3.0.3/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha1-p5yezIbuHOP6YgbRIWxQHxR/wH4= + +leven@^3.1.0: + version "3.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + 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#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^5.0.0: + 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#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha1-Gvujlq/WdqbUJQTQpno6frn2KqA= + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^4.0.0: + 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#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha1-w8IwencSd82WODBfkVwprnQbYU4= + dependencies: + semver "^7.5.3" + +make-error@^1.3.6: + version "1.3.6" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4, micromatch@^4.0.8: + version "4.0.8" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mute-stream@^1.0.0: + version "1.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/natural-compare-lite/1.4.0/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha1-F7CVgZiJef3a/gIB6TG6kzyWy7Q= + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-forge@^1.3.1: + version "1.3.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/node-forge/1.3.1/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha1-vo2iryQ7JBfV9kancGY6krfp3tM= + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.19: + version "2.0.19" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/npm-run-path/4.0.1/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha1-t+zR5e1T2o43pV4cImnguX7XSOo= + dependencies: + path-key "^3.0.0" + +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.7: + version "4.1.7" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/object.fromentries/2.0.8/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha1-9xldipuXvZXLwZmeqTns0aKwDGU= + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.3: + version "1.0.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/object.groupby/1.0.3/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha1-mxJcNiOBKfb3thlUoecXYUjVAC4= + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.values@^1.2.0: + version "1.2.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +once@^1.3.0: + version "1.4.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.3: + version "0.9.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/os-tmpdir/1.0.2/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +own-keys@^1.0.1: + version "1.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/p-limit/2.3.0/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE= + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + 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#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha1-o0KLtwiLOmApL2aRkni3wpetTwc= + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/p-try/2.2.0/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha1-yyhoVA4xPWHeWPr741zpAE1VQOY= + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + 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" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + 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#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.4: + version "4.0.7" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" + integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== + +pkg-dir@^4.2.0: + 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#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM= + dependencies: + find-up "^4.0.0" + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/possible-typed-array-names/1.0.0/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha1-ibtjxvraLD6QrcSmR77us5zHv48= + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/prettier-linter-helpers/1.0.0/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha1-0j1B/hN1ZG3i0BBNNFSjAIgCz3s= + dependencies: + fast-diff "^1.1.2" + +prettier@^3.3.3: + version "3.5.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/prettier/-/prettier-3.5.3.tgz#4fc2ce0d657e7a02e602549f053b239cb7dfe1b5" + integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw== + +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/prompts/2.4.2/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha1-e1fnOzpIAprRDr1E90sBcipMsGk= + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +pure-rand@^6.0.0: + version "6.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/pure-rand/6.1.0/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha1-0XPPIyWCMZdsy9sFJHyXh5V2BPI= + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-is@^18.0.0: + version "18.3.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== + +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" + +regexp.prototype.flags@^1.5.3: + version "1.5.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" + integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resolve-cwd@^3.0.0: + 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#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha1-DwB18bslRHZs9zumpuKt/ryxPy0= + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/resolve-pkg-maps/1.0.0/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha1-YWs9wsVwVrVYjDHN9LPWTbEzcg8= + +resolve.exports@^2.0.0: + version "2.0.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" + integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== + +resolve@^1.20.0, resolve@^1.22.4: + version "1.22.10" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/rimraf/3.0.2/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha1-8aVAK6YiCtUswSgrrBrjqkn9Bho= + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" + isarray "^2.0.5" + +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + +"safer-buffer@>= 2.1.2 < 3": + 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#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= + +semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.7.1: + version "7.7.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/set-function-length/1.2.2/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha1-qscjFBmOrtl1z3eyw7a4gGleVEk= + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/set-function-name/2.0.2/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha1-FqcFxaDcL15jjKltiozU4cK5CYU= + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel-list@^1.0.0: + 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#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + 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#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + 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#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + 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" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + 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" + +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.1.0: + version "4.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/sisteransi/1.0.5/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha1-E01oEpd1ZDfMBcoBNw06elcQde0= + +slash@^3.0.0: + version "3.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-support@0.5.13: + 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#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha1-MbJKnC5zwt6FBmwP631Edn7VKTI= + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/source-map/0.6.1/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha1-dHIq8y6WFOnCh6jQu95IteLxomM= + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + 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#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha1-qvB0gWnAL8M8gjKrzPkz9Uocw08= + dependencies: + escape-string-regexp "^2.0.0" + +string-length@^4.0.1: + 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#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha1-qKjce9XBqCubPIuH4SX2aHG25Xo= + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" + +string.prototype.trimend@^1.0.8, string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/string.prototype.trimstart/1.0.8/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha1-fug03ajHwX7/MRhHK7Nb/tqjTd4= + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/strip-bom/4.0.0/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha1-nDUFwdtFvO3KPZz3oW9cWqOQGHg= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/strip-final-newline/2.0.0/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0= + +strip-json-comments@^3.1.1: + 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#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + 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#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +synckit@^0.11.0: + version "0.11.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/synckit/-/synckit-0.11.4.tgz#48972326b59723fc15b8d159803cf8302b545d59" + integrity sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ== + dependencies: + "@pkgr/core" "^0.2.3" + tslib "^2.8.1" + +tapable@^2.2.0: + version "2.2.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/tapable/-/tapable-2.2.2.tgz#ab4984340d30cb9989a490032f086dbb8b56d872" + integrity sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg== + +test-exclude@^6.0.0: + 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#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha1-BKhphmHYBepvopO2y55jrARO8V4= + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/text-table/0.2.0/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/tmp/0.0.33/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha1-bTQzWIl2jSGyvNoKonfO07G/rfk= + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-regex-range@^5.0.1: + 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#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-jest@^29.3.2: + version "29.3.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/ts-jest/-/ts-jest-29.3.2.tgz#0576cdf0a507f811fe73dcd16d135ce89f8156cb" + integrity sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug== + 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" + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/tsconfig-paths/3.15.0/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha1-UpnsYF5VsauyPsk57xXtr0gwcNQ= + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.8.1: + version "2.8.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/tsutils/3.21.0/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha1-tIcX05TOpsHglpg+7Vjp1hcVtiM= + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + 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#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw= + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/type-fest/0.20.2/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ= + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^4.39.1: + version "4.41.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" + integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== + +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== + dependencies: + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" + +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" + +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" + +typescript@^5.6.3: + version "5.8.3" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" + integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== + +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== + dependencies: + call-bound "^1.0.3" + has-bigints "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" + +undici-types@~6.21.0: + version "6.21.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== + +update-browserslist-db@^1.1.3: + 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#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +v8-to-istanbul@^9.0.1: + 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#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + +walker@^1.0.8: + version "1.0.8" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" + +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/which-collection/1.0.2/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha1-Yn73YkOSChB+fOjpYZHevksWwqA= + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.16, which-typed-array@^1.1.18: + version "1.1.19" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + 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#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^4.0.2: + 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#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha1-qd8Brlt3hYoCf9LoB2juQzVV/P0= + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +y18n@^5.0.5: + version "5.0.8" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.7.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + 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" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yoctocolors-cjs@^2.1.2: + version "2.1.2" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz#f4b905a840a37506813a7acaa28febe97767a242" + integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== + +zod@^3.24.4: + version "3.25.42" + resolved "https://artifactory.infra.ant.dev:443/artifactory/api/npm/npm-all/zod/-/zod-3.25.42.tgz#4818381b32f5120e7ea06decb1cde54a230cad2a" + integrity sha512-PcALTLskaucbeHc41tU/xfjfhcz8z0GdhhDcSgrCTmSazUuqnYqiXO63M0QUBVwpBlsLsNVn5qHSC5Dw3KZvaQ==