From 669f3ed4f21b1bf90b459d0d4caa30e273051e5f Mon Sep 17 00:00:00 2001 From: coderrob Date: Thu, 16 Oct 2025 16:53:40 -0500 Subject: [PATCH 01/20] feat(logging): add Pino logger implementation with Noop fallback - Implemented NoopLogger class for silent logging when Pino initialization fails. - Created PinoLogger class that utilizes Pino for structured logging. - Added types for Pino logger configuration and metadata. - Updated logging types to include new logger interfaces and metadata structures. refactor(services): remove unused BarrelContentBuilder and FileSystemService - Deleted BarrelContentBuilder and FileSystemService classes as they are no longer needed. test(logging): add unit tests for BarrelContentBuilder and BarrelFileGenerator - Created tests for BarrelContentBuilder to validate export generation. - Added tests for BarrelFileGenerator to ensure correct barrel file creation and updates. - Implemented tests for ExportParser to verify export extraction functionality. chore(tests): update test configurations and improve test structure - Refactored test runner to use fileURLToPath for path resolution. - Created separate tsconfig.test.json for test-specific TypeScript configurations. - Updated webpack configuration for better module resolution and source mapping. chore(env): define environment variables interface for testing - Added IEnvironmentVariables interface to standardize environment variable usage. --- .dependency-cruiser.js | 58 + .devcontainer/devcontainer.json | 36 + .editorconfig | 24 + .eslintrc.json | 6 +- .gitattributes | 3 + .github/CODEOWNERS | 7 + .gitignore | 122 +- .jscpd.json | 16 + .markdownlint.yml | 23 + .npmignore | 38 + .nvmrc | 1 + .prettierignore | 8 + .prettierrc.json | 4 +- .prettierrc.yml | 16 + .yaml-lint.yml | 12 + .yarnrc.yml | 5 + ARCHITECTURE.md | 124 +- CHANGELOG.md | 1 + CONTRIBUTING.md | 6 + LICENSE | 210 +- README.md | 29 +- badges/coverage.svg | 1 + eslint.config.mjs | 219 + jest.config.cjs | 46 + package-lock.json | 12218 +++++++++++++--- package.json | 158 +- rollup.config.js | 77 + .../services/barrel-content.builder.test.ts | 24 + .../services/barrel-file.generator.test.ts | 97 + .../core/services/export.parser.test.ts | 17 + src/__tests__/filters/log-filters.test.ts | 144 + src/__tests__/jest.setup.ts | 29 + .../loggers/composite.logger.test.ts | 177 + src/__tests__/loggers/filtered.logger.test.ts | 382 + .../loggers/logger-config.resolver.test.ts | 181 + src/__tests__/loggers/logger.factory.test.ts | 39 + src/__tests__/loggers/metrics.logger.test.ts | 134 + src/__tests__/loggers/mock.logger.test.ts | 179 + src/__tests__/loggers/noop.logger.test.ts | 96 + src/__tests__/loggers/pino.logger.test.ts | 111 + src/barrelFileGenerator.ts | 58 - src/core/index.ts | 19 + src/core/services/barrel-content.builder.ts | 152 + src/core/services/barrel-file.generator.ts | 170 + .../services/export.parser.ts} | 14 +- src/core/services/file-system.service.ts | 123 + src/core/services/index.ts | 21 + src/extension.ts | 129 +- src/index.ts | 26 + src/logging/config.ts | 154 + src/logging/filters/index.ts | 19 + src/logging/filters/log-filters.ts | 100 + src/logging/index.ts | 32 + src/logging/loggers/composite.ts | 211 + src/logging/loggers/factory.ts | 79 + src/logging/loggers/filtered.ts | 221 + src/logging/loggers/index.ts | 26 + src/logging/loggers/metrics.ts | 261 + src/logging/loggers/mock.ts | 186 + src/logging/loggers/noop.ts | 111 + src/logging/pino/index.ts | 22 + src/logging/pino/logger.ts | 132 + src/logging/pino/types.ts | 38 + src/logging/types.ts | 249 + src/services/barrelContentBuilder.ts | 74 - src/services/fileSystemService.ts | 63 - src/test/runTest.ts | 35 +- ...test.ts => barrel-content.builder.test.ts} | 3 +- ....test.ts => barrel-file.generator.test.ts} | 8 +- ...rtParser.test.ts => export.parser.test.ts} | 3 +- src/test/suite/index.ts | 6 +- src/types/env.ts | 15 + src/types/index.ts | 2 + tsconfig.json | 46 +- tsconfig.test.json | 24 + webpack.config.js | 18 +- 76 files changed, 15882 insertions(+), 2046 deletions(-) create mode 100644 .dependency-cruiser.js create mode 100644 .devcontainer/devcontainer.json create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/CODEOWNERS create mode 100644 .jscpd.json create mode 100644 .markdownlint.yml create mode 100644 .npmignore create mode 100644 .nvmrc create mode 100644 .prettierignore create mode 100644 .prettierrc.yml create mode 100644 .yaml-lint.yml create mode 100644 .yarnrc.yml create mode 100644 badges/coverage.svg create mode 100644 eslint.config.mjs create mode 100644 jest.config.cjs create mode 100644 rollup.config.js create mode 100644 src/__tests__/core/services/barrel-content.builder.test.ts create mode 100644 src/__tests__/core/services/barrel-file.generator.test.ts create mode 100644 src/__tests__/core/services/export.parser.test.ts create mode 100644 src/__tests__/filters/log-filters.test.ts create mode 100644 src/__tests__/jest.setup.ts create mode 100644 src/__tests__/loggers/composite.logger.test.ts create mode 100644 src/__tests__/loggers/filtered.logger.test.ts create mode 100644 src/__tests__/loggers/logger-config.resolver.test.ts create mode 100644 src/__tests__/loggers/logger.factory.test.ts create mode 100644 src/__tests__/loggers/metrics.logger.test.ts create mode 100644 src/__tests__/loggers/mock.logger.test.ts create mode 100644 src/__tests__/loggers/noop.logger.test.ts create mode 100644 src/__tests__/loggers/pino.logger.test.ts delete mode 100644 src/barrelFileGenerator.ts create mode 100644 src/core/index.ts create mode 100644 src/core/services/barrel-content.builder.ts create mode 100644 src/core/services/barrel-file.generator.ts rename src/{services/exportParser.ts => core/services/export.parser.ts} (89%) create mode 100644 src/core/services/file-system.service.ts create mode 100644 src/core/services/index.ts create mode 100644 src/index.ts create mode 100644 src/logging/config.ts create mode 100644 src/logging/filters/index.ts create mode 100644 src/logging/filters/log-filters.ts create mode 100644 src/logging/index.ts create mode 100644 src/logging/loggers/composite.ts create mode 100644 src/logging/loggers/factory.ts create mode 100644 src/logging/loggers/filtered.ts create mode 100644 src/logging/loggers/index.ts create mode 100644 src/logging/loggers/metrics.ts create mode 100644 src/logging/loggers/mock.ts create mode 100644 src/logging/loggers/noop.ts create mode 100644 src/logging/pino/index.ts create mode 100644 src/logging/pino/logger.ts create mode 100644 src/logging/pino/types.ts create mode 100644 src/logging/types.ts delete mode 100644 src/services/barrelContentBuilder.ts delete mode 100644 src/services/fileSystemService.ts rename src/test/suite/{barrelContentBuilder.test.ts => barrel-content.builder.test.ts} (97%) rename src/test/suite/{barrelFileGenerator.test.ts => barrel-file.generator.test.ts} (97%) rename src/test/suite/{exportParser.test.ts => export.parser.test.ts} (97%) create mode 100644 src/types/env.ts create mode 100644 src/types/index.ts create mode 100644 tsconfig.test.json diff --git a/.dependency-cruiser.js b/.dependency-cruiser.js new file mode 100644 index 0000000..f8b86e4 --- /dev/null +++ b/.dependency-cruiser.js @@ -0,0 +1,58 @@ +/** @type {import('dependency-cruiser').IConfiguration} */ +module.exports = { + forbidden: [ + { + name: 'no-circular', + severity: 'error', + comment: + 'This dependency is part of a circular relationship. Please restructure to remove the circular dependency.', + from: {}, + to: { + circular: true, + }, + }, + { + name: 'no-orphans', + severity: 'warn', + comment: + "This is an orphan module - it's likely not used (anymore). Either use it or remove it. If it's logical this module is an orphan (i.e. it's a script aggregating stuff for a build or library) add an exception for it in the dependency-cruiser configuration.", + from: { + orphan: true, + pathNot: [ + '(^|/)\\.[^/]+\\.(js|cjs|mjs|ts|json)$', // dot files + '\\.d\\.ts$', // TypeScript declaration files + '(^|/)tsconfig\\.json$', // TypeScript config + '(^|/)webpack\\.config\\.(js|cjs|mjs)$', // Webpack config + '(^|/)jest\\.config\\.(js|cjs|mjs)$', // Jest config + '(^|/)rollup\\.config\\.(js|cjs|mjs)$', // Rollup config + '(^|/)eslint\\.config\\.(js|cjs|mjs)$', // ESLint config + ], + }, + to: {}, + }, + ], + options: { + doNotFollow: { + path: 'node_modules', + }, + enhancedResolveOptions: { + exportsFields: ['exports'], + conditionNames: ['import', 'require', 'node', 'default'], + }, + reporterOptions: { + dot: { + collapsePattern: 'node_modules/[^/]+', + }, + archi: { + collapsePattern: '^(packages|src|lib|app|bin|test(s?)|spec(s?))/[^/]+|node_modules/[^/]+', + }, + }, + tsPreCompilationDeps: true, + tsConfig: { + fileName: 'tsconfig.json', + }, + webpackConfig: { + fileName: 'webpack.config.js', + }, + }, +}; diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..d51137c --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,36 @@ +{ + "customizations": { + "codespaces": { + "openFiles": ["README.md"] + }, + "vscode": { + "extensions": [ + "bierner.markdown-preview-github-styles", + "davidanson.vscode-markdownlint", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "redhat.vscode-yaml", + "rvest.vs-code-prettier-eslint", + "yzhang.markdown-all-in-one" + ], + "settings": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.tabSize": 2, + "markdown.extension.italic.indicator": "_", + "markdown.extension.list.indentationSize": "adaptive", + "markdown.extension.orderedList.marker": "one" + } + } + }, + "features": { + "ghcr.io/devcontainers-extra/features/prettier:1": {}, + "ghcr.io/devcontainers/features/github-cli:1": {} + }, + "image": "mcr.microsoft.com/devcontainers/typescript-node:20", + "name": "TypeScript Dev Container", + "postCreateCommand": "corepack enable && yarn install", + "remoteEnv": { + "GITHUB_TOKEN": "${localEnv:GITHUB_TOKEN}" + } +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..843db2d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,24 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[*.json] +indent_size = 2 + +[*.{js,ts,tsx,jsx}] +indent_size = 2 + +[*.{html,css,scss}] +indent_size = 2 diff --git a/.eslintrc.json b/.eslintrc.json index 5dfecab..3de4096 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,11 +1,12 @@ { - "root": true, + "ignorePatterns": ["out", "dist", ".vscode-test", "**/*.d.ts"], "parser": "@typescript-eslint/parser", "parserOptions": { "ecmaVersion": 6, "sourceType": "module" }, "plugins": ["@typescript-eslint"], + "root": true, "rules": { "@typescript-eslint/naming-convention": "warn", "@typescript-eslint/semi": "warn", @@ -13,6 +14,5 @@ "eqeqeq": "warn", "no-throw-literal": "warn", "semi": "off" - }, - "ignorePatterns": ["out", "dist", "**/*.d.ts"] + } } diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6ba5456 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +* text=auto eol=lf + +dist/** -diff linguist-generated=true diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..94f7270 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,7 @@ +############################################################################ +# Repository CODEOWNERS # +# Order is important! The last matching pattern takes the most precedence. # +############################################################################ + +# Default owners, unless a later match takes precedence. +* @coderrob diff --git a/.gitignore b/.gitignore index 0b70982..d178290 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,117 @@ -node_modules -out -dist -*.vsix -.vscode-test/ -.DS_Store +# Dependencies +node_modules/ +package-lock.json* + +# Yarn +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions +.pnp.* + +# Build outputs +dist/ +lib/ +out/ +build/ + +# Test outputs +coverage/ +.nyc_output/ +*.lcov + +# Logs +logs/ *.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Runtime files +pids/ +*.pid +*.seed +*.pid.lock + +# Reports +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +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/ + +# OS metadata +.DS_Store +Thumbs.db + +# Ignore built ts files +__tests__/runner/* + +# IDE files +.idea +*.code-workspace + +# VSCode specific files except code-snippets +.vscode/* +!.vscode/*.code-snippets +.vscode-test/* diff --git a/.jscpd.json b/.jscpd.json new file mode 100644 index 0000000..c51c27a --- /dev/null +++ b/.jscpd.json @@ -0,0 +1,16 @@ +{ + "exitCode": 1, + "ignore": [ + "**/.vscode-test/**", + "**/__mocks__/**", + "**/coverage/**", + "**/dist/**", + "**/node_modules/**", + "**/out/**" + ], + "minLines": 5, + "minTokens": 70, + "output": "./coverage/jscpd", + "reporters": ["html", "console"], + "threshold": 2 +} diff --git a/.markdownlint.yml b/.markdownlint.yml new file mode 100644 index 0000000..27d5762 --- /dev/null +++ b/.markdownlint.yml @@ -0,0 +1,23 @@ +# See: https://github.com/DavidAnson/markdownlint + +# Disable line length checking (prettier handles this) +MD013: false + +# Unordered list style +MD004: + style: dash + +# Ordered list item prefix +MD029: + style: one + +# Spaces after list markers +MD030: + ul_single: 1 + ol_single: 1 + ul_multi: 1 + ol_multi: 1 + +# Code block style +MD046: + style: fenced diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..81af679 --- /dev/null +++ b/.npmignore @@ -0,0 +1,38 @@ +# Source files +src/ +__mocks__/ +__tests__/ + +# Configuration files +*.config.* +.eslint* +.prettier* +.jscpd* +.nvmrc +.editorconfig +.gitignore +.gitattributes + +# Development files +.devcontainer/ +.vscode/ +.automation/ +.github/ +script/ +badges/ + +# Build artifacts +.vscode-test/ +audit/ +dist/ +out/ +coverage/ +node_modules/ +*.log + +# Documentation (keep only README.md) +*.md +!README.md + +# TypeScript configs +tsconfig*.json diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..209e3ef --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +20 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..97405b7 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,8 @@ +.DS_Store +.vscode-test/ +audit/ +coverage/ +dist/ +node_modules/ +out/ +script/*.sh diff --git a/.prettierrc.json b/.prettierrc.json index 919b549..96f99e1 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,8 +1,8 @@ { + "printWidth": 100, "semi": true, - "trailingComma": "all", "singleQuote": true, - "printWidth": 100, "tabWidth": 2, + "trailingComma": "all", "useTabs": false } diff --git a/.prettierrc.yml b/.prettierrc.yml new file mode 100644 index 0000000..87e925a --- /dev/null +++ b/.prettierrc.yml @@ -0,0 +1,16 @@ +# See: https://prettier.io/docs/en/configuration + +arrowParens: always +bracketSameLine: true +bracketSpacing: true +endOfLine: lf +htmlWhitespaceSensitivity: css +jsxSingleQuote: false +printWidth: 80 +proseWrap: preserve +quoteProps: as-needed +semi: true +singleQuote: true +tabWidth: 2 +trailingComma: none +useTabs: false diff --git a/.yaml-lint.yml b/.yaml-lint.yml new file mode 100644 index 0000000..8f400a3 --- /dev/null +++ b/.yaml-lint.yml @@ -0,0 +1,12 @@ +# See: https://yamllint.readthedocs.io/en/stable/ + +rules: + document-end: disable + document-start: + level: warning + present: false + line-length: + level: warning + max: 80 + allow-non-breakable-words: true + allow-non-breakable-inline-mappings: true diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 0000000..d588250 --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1,5 @@ +compressionLevel: mixed +enableGlobalCache: false +enableTelemetry: false +nmMode: hardlinks-local +nodeLinker: node-modules diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index e8c889c..04441dd 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -12,17 +12,60 @@ Barrel Roll follows SOLID principles with clean separation of concerns. The exte barrel-roll/ ├── src/ │ ├── extension.ts # Extension entry point -│ ├── barrelFileGenerator.ts # Main orchestrator -│ ├── services/ # Service layer -│ │ ├── fileSystemService.ts # File I/O operations -│ │ ├── exportParser.ts # Export extraction logic -│ │ └── barrelContentBuilder.ts # Content generation -│ └── test/ # Test suite -│ ├── runTest.ts # Test runner -│ └── suite/ # Test cases -│ ├── exportParser.test.ts -│ ├── barrelContentBuilder.test.ts -│ └── barrelFileGenerator.test.ts +│ ├── index.ts # Public API exports +│ ├── core/ # Core barrel generation functionality +│ │ ├── index.ts # Core exports +│ │ └── services/ # Service layer +│ │ ├── index.ts # Service exports +│ │ ├── barrel-file.generator.ts # Main orchestrator +│ │ ├── barrel-content.builder.ts # Content generation +│ │ ├── export.parser.ts # Export extraction logic +│ │ └── file-system.service.ts # File I/O operations +│ ├── logging/ # Logging infrastructure +│ │ ├── index.ts +│ │ ├── config.ts +│ │ ├── types.ts +│ │ ├── filters/ +│ │ │ ├── index.ts +│ │ │ └── log-filters.ts +│ │ ├── loggers/ +│ │ │ ├── index.ts +│ │ │ ├── composite.ts +│ │ │ ├── factory.ts +│ │ │ ├── filtered.ts +│ │ │ ├── metrics.ts +│ │ │ ├── mock.ts +│ │ │ └── noop.ts +│ │ └── pino/ +│ │ ├── index.ts +│ │ ├── logger.ts +│ │ └── types.ts +│ ├── types/ # Shared type definitions +│ │ ├── index.ts +│ │ └── env.ts +│ ├── test/ # Integration tests +│ │ ├── runTest.ts # VS Code test runner +│ │ └── suite/ # Test cases +│ │ ├── index.ts +│ │ ├── barrelContentBuilder.test.ts +│ │ ├── barrelFileGenerator.test.ts +│ │ └── exportParser.test.ts +│ └── __tests__/ # Jest unit tests +│ ├── jest.setup.ts +│ ├── filters/ +│ │ └── log-filters.test.ts +│ └── loggers/ +│ ├── composite.logger.test.ts +│ ├── filtered.logger.test.ts +│ ├── logger-config.resolver.test.ts +│ ├── logger.factory.test.ts +│ ├── metrics.logger.test.ts +│ ├── mock.logger.test.ts +│ ├── noop.logger.test.ts +│ └── pino.logger.test.ts +├── audit/ # Repository audit documentation +│ ├── log.md # Audit chronological log +│ └── dependency-graph.md # Dependency analysis reports ├── .vscode/ # VS Code workspace config ├── .github/workflows/ # CI/CD pipelines ├── dist/ # Webpack bundled output @@ -42,11 +85,12 @@ barrel-roll/ **Code Stats**: ~25 lines -### 2. Barrel File Generator (`barrelFileGenerator.ts`) +### 2. Barrel File Generator (`src/core/services/barrel-file.generator.ts`) **Responsibility**: Orchestrate the barrel file generation process **Pattern**: Facade/Orchestrator pattern + - Coordinates between services - Implements dependency injection for testability - Handles the main workflow: @@ -59,13 +103,14 @@ barrel-roll/ ### 3. Service Layer -#### FileSystemService (`services/fileSystemService.ts`) +#### FileSystemService (`src/core/services/file-system.service.ts`) **Responsibility**: File system operations **SOLID Principle**: Single Responsibility - handles only file I/O **Methods**: + - `getTypeScriptFiles(directoryPath)`: Lists .ts files (excluding index.ts) - `readFile(filePath)`: Reads file content - `writeFile(filePath, content)`: Writes file content @@ -74,13 +119,14 @@ barrel-roll/ **Code Stats**: ~60 lines -#### ExportParser (`services/exportParser.ts`) +#### ExportParser (`src/core/services/export.parser.ts`) **Responsibility**: Extract TypeScript exports from source code **SOLID Principle**: Single Responsibility - handles only export parsing **Features**: + - Detects named exports (class, interface, type, function, const, enum) - Detects default exports - Handles export lists `export { A, B }` @@ -89,34 +135,36 @@ barrel-roll/ - Deduplicates export names **Methods**: + - `extractExports(content)`: Main export extraction logic - `removeComments(content)`: Helper to strip comments **Code Stats**: ~70 lines -#### BarrelContentBuilder (`services/barrelContentBuilder.ts`) +#### BarrelContentBuilder (`src/core/services/barrel-content.builder.ts`) -**Responsibility**: Build formatted barrel file content +**Responsibility**: Generate barrel file content from parsed exports **SOLID Principle**: Single Responsibility - handles only content generation **Features**: -- Filters parent folder references -- Sorts files alphabetically for consistency -- Handles default exports separately -- Generates clean, formatted export statements + +- Generates properly formatted export statements +- Sorts exports alphabetically for consistency +- Handles different export types appropriately **Methods**: -- `buildContent(exportsByFile, directoryPath)`: Main content builder -- `getModulePath(filePath)`: Convert file paths to module paths -**Code Stats**: ~80 lines +- `buildBarrelContent(exportMap)`: Main content generation logic + +**Code Stats**: ~40 lines ## Design Patterns ### Dependency Injection The `BarrelFileGenerator` accepts service instances through its constructor, enabling: + - Easy unit testing with mocks - Flexibility to swap implementations - Loose coupling between components @@ -132,11 +180,13 @@ constructor( ### Separation of Concerns Each service has a single, well-defined responsibility: + - **FileSystemService**: I/O operations - **ExportParser**: Code parsing - **BarrelContentBuilder**: Content generation This makes the code: + - Easy to test in isolation - Simple to understand - Straightforward to modify @@ -147,19 +197,17 @@ All services throw descriptive errors that bubble up to the extension entry poin ## Testing Strategy -### Unit Tests - -- **ExportParser**: Tests various export syntax patterns -- **BarrelContentBuilder**: Tests content generation logic - -### Integration Tests - -- **BarrelFileGenerator**: End-to-end tests with temporary directories +- **Unit Tests**: Jest-based tests in `src/__tests__/` covering logging, filters, and core services +- **Integration Tests**: VS Code extension tests in `src/test/suite/` verifying end-to-end functionality +- **Test Coverage**: 60% minimum coverage requirement with detailed reporting +- **CI/CD**: Automated testing on push/PR with coverage reporting -### Coverage +## Audit & Quality Assurance -- Tests cover happy paths, edge cases, and error scenarios -- Mock-free integration tests verify real file system operations +- **Dependency Analysis**: Automated circular dependency detection using `madge` and `dependency-cruiser` +- **Code Quality**: ESLint rules for import/export consistency and unused code detection +- **Repository Standards**: Adherence to SOLID principles, clean architecture, and refactoring guidelines +- **Audit Documentation**: Ongoing audit log in `audit/log.md` with dependency graphs and remediation plans ## Build Process @@ -184,10 +232,10 @@ Commands are registered in `contributes.commands` and added to the context menu The architecture supports easy additions: -1. **New Export Types**: Extend `ExportParser.extractExports()` -2. **Different Output Formats**: Create new builder implementations -3. **File Filters**: Extend `FileSystemService.getTypeScriptFiles()` -4. **Additional Commands**: Add new commands in `extension.ts` +- **New Export Types**: Extend `ExportParser.extractExports()` +- **Different Output Formats**: Create new builder implementations +- **File Filters**: Extend `FileSystemService.getTypeScriptFiles()` +- **Additional Commands**: Add new commands in `extension.ts` ## Performance Considerations diff --git a/CHANGELOG.md b/CHANGELOG.md index 78b2e00..5efd06f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ All notable changes to the "barrel-roll" extension will be documented in this fi ## [0.0.1] - Initial Release ### Added + - Initial release of Barrel Roll extension - Right-click context menu for directories to generate barrel files - Automatic detection of TypeScript exports (classes, interfaces, types, functions, constants, enums) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cb41bdb..57476bd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,12 +5,14 @@ Thank you for your interest in contributing to Barrel Roll! This document provid ## Development Setup 1. **Fork and Clone** + ```bash git clone https://github.com/YOUR_USERNAME/barrel-roll.git cd barrel-roll ``` 2. **Install Dependencies** + ```bash npm install ``` @@ -32,6 +34,7 @@ Thank you for your interest in contributing to Barrel Roll! This document provid ### Making Changes 1. Create a new branch for your feature or bug fix: + ```bash git checkout -b feature/your-feature-name ``` @@ -39,12 +42,14 @@ Thank you for your interest in contributing to Barrel Roll! This document provid 2. Make your changes following the code style guidelines 3. Run linting: + ```bash npm run lint npm run lint:fix # Auto-fix issues ``` 4. Run formatting: + ```bash npm run format ``` @@ -95,6 +100,7 @@ Follow conventional commit format: - `chore:` Maintenance tasks Example: + ``` feat: add support for default exports ``` diff --git a/LICENSE b/LICENSE index 66c0fd8..66d1562 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,189 @@ -MIT License - -Copyright (c) 2024 Coderrob - -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. + Apache License + Version 2.0, January 2004 + + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, and + distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by the + copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all other + entities that control, are controlled by, or are under common control with + that entity. For the purposes of this definition, "control" means (i) the + power, direct or indirect, to cause the direction or management of such + entity, whether by contract or otherwise, or (ii) ownership of fifty percent + (50%) or more of the outstanding shares, or (iii) beneficial ownership of + such entity. + + "You" (or "Your") shall mean an individual or Legal Entity exercising + permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation source, and + configuration files. + + "Object" form shall mean any form resulting from mechanical transformation + or translation of a Source form, including but not limited to compiled + object code, generated documentation, and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or Object form, + made available under the License, as indicated by a copyright notice that is + included in or attached to the work (an example is provided in the Appendix + below). + + "Derivative Works" shall mean any work, whether in Source or Object form, + that is based on (or derived from) the Work and for which the editorial + revisions, annotations, elaborations, or other modifications represent, as a + whole, an original work of authorship. For the purposes of this License, + Derivative Works shall not include works that remain separable from, or + merely link (or bind by name) to the interfaces of, the Work and Derivative + Works thereof. + + "Contribution" shall mean any work of authorship, including the original + version of the Work and any modifications or additions to that Work or + Derivative Works thereof, that is intentionally submitted to Licensor for + inclusion in the Work by the copyright owner or by an individual or Legal + Entity authorized to submit on behalf of the copyright owner. For the + purposes of this definition, "submitted" means any form of electronic, + verbal, or written communication sent to the Licensor or its + representatives, including but not limited to communication on electronic + mailing lists, source code control systems, and issue tracking systems that + are managed by, or on behalf of, the Licensor for the purpose of discussing + and improving the Work, but excluding communication that is conspicuously + marked or otherwise designated in writing by the copyright owner as "Not a + Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity on + behalf of whom a Contribution has been received by Licensor and subsequently + incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this + License, each Contributor hereby grants to You a perpetual, worldwide, + non-exclusive, no-charge, royalty-free, irrevocable copyright license to + reproduce, prepare Derivative Works of, publicly display, publicly perform, + sublicense, and distribute the Work and such Derivative Works in Source or + Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this + License, each Contributor hereby grants to You a perpetual, worldwide, + non-exclusive, no-charge, royalty-free, irrevocable (except as stated in + this section) patent license to make, have made, use, offer to sell, sell, + import, and otherwise transfer the Work, where such license applies only to + those patent claims licensable by such Contributor that are necessarily + infringed by their Contribution(s) alone or by combination of their + Contribution(s) with the Work to which such Contribution(s) was submitted. + If You institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work or a + Contribution incorporated within the Work constitutes direct or contributory + patent infringement, then any patent licenses granted to You under this + License for that Work shall terminate as of the date such litigation is + filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or + Derivative Works thereof in any medium, with or without modifications, and + in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a + copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating + that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You + distribute, all copyright, patent, trademark, and attribution notices from + the Source form of the Work, excluding those notices that do not pertain to + any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, + then any Derivative Works that You distribute must include a readable copy + of the attribution notices contained within such NOTICE file, excluding + those notices that do not pertain to any part of the Derivative Works, in at + least one of the following places: within a NOTICE text file distributed as + part of the Derivative Works; within the Source form or documentation, if + provided along with the Derivative Works; or, within a display generated by + the Derivative Works, if and wherever such third-party notices normally + appear. The contents of the NOTICE file are for informational purposes only + and do not modify the License. You may add Your own attribution notices + within Derivative Works that You distribute, alongside or as an addendum to + the NOTICE text from the Work, provided that such additional attribution + notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may + provide additional or different license terms and conditions for use, + reproduction, or distribution of Your modifications, or for any such + Derivative Works as a whole, provided Your use, reproduction, and + distribution of the Work otherwise complies with the conditions stated in + this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any + Contribution intentionally submitted for inclusion in the Work by You to the + Licensor shall be under the terms and conditions of this License, without + any additional terms or conditions. Notwithstanding the above, nothing + herein shall supersede or modify the terms of any separate license agreement + you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, + trademarks, service marks, or product names of the Licensor, except as + required for reasonable and customary use in describing the origin of the + Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in + writing, Licensor provides the Work (and each Contributor provides its + Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied, including, without limitation, any + warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or + FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining + the appropriateness of using or redistributing the Work and assume any risks + associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in + tort (including negligence), contract, or otherwise, unless required by + applicable law (such as deliberate and grossly negligent acts) or agreed to + in writing, shall any Contributor be liable to You for damages, including + any direct, indirect, special, incidental, or consequential damages of any + character arising as a result of this License or out of the use or inability + to use the Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all other + commercial damages or losses), even if such Contributor has been advised of + the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or + Derivative Works thereof, You may choose to offer, and charge a fee for, + acceptance of support, warranty, indemnity, or other liability obligations + and/or rights consistent with this License. However, in accepting such + obligations, You may act only on Your own behalf and on Your sole + responsibility, not on behalf of any other Contributor, and only if You + agree to indemnify, defend, and hold each Contributor harmless for any + liability incurred by, or claims asserted against, such Contributor by + reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2025-Present Robert Lindley + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed +under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for the +specific language governing permissions and limitations under the License. diff --git a/README.md b/README.md index 5711b6c..5dad59b 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ Visual Studio Code extension to automatically export types, functions, constants ## Features - **Right-click Generation**: Right-click any folder in the VS Code explorer to generate or update an `index.ts` barrel file +- **Recursive Commands**: Generate barrels for a single folder, for an entire subtree, or sanitize existing barrels via dedicated context menu entries +- **Recursive Barrels**: Automatically walks child folders, generating barrels for every directory and wiring parent barrels to re-export their children - **Smart Export Detection**: Automatically detects and exports all TypeScript exports (classes, interfaces, types, functions, constants, enums) - **Clean Architecture**: Follows SOLID principles for maintainability and extensibility - **Parent Folder Filtering**: Automatically removes re-exports from parent folders @@ -13,12 +15,14 @@ Visual Studio Code extension to automatically export types, functions, constants ## Installation ### From VS Code Marketplace + 1. Open VS Code 2. Go to Extensions (Ctrl+Shift+X / Cmd+Shift+X) 3. Search for "Barrel Roll" 4. Click Install ### From VSIX + 1. Download the latest `.vsix` file from the [releases page](https://github.com/Coderrob/barrel-roll/releases) 2. In VS Code, go to Extensions 3. Click the `...` menu and select "Install from VSIX..." @@ -27,16 +31,23 @@ Visual Studio Code extension to automatically export types, functions, constants ## Usage 1. Right-click on any folder in the VS Code explorer -2. Select "Barrel Roll: Generate/Update index.ts" +2. Select one of the Barrel Roll commands: + - `Barrel Roll: Generate/Update index.ts` (current folder only) + - `Barrel Roll: Generate/Update index.ts (Recursive)` (folder and all subfolders) + - `Barrel Roll: Update Existing index.ts Files` (refresh existing barrels without adding new ones) 3. The extension will: - - Scan all `.ts` files in the folder (excluding `index.ts`) + - Scan all `.ts`/`.tsx` files in the folder (excluding `index.ts` and declaration files) + - Recursively process each subfolder and generate its `index.ts` - Extract all exported items - - Generate or update an `index.ts` file with proper exports + - Generate or update an `index.ts` file with proper exports and re-export child barrels - Filter out any re-exports from parent directories +You can also invoke these commands from the Command Palette (`Ctrl+Shift+P` / `Cmd+Shift+P`) by searching for their names. + ### Example Given these files in a folder: + ```typescript // user.ts export class User {} @@ -51,6 +62,7 @@ export const API_URL = 'https://api.example.com'; ``` Running Barrel Roll will generate: + ```typescript // index.ts export { API_URL } from './constants'; @@ -61,42 +73,52 @@ export { User, UserData } from './user'; ## Development ### Prerequisites + - Node.js 18.x or 20.x - npm 8.x or later ### Setup + ```bash npm install ``` ### Build + ```bash npm run compile ``` ### Watch Mode + ```bash npm run watch ``` ### Testing + ```bash npm test ``` +> Note: On Windows, VS Code integration tests are temporarily skipped because the bundled `Code.exe` rejects the CLI flags required by `@vscode/test-electron`. Unit tests and linting still run as part of the command. + ### Linting + ```bash npm run lint npm run lint:fix ``` ### Formatting + ```bash npm run format npm run format:check ``` ### Package Extension + ```bash npm run package ``` @@ -111,6 +133,7 @@ The extension follows SOLID principles with clear separation of concerns: - **BarrelContentBuilder**: Builds the formatted content for barrel files This architecture ensures: + - **Single Responsibility**: Each class has one clear purpose - **Open/Closed**: Easy to extend without modifying existing code - **Dependency Inversion**: High-level modules don't depend on low-level details diff --git a/badges/coverage.svg b/badges/coverage.svg new file mode 100644 index 0000000..228afd6 --- /dev/null +++ b/badges/coverage.svg @@ -0,0 +1 @@ +Coverage: 94.16%Coverage94.16% \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..cd6e2e9 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,219 @@ +// Modern ESLint Flat Configuration +// See: https://eslint.org/docs/latest/use/configure/configuration-files + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import js from '@eslint/js'; +import typescriptEslint from '@typescript-eslint/eslint-plugin'; +import tsParser from '@typescript-eslint/parser'; +import _import from 'eslint-plugin-import'; +import jest from 'eslint-plugin-jest'; +import prettier from 'eslint-plugin-prettier'; +import sonarjs from 'eslint-plugin-sonarjs'; +import globals from 'globals'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +export default [ + // Global ignores + { + ignores: [ + '**/coverage/**', + '**/dist/**', + '**/node_modules/**', + '**/lib/**', + '**/build/**', + '**/out/**', + '**/.vscode-test/**', + '*.config.{js,mjs,cjs}', + 'badges/**', + 'script/**', + ], + }, + + // Base configuration for all files + { + plugins: { + prettier, + }, + rules: { + 'prettier/prettier': ['error', { semi: true }], + }, + }, + + // TypeScript files configuration + { + files: ['**/*.{ts,tsx,mts,cts}'], + languageOptions: { + parser: tsParser, + ecmaVersion: 2023, + sourceType: 'module', + parserOptions: { + project: ['tsconfig.test.json'], + tsconfigRootDir: __dirname, + }, + globals: { + ...globals.node, + NodeJS: 'readonly', + Atomics: 'readonly', + SharedArrayBuffer: 'readonly', + }, + }, + plugins: { + '@typescript-eslint': typescriptEslint, + import: _import, + sonarjs, + }, + settings: { + 'import/resolver': { + typescript: { + alwaysTryTypes: true, + project: 'tsconfig.test.json', + }, + }, + }, + rules: { + // Base ESLint recommended + ...js.configs.recommended.rules, + + // Complexity rules (fail build on high complexity) + complexity: ['error', { max: 5 }], + + // SonarJS rules for static analysis (selective adoption) + 'sonarjs/cognitive-complexity': ['error', 8], + 'sonarjs/no-duplicate-string': ['error', { threshold: 3 }], + 'sonarjs/no-identical-functions': 'error', + 'sonarjs/prefer-immediate-return': 'error', + 'sonarjs/pseudo-random': 'warn', + 'sonarjs/publicly-writable-directories': 'warn', + 'sonarjs/no-inverted-boolean-check': 'error', + 'sonarjs/no-redundant-boolean': 'error', + 'sonarjs/no-unused-collection': 'error', + 'sonarjs/no-collapsible-if': 'error', + 'sonarjs/prefer-single-boolean-return': 'error', + + // TypeScript ESLint rules + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + ignoreRestSiblings: true, + }, + ], + '@typescript-eslint/no-floating-promises': 'error', + '@typescript-eslint/require-await': 'error', + '@typescript-eslint/unbound-method': 'error', + '@typescript-eslint/no-unsafe-enum-comparison': 'error', + '@typescript-eslint/no-unnecessary-type-assertion': 'error', + '@typescript-eslint/no-duplicate-type-constituents': 'error', + + // Import sorting and organization + 'import/order': [ + 'error', + { + groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'], + 'newlines-between': 'always', + alphabetize: { + order: 'asc', + caseInsensitive: true, + }, + }, + ], + 'sort-imports': [ + 'error', + { + ignoreCase: true, + ignoreDeclarationSort: true, + ignoreMemberSort: false, + memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'], + }, + ], + + // Custom overrides + camelcase: 'off', + 'no-console': 'off', + 'no-shadow': 'off', + 'space-in-parens': ['error', 'never'], + 'spaced-comment': ['error', 'always'], + }, + }, + + // Jest test files and mock files configuration + { + files: [ + '**/__tests__/**/*.{ts,tsx}', + '**/*.test.{ts,tsx}', + '**/*.spec.{ts,tsx}', + '**/__mocks__/**/*.{ts,tsx}', + ], + languageOptions: { + globals: { + ...globals.node, + ...globals.jest, + NodeJS: 'readonly', + jest: 'readonly', + }, + }, + plugins: { + jest, + }, + rules: { + // Jest recommended rules + ...jest.configs.recommended.rules, + 'jest/expect-expect': 'error', + 'jest/no-disabled-tests': 'warn', + 'jest/no-focused-tests': 'error', + 'jest/prefer-to-have-length': 'warn', + + // Relax some rules for test files + 'sonarjs/no-duplicate-string': 'off', + '@typescript-eslint/unbound-method': 'off', + '@typescript-eslint/require-await': 'off', + 'sonarjs/publicly-writable-directories': 'off', + }, + }, + + // Mocha test suite files (VS Code extension integration tests) + { + files: ['**/src/test/suite/**/*.{ts,tsx}'], + languageOptions: { + globals: { + ...globals.node, + ...globals.mocha, + NodeJS: 'readonly', + suite: 'readonly', + test: 'readonly', + setup: 'readonly', + teardown: 'readonly', + before: 'readonly', + beforeEach: 'readonly', + after: 'readonly', + afterEach: 'readonly', + }, + }, + rules: { + // Relax rules for Mocha test files + 'sonarjs/no-duplicate-string': 'off', + '@typescript-eslint/unbound-method': 'off', + '@typescript-eslint/require-await': 'off', + 'sonarjs/publicly-writable-directories': 'off', + 'no-console': 'off', + 'jest/expect-expect': 'off', + complexity: 'off', + 'sonarjs/cognitive-complexity': 'off', + }, + }, + + // Test runner files + { + files: ['**/src/test/runTest.ts'], + rules: { + '@typescript-eslint/no-floating-promises': 'off', + }, + }, +]; diff --git a/jest.config.cjs b/jest.config.cjs new file mode 100644 index 0000000..6a7eb3c --- /dev/null +++ b/jest.config.cjs @@ -0,0 +1,46 @@ +// See: https://jestjs.io/docs/configuration + +/** @type {import('@jest/types').Config.InitialOptions} **/ +module.exports = { + clearMocks: true, + collectCoverage: true, + collectCoverageFrom: ['./src/**'], + coverageDirectory: './coverage', + coveragePathIgnorePatterns: [ + '__mocks__', + '/node_modules/', + '/dist/', + '/tests/', + '/out/', + '/.vscode-test/', + ], + coverageReporters: ['json-summary', 'text', 'lcov'], + coverageThreshold: { + global: { + branches: 0, + functions: 40, + lines: 60, + statements: 60, + }, + }, + extensionsToTreatAsEsm: ['.ts'], + moduleFileExtensions: ['ts', 'js'], + moduleNameMapper: { + '^@/(.*)$': '/src/$1', + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + preset: 'ts-jest', + reporters: ['default'], + setupFilesAfterEnv: ['/src/__tests__/jest.setup.ts'], + testEnvironment: 'node', + testMatch: ['**/*.test.ts', '**/*.test.js'], + testPathIgnorePatterns: ['/dist/', '/node_modules/', '/__mocks__/', '/.vscode-test/'], + transform: { + '^.+\\.ts$': [ + 'ts-jest', + { tsconfig: 'tsconfig.test.json', useESM: false, injectGlobals: true }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!@jest/)', '.*\\.(spec|test)\\.(js|jsx)$'], + verbose: true, +}; diff --git a/package-lock.json b/package-lock.json index a770833..7d73f4b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,19 +7,45 @@ "": { "name": "barrel-roll", "version": "0.0.1", + "license": "Apache-2.0", + "dependencies": { + "pino": "^10.0.0" + }, "devDependencies": { + "@jest/globals": "^29.7.0", + "@rollup/plugin-node-resolve": "^16.0.0", + "@rollup/plugin-terser": "^0.4.4", + "@rollup/plugin-typescript": "^12.1.2", "@types/glob": "^8.1.0", + "@types/jest": "^29.5.14", "@types/mocha": "^10.0.1", - "@types/node": "20.x", + "@types/node": "^22.x", "@types/vscode": "^1.80.0", - "@typescript-eslint/eslint-plugin": "^6.4.1", - "@typescript-eslint/parser": "^6.4.1", + "@typescript-eslint/eslint-plugin": "^8.23.0", + "@typescript-eslint/parser": "^8.23.0", "@vscode/test-electron": "^2.3.4", - "eslint": "^8.47.0", + "cross-env": "^10.1.0", + "dependency-cruiser": "^17.1.0", + "eslint": "^9.20.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jest": "^28.11.0", + "eslint-plugin-prettier": "^5.2.3", + "eslint-plugin-sonarjs": "^3.0.5", + "eslint-plugin-unused-imports": "^4.2.0", "glob": "^10.3.3", + "jest": "^29.7.0", + "jscpd": "^4.0.5", + "madge": "^8.0.0", + "make-coverage-badge": "^1.2.0", "mocha": "^10.2.0", - "prettier": "^3.0.2", + "prettier": "^3.5.0", + "rollup": "^4.34.6", + "ts-jest": "^29.2.5", "ts-loader": "^9.4.4", + "ts-morph": "^27.0.2", + "ts-node": "^10.9.2", + "tslib": "^2.8.1", "typescript": "^5.1.6", "webpack": "^5.88.2", "webpack-cli": "^5.1.4" @@ -28,1524 +54,7584 @@ "vscode": "^1.80.0" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, "engines": { - "node": ">=10.0.0" + "node": ">=6.9.0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "dev": true, "license": "MIT", "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" + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "yallist": "^3.0.2" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { - "node": ">=10.10.0" + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=6.9.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, - "license": "BSD-3-Clause" + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, - "license": "ISC", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@babel/types": "^7.28.4" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">= 8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 8" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">= 8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimatch": "^5.1.2", - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mocha": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", - "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.21.tgz", - "integrity": "sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA==", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/vscode": { - "version": "1.105.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.105.0.tgz", - "integrity": "sha512-Lotk3CTFlGZN8ray4VxJE7axIyLZZETQJVWi/lYoUVQuqfRxlQhVOfoejsD2V3dVXPSbS15ov5ZyowMAzgUqcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=6.9.0" } }, - "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, + "optional": true, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "node": ">=0.1.90" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=12" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } }, - "node_modules/@vscode/test-electron": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", - "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", + "node_modules/@dependents/detective-less": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-5.0.1.tgz", + "integrity": "sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==", "dev": true, "license": "MIT", "dependencies": { - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "jszip": "^3.10.1", - "ora": "^8.1.0", - "semver": "^7.6.2" + "gonzales-pe": "^4.3.0", + "node-source-walk": "^7.0.1" }, "engines": { - "node": ">=16" + "node": ">=18" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + "engines": { + "node": ">=10.0.0" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "node_modules/@emnapi/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", + "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "node_modules/@emnapi/runtime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" + "tslib": "^2.4.0" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", "dev": true, "license": "MIT" }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@xtuc/long": "4.2.2" - } - }, + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", + "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jscpd/core": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@jscpd/core/-/core-4.0.1.tgz", + "integrity": "sha512-6Migc68Z8p7q5xqW1wbF3SfIbYHPQoiLHPbJb1A1Z1H9DwImwopFkYflqRDpuamLd0Jfg2jx3ZBmHQt21NbD1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1" + } + }, + "node_modules/@jscpd/finder": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@jscpd/finder/-/finder-4.0.1.tgz", + "integrity": "sha512-TcCT28686GeLl87EUmrBXYmuOFELVMDwyjKkcId+qjNS1zVWRd53Xd5xKwEDzkCEgen/vCs+lorLLToolXp5oQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jscpd/core": "4.0.1", + "@jscpd/tokenizer": "4.0.1", + "blamer": "^1.0.6", + "bytes": "^3.1.2", + "cli-table3": "^0.6.5", + "colors": "^1.4.0", + "fast-glob": "^3.3.2", + "fs-extra": "^11.2.0", + "markdown-table": "^2.0.0", + "pug": "^3.0.3" + } + }, + "node_modules/@jscpd/html-reporter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@jscpd/html-reporter/-/html-reporter-4.0.1.tgz", + "integrity": "sha512-M9fFETNvXXuy4fWv0M2oMluxwrQUBtubxCHaWw21lb2G8A6SE19moe3dUkluZ/3V4BccywfeF9lSEUg84heLww==", + "dev": true, + "license": "MIT", + "dependencies": { + "colors": "1.4.0", + "fs-extra": "^11.2.0", + "pug": "^3.0.3" + } + }, + "node_modules/@jscpd/tokenizer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@jscpd/tokenizer/-/tokenizer-4.0.1.tgz", + "integrity": "sha512-l/CPeEigadYcQUsUxf1wdCBfNjyAxYcQU04KciFNmSZAMY+ykJ8fZsiuyfjb+oOuDgsIPZZ9YvbvsCr6NBXueg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jscpd/core": "4.0.1", + "reprism": "^0.0.11", + "spark-md5": "^3.0.2" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz", + "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "12.1.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.4.tgz", + "integrity": "sha512-s5Hx+EtN60LMlDBvl5f04bEiFZmAepk27Q+mr85L/00zPDn1jtzlTV6FWn81MaIwqfWzKxmOJrBWHU6vtQyedQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0||^4.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", + "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", + "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", + "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", + "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", + "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", + "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", + "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", + "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", + "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", + "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", + "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", + "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", + "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", + "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", + "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", + "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", + "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", + "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", + "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", + "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", + "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@ts-graphviz/adapter": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ts-graphviz/adapter/-/adapter-2.0.6.tgz", + "integrity": "sha512-kJ10lIMSWMJkLkkCG5gt927SnGZcBuG0s0HHswGzcHTgvtUe7yk5/3zTEr0bafzsodsOq5Gi6FhQeV775nC35Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ts-graphviz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ts-graphviz" + } + ], + "license": "MIT", + "dependencies": { + "@ts-graphviz/common": "^2.1.5" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ts-graphviz/ast": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@ts-graphviz/ast/-/ast-2.0.7.tgz", + "integrity": "sha512-e6+2qtNV99UT6DJSoLbHfkzfyqY84aIuoV8Xlb9+hZAjgpum8iVHprGeAMQ4rF6sKUAxrmY8rfF/vgAwoPc3gw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ts-graphviz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ts-graphviz" + } + ], + "license": "MIT", + "dependencies": { + "@ts-graphviz/common": "^2.1.5" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ts-graphviz/common": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ts-graphviz/common/-/common-2.1.5.tgz", + "integrity": "sha512-S6/9+T6x8j6cr/gNhp+U2olwo1n0jKj/682QVqsh7yXWV6ednHYqxFw0ZsY3LyzT0N8jaZ6jQY9YD99le3cmvg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ts-graphviz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ts-graphviz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@ts-graphviz/core": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@ts-graphviz/core/-/core-2.0.7.tgz", + "integrity": "sha512-w071DSzP94YfN6XiWhOxnLpYT3uqtxJBDYdh6Jdjzt+Ce6DNspJsPQgpC7rbts/B8tEkq0LHoYuIF/O5Jh5rPg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ts-graphviz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ts-graphviz" + } + ], + "license": "MIT", + "dependencies": { + "@ts-graphviz/ast": "^2.0.7", + "@ts-graphviz/common": "^2.1.5" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.28.1.tgz", + "integrity": "sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^10.0.1", + "path-browserify": "^1.0.1", + "tinyglobby": "^0.2.14" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "^5.1.2", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.18.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.10.tgz", + "integrity": "sha512-anNG/V/Efn/YZY4pRzbACnKxNKoBng2VTFydVu8RRs5hQjikP8CQfaeAV59VFSCzKNp90mXiVXW2QzV56rwMrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sarif": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", + "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/vscode": { + "version": "1.105.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.105.0.tgz", + "integrity": "sha512-Lotk3CTFlGZN8ray4VxJE7axIyLZZETQJVWi/lYoUVQuqfRxlQhVOfoejsD2V3dVXPSbS15ov5ZyowMAzgUqcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.1.tgz", + "integrity": "sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/type-utils": "8.46.1", + "@typescript-eslint/utils": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.46.1", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.1.tgz", + "integrity": "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.1.tgz", + "integrity": "sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.1", + "@typescript-eslint/types": "^8.46.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.1.tgz", + "integrity": "sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.1.tgz", + "integrity": "sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.1.tgz", + "integrity": "sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1", + "@typescript-eslint/utils": "8.46.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.1.tgz", + "integrity": "sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.1.tgz", + "integrity": "sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.1", + "@typescript-eslint/tsconfig-utils": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.1.tgz", + "integrity": "sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.1.tgz", + "integrity": "sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.1", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vscode/test-electron": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", + "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "jszip": "^3.10.1", + "ora": "^8.1.0", + "semver": "^7.6.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.22.tgz", + "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/shared": "3.5.22", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", + "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz", + "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/compiler-core": "3.5.22", + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.19", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz", + "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.22.tgz", + "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, "node_modules/@webassemblyjs/utf8": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, - "license": "MIT" + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-jsx-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz", + "integrity": "sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn-loose": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.5.2.tgz", + "integrity": "sha512-PPvV6g8UGMGgjrMu+n/f9E/tCSkNQ2Y97eFvuVdJfG11+xdIeDcLyNdC8SHcrHbRqkfwLASdplyR6B6sKM1U4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-module-path": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", + "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/assert-never": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.4.0.tgz", + "integrity": "sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ast-module-types": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-6.0.1.tgz", + "integrity": "sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.9.6" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.16", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.16.tgz", + "integrity": "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blamer": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/blamer/-/blamer-1.0.6.tgz", + "integrity": "sha512-fv7QToPS87oD1m1bDDTf29zC/bVKJxj2Nqh1r/v4NhMtbnzDIbWOHBYIfxCjlmkVGu3FGOjKgdNG3SFm7TkvBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^4.0.0", + "which": "^2.0.2" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/blamer/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/blamer/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/blamer/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/blamer/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/blamer/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001750", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001750.tgz", + "integrity": "sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-regex": "^1.0.3" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/code-block-writer": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", + "dev": true, + "license": "MIT" + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-env": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", + "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" + }, + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", + "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dependency-cruiser": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/dependency-cruiser/-/dependency-cruiser-17.1.0.tgz", + "integrity": "sha512-8ZtJmSEqG5xAFAMYBclJbvp3R8j4wBw2QTzT0ZhC2cou6c/3u0G6j7coNc/fz0qyo0haQ5ihLt7u0iEnRMui/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "acorn-jsx-walk": "^2.0.0", + "acorn-loose": "^8.5.2", + "acorn-walk": "^8.3.4", + "ajv": "^8.17.1", + "commander": "^14.0.1", + "enhanced-resolve": "^5.18.3", + "ignore": "^7.0.5", + "interpret": "^3.1.1", + "is-installed-globally": "^1.0.0", + "json5": "^2.2.3", + "memoize": "^10.1.0", + "picomatch": "^4.0.3", + "prompts": "^2.4.2", + "rechoir": "^0.8.0", + "safe-regex": "^2.1.1", + "semver": "^7.7.2", + "tsconfig-paths-webpack-plugin": "^4.2.0", + "watskeburt": "^4.2.3" + }, + "bin": { + "depcruise": "bin/dependency-cruise.mjs", + "depcruise-baseline": "bin/depcruise-baseline.mjs", + "depcruise-fmt": "bin/depcruise-fmt.mjs", + "depcruise-wrap-stream-in-html": "bin/wrap-stream-in-html.mjs", + "dependency-cruise": "bin/dependency-cruise.mjs", + "dependency-cruiser": "bin/dependency-cruise.mjs" + }, + "engines": { + "node": "^20.12||^22||>=24" + } + }, + "node_modules/dependency-cruiser/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/dependency-cruiser/node_modules/commander": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.1.tgz", + "integrity": "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/dependency-cruiser/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/dependency-cruiser/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/dependency-tree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/dependency-tree/-/dependency-tree-11.2.0.tgz", + "integrity": "sha512-+C1H3mXhcvMCeu5i2Jpg9dc0N29TWTuT6vJD7mHLAfVmAbo9zW8NlkvQ1tYd3PDMab0IRQM0ccoyX68EZtx9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^12.1.0", + "filing-cabinet": "^5.0.3", + "precinct": "^12.2.0", + "typescript": "^5.8.3" + }, + "bin": { + "dependency-tree": "bin/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/dependency-tree/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detective-amd": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-6.0.1.tgz", + "integrity": "sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-module-types": "^6.0.1", + "escodegen": "^2.1.0", + "get-amd-module-type": "^6.0.1", + "node-source-walk": "^7.0.1" + }, + "bin": { + "detective-amd": "bin/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-cjs": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-6.0.1.tgz", + "integrity": "sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-module-types": "^6.0.1", + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-es6": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-5.0.1.tgz", + "integrity": "sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-postcss": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-7.0.1.tgz", + "integrity": "sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-url": "^1.2.4", + "postcss-values-parser": "^6.0.2" + }, + "engines": { + "node": "^14.0.0 || >=16.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.47" + } + }, + "node_modules/detective-sass": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-6.0.1.tgz", + "integrity": "sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "gonzales-pe": "^4.3.0", + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-scss": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-5.0.1.tgz", + "integrity": "sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==", + "dev": true, + "license": "MIT", + "dependencies": { + "gonzales-pe": "^4.3.0", + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-stylus": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-5.0.1.tgz", + "integrity": "sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-typescript": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-14.0.0.tgz", + "integrity": "sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "^8.23.0", + "ast-module-types": "^6.0.1", + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "typescript": "^5.4.4" + } + }, + "node_modules/detective-vue2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/detective-vue2/-/detective-vue2-2.2.0.tgz", + "integrity": "sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@dependents/detective-less": "^5.0.1", + "@vue/compiler-sfc": "^3.5.13", + "detective-es6": "^5.0.1", + "detective-sass": "^6.0.1", + "detective-scss": "^5.0.1", + "detective-stylus": "^5.0.1", + "detective-typescript": "^14.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "typescript": "^5.4.4" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.235", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.235.tgz", + "integrity": "sha512-i/7ntLFwOdoHY7sgjlTIDo4Sl8EdoTjWIaKinYOVfC6bOp71bmwenyZthWHcasxgHDNWbWxvG9M3Ia116zIaYQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.18.0.tgz", + "integrity": "sha512-02QGCLRW+Jb8PC270ic02lat+N57iBaWsvHjcJViqp6UVupRB+Vsg7brYPTqEFXvsdTql3KnSczv5ModZFpl8Q==", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "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.4", + "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.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "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-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.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.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", + "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.4.0", + "@eslint/core": "^0.16.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.37.0", + "@eslint/plugin-kit": "^0.4.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "28.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.14.0.tgz", + "integrity": "sha512-P9s/qXSMTpRTerE2FQ0qJet2gKbcGyFTPAJipoKxmWqR6uuFqIqk8FuEfg5yBieOezVrEfAMZrEwJ6yEp+1MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "engines": { + "node": "^16.10.0 || ^18.12.0 || >=20.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-sonarjs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-3.0.5.tgz", + "integrity": "sha512-dI62Ff3zMezUToi161hs2i1HX1ie8Ia2hO0jtNBfdgRBicAG4ydy2WPt0rMTrAe3ZrlqhpAO3w1jcQEdneYoFA==", + "dev": true, + "license": "LGPL-3.0-only", + "dependencies": { + "@eslint-community/regexpp": "4.12.1", + "builtin-modules": "3.3.0", + "bytes": "3.1.2", + "functional-red-black-tree": "1.0.1", + "jsx-ast-utils-x": "0.1.0", + "lodash.merge": "4.6.2", + "minimatch": "9.0.5", + "scslre": "0.3.0", + "semver": "7.7.2", + "typescript": ">=5" + }, + "peerDependencies": { + "eslint": "^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-unused-imports": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.2.0.tgz", + "integrity": "sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", + "eslint": "^9.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/filing-cabinet": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-5.0.3.tgz", + "integrity": "sha512-PlPcMwVWg60NQkhvfoxZs4wEHjhlOO/y7OAm4sKM60o1Z9nttRY4mcdQxp/iZ+kg/Vv6Hw1OAaTbYVM9DA9pYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-module-path": "^2.2.0", + "commander": "^12.1.0", + "enhanced-resolve": "^5.18.0", + "module-definition": "^6.0.1", + "module-lookup-amd": "^9.0.3", + "resolve": "^1.22.10", + "resolve-dependency-path": "^4.0.1", + "sass-lookup": "^6.1.0", + "stylus-lookup": "^6.1.0", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.7.3" + }, + "bin": { + "filing-cabinet": "bin/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/filing-cabinet/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/filing-cabinet/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/filing-cabinet/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-amd-module-type": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-6.0.1.tgz", + "integrity": "sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-module-types": "^6.0.1", + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true, + "license": "ISC" }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "node_modules/get-tsconfig": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.12.0.tgz", + "integrity": "sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "node_modules/gitignore-to-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/gitignore-to-glob/-/gitignore-to-glob-0.3.0.tgz", + "integrity": "sha512-mk74BdnK7lIwDHnotHddx1wsjMOFIThpLY3cPNniJ/2fA/tlLzHnFxIdR+4sLOu5KGgQJdij4kjJ2RoUNnCNMA==", "dev": true, "license": "MIT", + "engines": { + "node": ">=4.4 <5 || >=6.9" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", "dev": true, "license": "MIT", + "dependencies": { + "ini": "4.1.1" + }, "engines": { - "node": ">=14.15.0" + "node": ">=18" }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "node_modules/global-directory/node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.15.0" + "node": ">=18" }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, "engines": { - "node": ">=14.15.0" + "node": ">= 0.4" }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gonzales-pe": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", + "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5" }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } + "bin": { + "gonzales": "bin/gonzales.js" + }, + "engines": { + "node": ">=0.6.0" } }, - "node_modules/@xtuc/ieee754": { + "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "license": "BSD-3-Clause" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, - "license": "Apache-2.0" + "license": "ISC" }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, "bin": { - "acorn": "bin/acorn" + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" }, "engines": { - "node": ">=0.4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">= 0.4" }, - "peerDependencies": { - "acorn": "^8.14.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, "engines": { - "node": ">= 14" + "node": ">= 0.4" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "bin": { + "he": "bin/he" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "engines": { + "node": ">= 14" } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "agent-base": "^7.1.2", + "debug": "4" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">= 14" } }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 4" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, - "license": "Python-2.0" + "license": "ISC" }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } }, - "node_modules/baseline-browser-mapping": { - "version": "2.8.16", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.16.tgz", - "integrity": "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==", + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true, - "license": "ISC" - }, - "node_modules/browserslist": { - "version": "4.26.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", - "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.9", - "caniuse-lite": "^1.0.30001746", - "electron-to-chromium": "^1.5.227", - "node-releases": "^2.0.21", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001750", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001750.tgz", - "integrity": "sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 0.4" }, "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "node_modules/is-expression/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">= 6" + "node": ">=0.4.0" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=6.0" + "node": ">=0.10.0" } }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^5.0.0" + "call-bound": "^1.0.3" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "node": ">=8" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/is-installed-globally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", + "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "global-directory": "^4.0.1", + "is-path-inside": "^4.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true, "license": "MIT" }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true, "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/decamelize": { + "node_modules/is-path-inside": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=0.3.1" + "node": ">=8" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "license": "MIT", "dependencies": { - "path-type": "^4.0.0" + "isobject": "^3.0.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/electron-to-chromium": { - "version": "1.5.235", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.235.tgz", - "integrity": "sha512-i/7ntLFwOdoHY7sgjlTIDo4Sl8EdoTjWIaKinYOVfC6bOp71bmwenyZthWHcasxgHDNWbWxvG9M3Ia116zIaYQ==", + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/enhanced-resolve": { - "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/envinfo": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.18.0.tgz", - "integrity": "sha512-02QGCLRW+Jb8PC270ic02lat+N57iBaWsvHjcJViqp6UVupRB+Vsg7brYPTqEFXvsdTql3KnSczv5ModZFpl8Q==", + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escape-string-regexp": { + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-url-superb": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", + "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", "dev": true, "license": "MIT", "engines": { @@ -1555,857 +7641,970 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", - "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" - }, - "bin": { - "eslint": "bin/eslint.js" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "call-bound": "^1.0.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "license": "MIT" }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, + "license": "BSD-3-Clause", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8" } }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "estraverse": "^5.1.0" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=0.10" + "node": ">=10" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "license": "BSD-2-Clause", + "license": "BSD-3-Clause", "dependencies": { - "estraverse": "^5.2.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4.0" + "node": ">=10" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "license": "BSD-2-Clause", + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, "engines": { - "node": ">=4.0" + "node": ">=10" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-2-Clause", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, "engines": { - "node": ">=0.8.x" + "node": ">=8" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, - "license": "MIT" + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", "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" + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" }, "engines": { - "node": ">=8.6.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, "engines": { - "node": ">= 4.9.1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "flat-cache": "^3.0.4" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/jest-cli/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/jest-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12" } }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=12" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/jest-config/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "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" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/jest-config/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "brace-expansion": "^1.1.7" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": "*" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=10.13.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "detect-newline": "^3.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", "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" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "node_modules/jest-haste-map/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">= 14" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "node_modules/jest-haste-map/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 14" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, "engines": { - "node": ">= 4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, "engines": { - "node": ">=0.8.19" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, "engines": { - "node": ">=10.13.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/jest-runner/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/jest-runner/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "node_modules/jest-runner/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, "engines": { - "node": ">=0.12.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/jest-runtime/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "MIT", + "license": "ISC", + "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" + }, "engines": { - "node": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/jest-runtime/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "isobject": "^3.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "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" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", + "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" + }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@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" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker": { @@ -2439,6 +8638,20 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2452,6 +8665,62 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jscpd": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/jscpd/-/jscpd-4.0.5.tgz", + "integrity": "sha512-AzJlSLvKtXYkQm93DKE1cRN3rf6pkpv3fm5TVuvECwoqljQlCM/56ujHn9xPcE7wyUnH5+yHr7tcTiveIoMBoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jscpd/core": "4.0.1", + "@jscpd/finder": "4.0.1", + "@jscpd/html-reporter": "4.0.1", + "@jscpd/tokenizer": "4.0.1", + "colors": "^1.4.0", + "commander": "^5.0.0", + "fs-extra": "^11.2.0", + "gitignore-to-glob": "^0.3.0", + "jscpd-sarif-reporter": "4.0.3" + }, + "bin": { + "jscpd": "bin/jscpd" + } + }, + "node_modules/jscpd-sarif-reporter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/jscpd-sarif-reporter/-/jscpd-sarif-reporter-4.0.3.tgz", + "integrity": "sha512-0T7KiWiDIVArvlBkvCorn2NFwQe7p7DJ37o4YFRuPLDpcr1jNHQlEfbFPw8hDdgJ4hpfby6A5YwyHqASKJ7drA==", + "dev": true, + "license": "MIT", + "dependencies": { + "colors": "^1.4.0", + "fs-extra": "^11.2.0", + "node-sarif-builder": "^2.0.3" + } + }, + "node_modules/jscpd/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -2480,6 +8749,53 @@ "dev": true, "license": "MIT" }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "node_modules/jsx-ast-utils-x": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils-x/-/jsx-ast-utils-x-0.1.0.tgz", + "integrity": "sha512-eQQBjBnsVtGacsG9uJNB8qOr3yA8rga4wAaGG1qRcBzSIvfhERLrWxMAM1hp5fcS6Abo8M4+bUBTekYR0qTPQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -2513,6 +8829,26 @@ "node": ">=0.10.0" } }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2537,6 +8873,13 @@ "immediate": "~3.0.5" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/loader-runner": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", @@ -2567,6 +8910,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -2574,30 +8924,263 @@ "dev": true, "license": "MIT" }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/madge": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/madge/-/madge-8.0.0.tgz", + "integrity": "sha512-9sSsi3TBPhmkTCIpVQF0SPiChj1L7Rq9kU2KDG1o6v2XH9cCw086MopjVCD+vuoL5v8S77DTbVopTO8OUiQpIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "commander": "^7.2.0", + "commondir": "^1.0.1", + "debug": "^4.3.4", + "dependency-tree": "^11.0.0", + "ora": "^5.4.1", + "pluralize": "^8.0.0", + "pretty-ms": "^7.0.1", + "rc": "^1.2.8", + "stream-to-array": "^2.3.0", + "ts-graphviz": "^2.1.2", + "walkdir": "^0.4.1" + }, + "bin": { + "madge": "bin/cli.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "individual", + "url": "https://www.paypal.me/pahen" + }, + "peerDependencies": { + "typescript": "^5.4.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/madge/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/madge/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/madge/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/madge/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/madge/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/madge/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/madge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/make-coverage-badge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-coverage-badge/-/make-coverage-badge-1.2.0.tgz", + "integrity": "sha512-nA1eQZJ9vcY2UoQLVIdzqyRoNtAZHWlXJfrHkaMB/pQgTYBPmbImkykfxWeAtUQuLJXzb6eAhbR7nEgrt+S7FA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "1.1.4" + }, + "bin": { + "make-coverage-badge": "cli.js" + }, + "engines": { + "node": ">=6.11", + "npm": ">=5.3" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/memoize": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.1.0.tgz", + "integrity": "sha512-MMbFhJzh4Jlg/poq1si90XRlTZRDHVqdlz2mPyGJ6kqMpyHUyVpDd5gpFAvVehW64+RA1eKE9Yt8aSLY7w2Kgg==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "mimic-function": "^5.0.1" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sindresorhus/memoize?sponsor=1" } }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -2652,6 +9235,16 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", @@ -2666,9 +9259,9 @@ } }, "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -2681,6 +9274,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -2777,6 +9380,108 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/module-definition": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-6.0.1.tgz", + "integrity": "sha512-FeVc50FTfVVQnolk/WQT8MX+2WVcDnTGiq6Wo+/+lJ2ET1bRVi3HG3YlJUfqagNMc/kUlFSoR96AJkxGpKz13g==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-module-types": "^6.0.1", + "node-source-walk": "^7.0.1" + }, + "bin": { + "module-definition": "bin/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/module-lookup-amd": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/module-lookup-amd/-/module-lookup-amd-9.0.5.tgz", + "integrity": "sha512-Rs5FVpVcBYRHPLuhHOjgbRhosaQYLtEo3JIeDIbmNo7mSssi1CTzwMh8v36gAzpbzLGXI9wB/yHh+5+3fY1QVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^12.1.0", + "glob": "^7.2.3", + "requirejs": "^2.3.7", + "requirejs-config-file": "^4.0.0" + }, + "bin": { + "lookup-amd": "bin/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/module-lookup-amd/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/module-lookup-amd/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/module-lookup-amd/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/module-lookup-amd/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mri": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2784,6 +9489,41 @@ "dev": true, "license": "MIT" }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -2798,6 +9538,13 @@ "dev": true, "license": "MIT" }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, "node_modules/node-releases": { "version": "2.0.23", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", @@ -2805,6 +9552,48 @@ "dev": true, "license": "MIT" }, + "node_modules/node-sarif-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-sarif-builder/-/node-sarif-builder-2.0.3.tgz", + "integrity": "sha512-Pzr3rol8fvhG/oJjIq2NTVB0vmdNNlz22FENhhPojYRZ4/ee08CfK4YuKmuL54V9MLhI1kpzxfOJ/63LzmZzDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/sarif": "^2.1.4", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/node-sarif-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/node-source-walk": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-7.0.1.tgz", + "integrity": "sha512-3VW/8JpPqPvnJvseXowjZcirPisssnBuDikk6JIZ8jQzF7KJQX52iPFX4RYYxLycYH7IbMRSPUOga/esVjy5Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.7" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -2815,6 +9604,135 @@ "node": ">=0.10.0" } }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2984,13 +9902,31 @@ "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/p-limit": { @@ -3062,6 +9998,42 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3116,16 +10088,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3146,6 +10108,53 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pino": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-10.0.0.tgz", + "integrity": "sha512-eI9pKwWEix40kfvSzqEP6ldqOoBIN7dwD/o91TY5z8vQI12sAffpR/pOqAD1IVVwIVHDpHjkq0joBPdJD0rafA==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "slow-redact": "^0.3.0", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", + "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", + "license": "MIT" + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -3215,6 +10224,113 @@ "node": ">=8" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-values-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.2.tgz", + "integrity": "sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "color-name": "^1.1.4", + "is-url-superb": "^4.0.0", + "quote-unquote": "^1.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.2.9" + } + }, + "node_modules/precinct": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/precinct/-/precinct-12.2.0.tgz", + "integrity": "sha512-NFBMuwIfaJ4SocE9YXPU/n4AcNSoFMVFjP72nvl3cx69j/ke61/hPOWFREVxLkFhhEGnA8ZuVfTqJBa+PK3b5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@dependents/detective-less": "^5.0.1", + "commander": "^12.1.0", + "detective-amd": "^6.0.1", + "detective-cjs": "^6.0.1", + "detective-es6": "^5.0.1", + "detective-postcss": "^7.0.1", + "detective-sass": "^6.0.1", + "detective-scss": "^5.0.1", + "detective-stylus": "^5.0.1", + "detective-typescript": "^14.0.0", + "detective-vue2": "^2.2.0", + "module-definition": "^6.0.1", + "node-source-walk": "^7.0.1", + "postcss": "^8.5.1", + "typescript": "^5.7.3" + }, + "bin": { + "precinct": "bin/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/precinct/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -3225,29 +10341,273 @@ "node": ">= 0.8.0" } }, - "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/process-warning": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz", + "integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pug": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", + "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pug-code-gen": "^3.0.3", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" + } + }, + "node_modules/pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "node_modules/pug-code-gen": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz", + "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.1.0", + "pug-runtime": "^3.0.1", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "node_modules/pug-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz", + "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==", + "dev": true, + "license": "MIT" + }, + "node_modules/pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "node_modules/pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pug-error": "^2.0.0", + "token-stream": "1.0.0" + } + }, + "node_modules/pug-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", + "dev": true, + "license": "MIT" + }, + "node_modules/pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", "dev": true, "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "dependencies": { + "pug-error": "^2.0.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "node_modules/pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", "dev": true, "license": "MIT" }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -3258,6 +10618,23 @@ "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3279,6 +10656,19 @@ ], "license": "MIT" }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, + "node_modules/quote-unquote": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz", + "integrity": "sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==", + "dev": true, + "license": "MIT" + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -3289,6 +10679,39 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -3318,6 +10741,15 @@ "node": ">=8.10.0" } }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", @@ -3331,6 +10763,104 @@ "node": ">= 10.13.0" } }, + "node_modules/refa": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/refa/-/refa-0.12.1.tgz", + "integrity": "sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp-ast-analysis": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz", + "integrity": "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0", + "refa": "^0.12.1" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/reprism": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/reprism/-/reprism-0.0.11.tgz", + "integrity": "sha512-VsxDR5QxZo08M/3nRypNlScw5r3rKeSOPdU/QhDmu3Ai3BJxHn/qgfXGWQp/tAxUtzwYNo9W6997JZR0tPLZsA==", + "dev": true, + "license": "MIT" + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3351,6 +10881,34 @@ "node": ">=0.10.0" } }, + "node_modules/requirejs": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.7.tgz", + "integrity": "sha512-DouTG8T1WanGok6Qjg2SXuCMzszOo0eHeH9hDZ5Y4x8Je+9JB38HdTLT4/VA8OaUhBa0JPVHJ0pyBkM1z+pDsw==", + "dev": true, + "license": "MIT", + "bin": { + "r_js": "bin/r.js", + "r.js": "bin/r.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/requirejs-config-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/requirejs-config-file/-/requirejs-config-file-4.0.0.tgz", + "integrity": "sha512-jnIre8cbWOyvr8a5F2KuqBnY+SDA4NXr/hzEZJG79Mxm2WiFQz2dzhC8ibtPJS7zkmBEl1mxSwp5HhC1W4qpxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esprima": "^4.0.0", + "stringify-object": "^3.2.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -3395,6 +10953,16 @@ "node": ">=8" } }, + "node_modules/resolve-dependency-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/resolve-dependency-path/-/resolve-dependency-path-4.0.1.tgz", + "integrity": "sha512-YQftIIC4vzO9UMhO/sCgXukNyiwVRCVaxiWskCBy7Zpqkplm8kTAISZ8O1MoKW1ca6xzgLUBjZTcDgypXvXxiQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3405,6 +10973,26 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -3433,99 +11021,193 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/rollup": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", + "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "@types/estree": "1.0.8" }, "bin": { - "rimraf": "bin.js" + "rollup": "dist/bin/rollup" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.4", + "@rollup/rollup-android-arm64": "4.52.4", + "@rollup/rollup-darwin-arm64": "4.52.4", + "@rollup/rollup-darwin-x64": "4.52.4", + "@rollup/rollup-freebsd-arm64": "4.52.4", + "@rollup/rollup-freebsd-x64": "4.52.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", + "@rollup/rollup-linux-arm-musleabihf": "4.52.4", + "@rollup/rollup-linux-arm64-gnu": "4.52.4", + "@rollup/rollup-linux-arm64-musl": "4.52.4", + "@rollup/rollup-linux-loong64-gnu": "4.52.4", + "@rollup/rollup-linux-ppc64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-musl": "4.52.4", + "@rollup/rollup-linux-s390x-gnu": "4.52.4", + "@rollup/rollup-linux-x64-gnu": "4.52.4", + "@rollup/rollup-linux-x64-musl": "4.52.4", + "@rollup/rollup-openharmony-arm64": "4.52.4", + "@rollup/rollup-win32-arm64-msvc": "4.52.4", + "@rollup/rollup-win32-ia32-msvc": "4.52.4", + "@rollup/rollup-win32-x64-gnu": "4.52.4", + "@rollup/rollup-win32-x64-msvc": "4.52.4", + "fsevents": "~2.3.2" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "queue-microtask": "^1.2.2" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, - "license": "ISC", + "license": "MIT", "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" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" }, "engines": { - "node": "*" + "node": ">=0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "es-errors": "^1.3.0", + "isarray": "^2.0.5" }, "engines": { - "node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "regexp-tree": "~0.1.1" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/sass-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sass-lookup/-/sass-lookup-6.1.0.tgz", + "integrity": "sha512-Zx+lVyoWqXZxHuYWlTA17Z5sczJ6braNT2C7rmClw+c4E7r/n911Zwss3h1uHI9reR5AgHZyNHF7c2+VIp5AUA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "commander": "^12.1.0", + "enhanced-resolve": "^5.18.0" + }, + "bin": { + "sass-lookup": "bin/cli.js" + }, + "engines": { + "node": ">=18" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "node_modules/sass-lookup/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/schema-utils": { "version": "4.3.3", @@ -3584,6 +11266,21 @@ "dev": true, "license": "MIT" }, + "node_modules/scslre": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/scslre/-/scslre-0.3.0.tgz", + "integrity": "sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0", + "refa": "^0.12.0", + "regexp-ast-analysis": "^0.7.0" + }, + "engines": { + "node": "^14.0.0 || >=16.0.0" + } + }, "node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -3607,6 +11304,55 @@ "randombytes": "^2.1.0" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -3650,6 +11396,82 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -3663,6 +11485,13 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -3673,6 +11502,28 @@ "node": ">=8" } }, + "node_modules/slow-redact": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/slow-redact/-/slow-redact-0.3.2.tgz", + "integrity": "sha512-MseHyi2+E/hBRqdOi5COy6wZ7j7DxXRz9NkseavNYSvvWC06D8a5cidVZX3tcG5eCW3NIyVU4zT63hw0Q486jw==", + "license": "MIT" + }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true, + "license": "MIT" + }, + "node_modules/sonic-boom": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", + "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, "node_modules/source-map": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", @@ -3683,6 +11534,16 @@ "node": ">= 12" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -3704,6 +11565,59 @@ "node": ">=0.10.0" } }, + "node_modules/spark-md5": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz", + "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/stdin-discarder": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", @@ -3717,6 +11631,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-to-array": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", + "integrity": "sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.1.0" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3727,6 +11665,20 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -3797,6 +11749,80 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -3824,6 +11850,26 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3837,6 +11883,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylus-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/stylus-lookup/-/stylus-lookup-6.1.0.tgz", + "integrity": "sha512-5QSwgxAzXPMN+yugy61C60PhoANdItfdjSEZR8siFwz7yL9jTmV0UBKDCfn3K8GkGB4g0Y9py7vTCX8rFu4/pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^12.1.0" + }, + "bin": { + "stylus-lookup": "bin/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/stylus-lookup/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3863,6 +11935,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, "node_modules/tapable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", @@ -3931,60 +12019,436 @@ } } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/token-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", "dev": true, "license": "MIT" }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-graphviz": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/ts-graphviz/-/ts-graphviz-2.1.6.tgz", + "integrity": "sha512-XyLVuhBVvdJTJr2FJJV2L1pc4MwSjMhcunRVgDE9k4wbb2ee7ORYnPewxMWUav12vxyfUM686MSGsqnVRIInuw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ts-graphviz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ts-graphviz" + } + ], + "license": "MIT", + "dependencies": { + "@ts-graphviz/adapter": "^2.0.6", + "@ts-graphviz/ast": "^2.0.7", + "@ts-graphviz/common": "^2.1.5", + "@ts-graphviz/core": "^2.0.7" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ts-jest": { + "version": "29.4.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.5.tgz", + "integrity": "sha512-HO3GyiWn2qvTQA4kTgjDcXiMwYQt68a1Y8+JuLRVpdIzm+UOLSHgl/XqR4c6nzJkq5rOkjc02O2I7P7l/Yof0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-jest/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/ts-loader": { + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.4.tgz", + "integrity": "sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-morph": { + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-27.0.2.tgz", + "integrity": "sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.28.1", + "code-block-writer": "^13.0.3" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.2.0.tgz", + "integrity": "sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tapable": "^2.2.1", + "tsconfig-paths": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">=8.0" + "node": ">=6" } }, - "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=16" + "dependencies": { + "minimist": "^1.2.0" }, - "peerDependencies": { - "typescript": ">=4.2.0" + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/ts-loader": { - "version": "9.5.4", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.4.tgz", - "integrity": "sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==", + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", - "source-map": "^0.7.4" - }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" + "node": ">=4" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3998,10 +12462,20 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -4011,6 +12485,84 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -4025,6 +12577,39 @@ "node": ">=14.17" } }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -4032,6 +12617,51 @@ "dev": true, "license": "MIT" }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -4080,6 +12710,58 @@ "dev": true, "license": "MIT" }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/walkdir": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", + "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, "node_modules/watchpack": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", @@ -4094,6 +12776,29 @@ "node": ">=10.13.0" } }, + "node_modules/watskeburt": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/watskeburt/-/watskeburt-4.2.3.tgz", + "integrity": "sha512-uG9qtQYoHqAsnT711nG5iZc/8M5inSmkGCOp7pFaytKG2aTfIca7p//CjiVzAE4P7hzaYuCozMjNNaLgmhbK5g==", + "dev": true, + "license": "MIT", + "bin": { + "watskeburt": "dist/run-cli.js" + }, + "engines": { + "node": "^18||>=20" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/webpack": { "version": "5.102.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", @@ -4264,6 +12969,102 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -4271,6 +13072,22 @@ "dev": true, "license": "MIT" }, + "node_modules/with": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + }, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -4281,6 +13098,13 @@ "node": ">=0.10.0" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/workerpool": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", @@ -4396,6 +13220,27 @@ "dev": true, "license": "ISC" }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -4406,6 +13251,13 @@ "node": ">=10" } }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -4473,6 +13325,16 @@ "node": ">=8" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 5743b37..1e263d3 100644 --- a/package.json +++ b/package.json @@ -1,84 +1,150 @@ { - "name": "barrel-roll", - "displayName": "Barrel Roll", - "description": "Automatically export types, functions, constants, and classes through barrel files", - "version": "0.0.1", - "publisher": "coderrob", + "activationEvents": [ + "onCommand:barrel-roll.generateBarrel", + "onCommand:barrel-roll.generateBarrelRecursive", + "onCommand:barrel-roll.updateBarrel" + ], "author": { "name": "Coderrob" }, - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/Coderrob/barrel-roll.git" - }, "bugs": { "url": "https://github.com/Coderrob/barrel-roll/issues" }, - "homepage": "https://github.com/Coderrob/barrel-roll#readme", - "keywords": [ - "barrel", - "barrel-file", - "export", - "typescript", - "index", - "module", - "organization" - ], - "engines": { - "vscode": "^1.80.0" - }, "categories": [ "Other" ], - "activationEvents": [], - "main": "./dist/extension.js", "contributes": { "commands": [ { "command": "barrel-roll.generateBarrel", "title": "Barrel Roll: Generate/Update index.ts" + }, + { + "command": "barrel-roll.generateBarrelRecursive", + "title": "Barrel Roll: Generate/Update index.ts (Recursive)" + }, + { + "command": "barrel-roll.updateBarrel", + "title": "Barrel Roll: Update Existing index.ts Files" } ], "menus": { + "commandPalette": [ + { + "command": "barrel-roll.generateBarrel", + "when": "true" + }, + { + "command": "barrel-roll.generateBarrelRecursive", + "when": "true" + }, + { + "command": "barrel-roll.updateBarrel", + "when": "true" + } + ], "explorer/context": [ { - "when": "explorerResourceIsFolder", "command": "barrel-roll.generateBarrel", - "group": "2_workspace" + "group": "navigation@1", + "when": "explorerResourceIsFolder" + }, + { + "command": "barrel-roll.generateBarrelRecursive", + "group": "navigation@2", + "when": "explorerResourceIsFolder" + }, + { + "command": "barrel-roll.updateBarrel", + "group": "navigation@3", + "when": "explorerResourceIsFolder" } ] } }, - "scripts": { - "vscode:prepublish": "npm run package", - "compile": "webpack", - "watch": "webpack --watch", - "package": "webpack --mode production --devtool hidden-source-map", - "compile-tests": "tsc -p . --outDir out", - "watch-tests": "tsc -p . -w --outDir out", - "pretest": "npm run compile-tests && npm run compile && npm run lint", - "lint": "eslint src --ext ts", - "lint:fix": "eslint src --ext ts --fix", - "test": "node ./out/test/runTest.js", - "format": "prettier --write \"src/**/*.ts\"", - "format:check": "prettier --check \"src/**/*.ts\"" - }, + "description": "Automatically export types, functions, constants, and classes through barrel files", "devDependencies": { + "@jest/globals": "^29.7.0", + "@rollup/plugin-node-resolve": "^16.0.0", + "@rollup/plugin-terser": "^0.4.4", + "@rollup/plugin-typescript": "^12.1.2", "@types/glob": "^8.1.0", + "@types/jest": "^29.5.14", "@types/mocha": "^10.0.1", - "@types/node": "20.x", + "@types/node": "^22.x", "@types/vscode": "^1.80.0", - "@typescript-eslint/eslint-plugin": "^6.4.1", - "@typescript-eslint/parser": "^6.4.1", + "@typescript-eslint/eslint-plugin": "^8.23.0", + "@typescript-eslint/parser": "^8.23.0", "@vscode/test-electron": "^2.3.4", - "eslint": "^8.47.0", + "cross-env": "^10.1.0", + "dependency-cruiser": "^17.1.0", + "eslint": "^9.20.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jest": "^28.11.0", + "eslint-plugin-prettier": "^5.2.3", + "eslint-plugin-sonarjs": "^3.0.5", + "eslint-plugin-unused-imports": "^4.2.0", "glob": "^10.3.3", + "jest": "^29.7.0", + "jscpd": "^4.0.5", + "madge": "^8.0.0", + "make-coverage-badge": "^1.2.0", "mocha": "^10.2.0", - "prettier": "^3.0.2", + "prettier": "^3.5.0", + "rollup": "^4.34.6", + "ts-jest": "^29.2.5", "ts-loader": "^9.4.4", + "ts-morph": "^27.0.2", + "ts-node": "^10.9.2", + "tslib": "^2.8.1", "typescript": "^5.1.6", "webpack": "^5.88.2", "webpack-cli": "^5.1.4" + }, + "displayName": "Barrel Roll", + "engines": { + "vscode": "^1.80.0" + }, + "homepage": "https://github.com/Coderrob/barrel-roll#readme", + "keywords": [ + "barrel", + "barrel-file", + "export", + "typescript", + "index", + "module", + "organization" + ], + "license": "Apache-2.0", + "main": "./dist/extension.js", + "name": "@coderrob/barrel-roll", + "publisher": "coderrob", + "repository": { + "type": "git", + "url": "https://github.com/Coderrob/barrel-roll.git" + }, + "scripts": { + "compile": "webpack", + "compile-tests": "tsc -p . --outDir out", + "coverage": "make-coverage-badge --output-path ./badges/coverage.svg", + "duplication": "jscpd src", + "format": "prettier --write \"src/**/*.ts\"", + "format:check": "prettier --check \"src/**/*.ts\"", + "lint": "prettier --check . && eslint .", + "lint:fix": "prettier --write . && eslint --fix .", + "madge": "madge --circular --orphans src", + "package": "webpack --mode production --devtool hidden-source-map", + "pretest": "npm run compile-tests && npm run compile && npm run lint", + "quality": "npm run lint && npm run duplication && npm run madge", + "test": "node ./out/test/runTest.js", + "typecheck": "tsc --noEmit", + "vscode:prepublish": "npm run package", + "watch": "webpack --watch", + "watch-tests": "tsc -p . -w --outDir out" + }, + "version": "0.0.1", + "dependencies": { + "pino": "^10.0.0" } } diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..1759573 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,77 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import nodeResolve from '@rollup/plugin-node-resolve'; +import typescript from '@rollup/plugin-typescript'; +import terser from '@rollup/plugin-terser'; + +/** + * @typedef {Object} RollupWarning + * @property {string} code + * @property {string[]} [ids] + */ + +const config = { + input: 'src/index.ts', + external: (id) => { + // Keep all pino* as external for smaller bundle + return id.startsWith('pino'); + }, + /** + * @param {RollupWarning} warning + * @param {(warning: RollupWarning) => void} warn + */ + onwarn: (warning, warn) => { + // Ignore circular dependency warnings from third-party modules + if ( + warning.code === 'CIRCULAR_DEPENDENCY' && + warning.ids?.some((id) => id.includes('node_modules')) + ) { + return; + } + warn(warning); + }, + output: { + file: 'dist/index.mjs', + format: 'es', + esModule: true, + sourcemap: false, + compact: true, + minifyInternalExports: true, + }, + plugins: [ + typescript({ + tsconfig: './tsconfig.json', + }), + nodeResolve({ + preferBuiltins: true, + exportConditions: ['node'], + modulesOnly: true, + }), + terser({ + format: { + comments: false, + }, + compress: { + drop_console: false, // Keep console for runtime logging + drop_debugger: true, + pure_funcs: ['console.debug'], + }, + }), + ], +}; + +export default config; diff --git a/src/__tests__/core/services/barrel-content.builder.test.ts b/src/__tests__/core/services/barrel-content.builder.test.ts new file mode 100644 index 0000000..7f483be --- /dev/null +++ b/src/__tests__/core/services/barrel-content.builder.test.ts @@ -0,0 +1,24 @@ +import { BarrelContentBuilder, BarrelEntry } from '../../../core/services/barrel-content.builder'; + +describe('BarrelContentBuilder', () => { + it('builds export statements for files and nested directories', () => { + const builder = new BarrelContentBuilder(); + const entries = new Map(); + + entries.set('alpha.ts', { kind: 'file', exports: ['Alpha'] }); + entries.set('beta.ts', { kind: 'file', exports: ['Bravo', 'default'] }); + entries.set('nested', { kind: 'directory' }); + + const source = builder.buildContent(entries, ''); + + expect(source).toBe( + [ + "export { Alpha } from './alpha';", + "export { Bravo } from './beta';", + "export { default } from './beta';", + "export * from './nested';", + '', + ].join('\n'), + ); + }); +}); diff --git a/src/__tests__/core/services/barrel-file.generator.test.ts b/src/__tests__/core/services/barrel-file.generator.test.ts new file mode 100644 index 0000000..118df72 --- /dev/null +++ b/src/__tests__/core/services/barrel-file.generator.test.ts @@ -0,0 +1,97 @@ +import { promises as fs } from 'fs'; +import * as os from 'os'; +import * as path from 'path'; + +import type { Uri } from 'vscode'; + +import { BarrelFileGenerator } from '../../../core/services/barrel-file.generator'; + +describe('BarrelFileGenerator', () => { + let tmpDir: string; + + beforeEach(async () => { + tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'barrel-roll-')); + }); + + afterEach(async () => { + await fs.rm(tmpDir, { recursive: true, force: true }); + }); + + it('generates recursive barrel files for nested directories', async () => { + const nestedDir = path.join(tmpDir, 'nested'); + const deeperDir = path.join(nestedDir, 'deeper'); + + await fs.mkdir(deeperDir, { recursive: true }); + + await fs.writeFile(path.join(tmpDir, 'alpha.ts'), 'export const alpha = 1;'); + await fs.writeFile( + path.join(nestedDir, 'bravo.ts'), + ` + export interface Bravo {} + export default function bravo() {} + `, + 'utf-8', + ); + await fs.writeFile( + path.join(deeperDir, 'charlie.ts'), + ` + export { default as charlie } from './impl'; + `, + 'utf-8', + ); + await fs.writeFile( + path.join(deeperDir, 'impl.ts'), + 'export default function impl() {}', + 'utf-8', + ); + + const generator = new BarrelFileGenerator(); + const rootUri = { fsPath: tmpDir } as unknown as Uri; + await generator.generateBarrelFile(rootUri, { recursive: true }); + + const rootIndex = await fs.readFile(path.join(tmpDir, 'index.ts'), 'utf-8'); + const nestedIndex = await fs.readFile(path.join(nestedDir, 'index.ts'), 'utf-8'); + const deeperIndex = await fs.readFile(path.join(deeperDir, 'index.ts'), 'utf-8'); + + expect(rootIndex).toBe( + ["export { alpha } from './alpha';", "export * from './nested';", ''].join('\n'), + ); + + expect(nestedIndex).toBe( + [ + "export { Bravo } from './bravo';", + "export { default } from './bravo';", + "export * from './deeper';", + '', + ].join('\n'), + ); + + expect(deeperIndex).toBe( + ["export { charlie } from './charlie';", "export { default } from './impl';", ''].join('\n'), + ); + }); + + it('sanitizes existing barrels when updating', async () => { + const generator = new BarrelFileGenerator(); + const rootUri = { fsPath: tmpDir } as unknown as Uri; + + await fs.writeFile(path.join(tmpDir, 'index.ts'), "export * from '../outside';", 'utf-8'); + + await generator.generateBarrelFile(rootUri, { mode: 'updateExisting' }); + + const rootIndex = await fs.readFile(path.join(tmpDir, 'index.ts'), 'utf-8'); + + expect(rootIndex).toBe('\n'); + }); + + it('skips creating barrels when updating non-existent ones', async () => { + const generator = new BarrelFileGenerator(); + const nestedDir = path.join(tmpDir, 'missing'); + await fs.mkdir(nestedDir); + + const nestedUri = { fsPath: nestedDir } as unknown as Uri; + await generator.generateBarrelFile(nestedUri, { mode: 'updateExisting' }); + + await expect(fs.stat(path.join(nestedDir, 'index.ts'))).rejects.toThrow(); + }); +}); diff --git a/src/__tests__/core/services/export.parser.test.ts b/src/__tests__/core/services/export.parser.test.ts new file mode 100644 index 0000000..0905f28 --- /dev/null +++ b/src/__tests__/core/services/export.parser.test.ts @@ -0,0 +1,17 @@ +import { ExportParser } from '../../../core/services/export.parser'; + +describe('ExportParser', () => { + it('captures named, default, and aliased exports', () => { + const parser = new ExportParser(); + const source = ` + export const alpha = 1; + export function bravo() {} + export { charlie as delta, echo }; + export default class Foxtrot {} + `; + + const result = parser.extractExports(source); + + expect(result.sort()).toEqual(['alpha', 'bravo', 'delta', 'echo', 'default'].sort()); + }); +}); diff --git a/src/__tests__/filters/log-filters.test.ts b/src/__tests__/filters/log-filters.test.ts new file mode 100644 index 0000000..4186391 --- /dev/null +++ b/src/__tests__/filters/log-filters.test.ts @@ -0,0 +1,144 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { LogFilters, LogLevel } from '../../logging/index.js'; + +describe('LogFilters', () => { + describe('levelFilter', () => { + it('should allow logs at or above the minimum level', () => { + const filter = LogFilters.levelFilter(LogLevel.WARNING); + + expect(filter(LogLevel.ERROR, 'test message')).toBe(true); + expect(filter(LogLevel.WARNING, 'test message')).toBe(true); + expect(filter(LogLevel.INFO, 'test message')).toBe(false); + expect(filter(LogLevel.DEBUG, 'test message')).toBe(false); + }); + + it('should handle unknown log levels as INFO level', () => { + const filter = LogFilters.levelFilter(LogLevel.WARNING); + + expect(filter('unknown', 'test message')).toBe(false); // INFO level (1) < WARNING level (2) + }); + + it('should allow all logs when minimum level is DEBUG', () => { + const filter = LogFilters.levelFilter(LogLevel.DEBUG); + + expect(filter(LogLevel.DEBUG, 'test message')).toBe(true); + expect(filter(LogLevel.INFO, 'test message')).toBe(true); + expect(filter(LogLevel.WARNING, 'test message')).toBe(true); + expect(filter(LogLevel.ERROR, 'test message')).toBe(true); + }); + }); + + describe('excludePattern', () => { + it('should exclude messages matching string pattern', () => { + const filter = LogFilters.excludePattern('error'); + + expect(filter(LogLevel.ERROR, 'This is an error message')).toBe(false); + expect(filter(LogLevel.INFO, 'This is a normal message')).toBe(true); + }); + + it('should exclude messages matching RegExp pattern', () => { + const filter = LogFilters.excludePattern(/error/i); + + expect(filter(LogLevel.ERROR, 'This is an ERROR message')).toBe(false); + expect(filter(LogLevel.INFO, 'This is a normal message')).toBe(true); + }); + + it('should handle messages without pattern match', () => { + const filter = LogFilters.excludePattern('error'); + + expect(filter(LogLevel.INFO, 'This is a success message')).toBe(true); + }); + }); + + describe('includePattern', () => { + it('should include only messages matching string pattern', () => { + const filter = LogFilters.includePattern('important'); + + expect(filter(LogLevel.INFO, 'This is an important message')).toBe(true); + expect(filter(LogLevel.ERROR, 'This is a normal error')).toBe(false); + }); + + it('should include only messages matching RegExp pattern', () => { + const filter = LogFilters.includePattern(/important/i); + + expect(filter(LogLevel.INFO, 'This is an IMPORTANT message')).toBe(true); + expect(filter(LogLevel.ERROR, 'This is a normal error')).toBe(false); + }); + }); + + describe('metadataFilter', () => { + it('should filter based on metadata predicate', () => { + const filter = LogFilters.metadataFilter((metadata) => metadata?.priority === 'high'); + + expect(filter(LogLevel.INFO, 'message', { priority: 'high' })).toBe(true); + expect(filter(LogLevel.ERROR, 'message', { priority: 'low' })).toBe(false); + expect(filter(LogLevel.WARNING, 'message')).toBe(false); + }); + + it('should handle undefined metadata', () => { + const filter = LogFilters.metadataFilter((metadata) => !metadata); + + expect(filter(LogLevel.INFO, 'message')).toBe(true); + expect(filter(LogLevel.ERROR, 'message', { some: 'data' })).toBe(false); + }); + }); + + describe('rateLimit', () => { + beforeEach(() => { + jest.useFakeTimers(); + }); + + afterEach(() => { + jest.useRealTimers(); + }); + + it('should allow logs within rate limit', () => { + const filter = LogFilters.rateLimit(2); + + expect(filter(LogLevel.INFO, 'message')).toBe(true); + expect(filter(LogLevel.INFO, 'message')).toBe(true); + expect(filter(LogLevel.INFO, 'message')).toBe(false); + }); + + it('should reset count after one second', () => { + const filter = LogFilters.rateLimit(1); + + expect(filter(LogLevel.INFO, 'message')).toBe(true); + expect(filter(LogLevel.INFO, 'message')).toBe(false); + + // Advance time by 1 second + jest.advanceTimersByTime(1000); + + expect(filter(LogLevel.INFO, 'message')).toBe(true); + }); + + it('should allow unlimited logs when rate is high', () => { + const filter = LogFilters.rateLimit(100); + + for (let i = 0; i < 10; i++) { + expect(filter(LogLevel.INFO, 'message')).toBe(true); + } + }); + + it('should handle zero rate limit', () => { + const filter = LogFilters.rateLimit(0); + + expect(filter(LogLevel.INFO, 'message')).toBe(false); + }); + }); +}); diff --git a/src/__tests__/jest.setup.ts b/src/__tests__/jest.setup.ts new file mode 100644 index 0000000..202c837 --- /dev/null +++ b/src/__tests__/jest.setup.ts @@ -0,0 +1,29 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { jest } from '@jest/globals'; + +// Make Jest globals available +global.jest = jest; +global.describe = describe; +global.it = it; +global.test = test; +global.expect = expect; +global.beforeEach = beforeEach; +global.afterEach = afterEach; +global.beforeAll = beforeAll; +global.afterAll = afterAll; diff --git a/src/__tests__/loggers/composite.logger.test.ts b/src/__tests__/loggers/composite.logger.test.ts new file mode 100644 index 0000000..cb89f51 --- /dev/null +++ b/src/__tests__/loggers/composite.logger.test.ts @@ -0,0 +1,177 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { + CompositeLogger, + ILogger, + ILogMetadata, + LogLevel, + MockLogger, +} from '../../logging/index.js'; + +describe('CompositeLogger', () => { + let mockLogger1: MockLogger; + let mockLogger2: MockLogger; + let compositeLogger: CompositeLogger; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockLogger1 = new MockLogger(); + mockLogger2 = new MockLogger(); + compositeLogger = new CompositeLogger([mockLogger1, mockLogger2]); + }); + + describe('constructor', () => { + it('should be a CompositeLogger instance', () => { + expect(compositeLogger).toBeInstanceOf(CompositeLogger); + expect(typeof compositeLogger.info).toBe('function'); + expect(typeof compositeLogger.error).toBe('function'); + expect(typeof compositeLogger.addLogger).toBe('function'); + }); + + it('should handle empty logger list', () => { + const emptyComposite = new CompositeLogger([]); + + // Should not throw + expect(() => { + emptyComposite.info('test'); + emptyComposite.error('error'); + }).not.toThrow(); + }); + }); + + describe('info', () => { + it('should delegate info calls to all loggers', () => { + console.log('Testing CompositeLogger info delegation'); + const metadata: ILogMetadata = { title: 'Composite Test' }; + compositeLogger.info('test message', metadata); + + expect(mockLogger1.calls).toHaveLength(1); + expect(mockLogger2.calls).toHaveLength(1); + expect(mockLogger1.calls[0]).toMatchObject({ + level: LogLevel.INFO, + message: 'test message', + metadata, + }); + expect(mockLogger2.calls[0]).toMatchObject({ + level: LogLevel.INFO, + message: 'test message', + metadata, + }); + }); + }); + + describe('error', () => { + it('should delegate error calls to all loggers', () => { + compositeLogger.error('error message'); + + expect(mockLogger1.calls).toHaveLength(1); + expect(mockLogger2.calls).toHaveLength(1); + expect(mockLogger1.calls[0].level).toBe(LogLevel.ERROR); + expect(mockLogger2.calls[0].level).toBe(LogLevel.ERROR); + }); + }); + + describe('group', () => { + it('should handle group operations', async () => { + const result = await compositeLogger.group('test group', async () => { + compositeLogger.info('inside group'); + return 'success'; + }); + + expect(result).toBe('success'); + // Check that group operations were recorded + expect(mockLogger1.calls.some((call) => call.level === LogLevel.GROUP)).toBe(true); + expect(mockLogger2.calls.some((call) => call.level === LogLevel.GROUP)).toBe(true); + }); + + it('should handle group operation with logger failures', async () => { + const failingLogger: jest.Mocked = { + info: jest.fn(), + debug: jest.fn(), + warning: jest.fn(), + error: jest.fn(), + setFailed: jest.fn(), + group: jest.fn().mockImplementation(() => { + throw new Error('Group failed'); + }) as jest.MockedFunction, + }; + + const compositeWithFailing = new CompositeLogger([failingLogger, mockLogger1]); + + const result = await compositeWithFailing.group('test group', async () => 'result'); + expect(result).toBe('result'); // Should succeed with the working logger + }); + }); + + describe('addLogger', () => { + it('should allow adding and removing loggers', () => { + const mockLogger3 = new MockLogger(); + + compositeLogger.addLogger(mockLogger3); + compositeLogger.info('message after adding'); + + expect(mockLogger1.calls).toHaveLength(1); + expect(mockLogger2.calls).toHaveLength(1); + expect(mockLogger3.calls).toHaveLength(1); + + compositeLogger.removeLogger(mockLogger2); + compositeLogger.info('message after removing'); + + expect(mockLogger1.calls).toHaveLength(2); + expect(mockLogger2.calls).toHaveLength(1); // No new calls + expect(mockLogger3.calls).toHaveLength(2); + }); + }); + + describe('debug', () => { + it('should delegate debug calls to all loggers', () => { + compositeLogger.debug('debug message'); + + expect(mockLogger1.calls).toHaveLength(1); + expect(mockLogger2.calls).toHaveLength(1); + expect(mockLogger1.calls[0].level).toBe(LogLevel.DEBUG); + expect(mockLogger2.calls[0].level).toBe(LogLevel.DEBUG); + }); + }); + + describe('warning', () => { + it('should delegate warning calls to all loggers', () => { + const metadata = { component: 'test' }; + compositeLogger.warning('warning message', metadata); + + expect(mockLogger1.calls).toHaveLength(1); + expect(mockLogger2.calls).toHaveLength(1); + expect(mockLogger1.calls[0].level).toBe(LogLevel.WARNING); + expect(mockLogger2.calls[0].level).toBe(LogLevel.WARNING); + }); + }); + + describe('setFailed', () => { + it('should delegate setFailed calls to all loggers', () => { + compositeLogger.setFailed('action failed'); + + expect(mockLogger1.calls).toHaveLength(1); + expect(mockLogger2.calls).toHaveLength(1); + expect(mockLogger1.calls[0].level).toBe(LogLevel.FAILED); + expect(mockLogger2.calls[0].level).toBe(LogLevel.FAILED); + }); + }); +}); diff --git a/src/__tests__/loggers/filtered.logger.test.ts b/src/__tests__/loggers/filtered.logger.test.ts new file mode 100644 index 0000000..89a2746 --- /dev/null +++ b/src/__tests__/loggers/filtered.logger.test.ts @@ -0,0 +1,382 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { FilteredLogger, LogFilters, LogLevel, MockLogger } from '../../logging/index.js'; + +describe('FilteredLogger', () => { + let mockLogger: MockLogger; + let filteredLogger: FilteredLogger; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockLogger = new MockLogger(); + filteredLogger = new FilteredLogger(mockLogger); + }); + + describe('constructor', () => { + it('should create FilteredLogger with default filters', () => { + expect(filteredLogger).toBeInstanceOf(FilteredLogger); + }); + + it('should create FilteredLogger with provided filters', () => { + const filters = [LogFilters.levelFilter(LogLevel.WARNING)]; + const logger = new FilteredLogger(mockLogger, filters); + + expect(logger).toBeInstanceOf(FilteredLogger); + }); + + it('should create FilteredLogger with sampling strategy', () => { + const sampling = { rate: 0.5 }; + const logger = new FilteredLogger(mockLogger, [], sampling); + + expect(logger).toBeInstanceOf(FilteredLogger); + }); + }); + + describe('info', () => { + it('should log info messages when no filters', () => { + filteredLogger.info('test message'); + + expect(mockLogger.getLastCall()).toEqual({ + level: LogLevel.INFO, + message: 'test message', + timestamp: expect.any(Date), + }); + }); + + it('should log info messages with metadata when no filters', () => { + const metadata = { userId: 123 }; + filteredLogger.info('test message', metadata); + + expect(mockLogger.getLastCall()).toEqual({ + level: LogLevel.INFO, + message: 'test message', + metadata, + timestamp: expect.any(Date), + }); + }); + + it('should filter out info messages below level filter', () => { + const logger = new FilteredLogger(mockLogger, [LogFilters.levelFilter(LogLevel.WARNING)]); + + logger.info('test message'); + + expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(0); + }); + + it('should filter out info messages matching exclude pattern', () => { + const logger = new FilteredLogger(mockLogger, [LogFilters.excludePattern('secret')]); + + logger.info('This contains secret data'); + + expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(0); + }); + }); + + describe('debug', () => { + it('should log debug messages when no filters', () => { + filteredLogger.debug('debug message'); + + expect(mockLogger.getLastCall()).toEqual({ + level: LogLevel.DEBUG, + message: 'debug message', + timestamp: expect.any(Date), + }); + }); + + it('should filter out debug messages below level filter', () => { + const logger = new FilteredLogger(mockLogger, [LogFilters.levelFilter(LogLevel.INFO)]); + + logger.debug('debug message'); + + expect(mockLogger.getCallsForLevel(LogLevel.DEBUG)).toHaveLength(0); + }); + }); + + describe('warning', () => { + it('should log warning messages when no filters', () => { + filteredLogger.warning('warning message'); + + expect(mockLogger.getLastCall()).toEqual({ + level: LogLevel.WARNING, + message: 'warning message', + timestamp: expect.any(Date), + }); + }); + + it('should log warning messages with metadata when no filters', () => { + const metadata = { component: 'test' }; + filteredLogger.warning('warning message', metadata); + + expect(mockLogger.getLastCall()).toEqual({ + level: LogLevel.WARNING, + message: 'warning message', + metadata, + timestamp: expect.any(Date), + }); + }); + }); + + describe('error', () => { + it('should log error messages when no filters', () => { + filteredLogger.error('error message'); + + expect(mockLogger.getLastCall()).toEqual({ + level: LogLevel.ERROR, + message: 'error message', + timestamp: expect.any(Date), + }); + }); + + it('should log error messages with metadata when no filters', () => { + const metadata = { error: 'test error' }; + filteredLogger.error('error message', metadata); + + expect(mockLogger.getLastCall()).toEqual({ + level: LogLevel.ERROR, + message: 'error message', + metadata, + timestamp: expect.any(Date), + }); + }); + }); + + describe('setFailed', () => { + it('should always log failed messages regardless of filters', () => { + const logger = new FilteredLogger(mockLogger, [LogFilters.levelFilter(LogLevel.ERROR)]); + + logger.setFailed('failure message'); + + expect(mockLogger.getLastCall()).toEqual({ + level: LogLevel.FAILED, + message: 'failure message', + timestamp: expect.any(Date), + }); + }); + + it('should log failed messages with metadata', () => { + const metadata = { severity: 'critical' }; + filteredLogger.setFailed('failure message', metadata); + + expect(mockLogger.getLastCall()).toEqual({ + level: LogLevel.FAILED, + message: 'failure message', + metadata, + timestamp: expect.any(Date), + }); + }); + }); + + describe('group', () => { + it('should delegate group operations to wrapped logger', async () => { + const mockFn = jest.fn, []>().mockResolvedValue('result'); + + const result = await filteredLogger.group('test group', mockFn); + + expect(result).toBe('result'); + expect(mockFn).toHaveBeenCalled(); + }); + }); + + describe('addFilter', () => { + it('should add filters to the logger', () => { + const filter = LogFilters.levelFilter(LogLevel.WARNING); + + filteredLogger.addFilter(filter); + + // Test that the filter is applied + filteredLogger.info('info message'); + expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(0); + }); + }); + + describe('clearFilters', () => { + it('should remove all filters', () => { + const filter = LogFilters.levelFilter(LogLevel.WARNING); + filteredLogger.addFilter(filter); + + filteredLogger.clearFilters(); + + // Test that filters are cleared + filteredLogger.info('info message'); + expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(1); + }); + }); + + describe('setSampling', () => { + it('should update sampling strategy', () => { + const sampling = { rate: 0.5 }; + filteredLogger.setSampling(sampling); + + // Test that sampling is applied (this is tested more thoroughly in sampling tests) + expect(() => filteredLogger.setSampling(undefined)).not.toThrow(); + }); + }); + + describe('sampling', () => { + beforeEach(() => { + jest.spyOn(Math, 'random').mockReturnValue(0.3); // 30% - below 50% rate + }); + + afterEach(() => { + jest.spyOn(Math, 'random').mockRestore(); + }); + + it('should apply rate-based sampling', () => { + const logger = new FilteredLogger(mockLogger, [], { rate: 0.5 }); + + logger.info('test message'); + + // Should pass due to random <= rate (0.3 <= 0.5) + expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(1); + }); + + it('should allow logs when random value is below rate', () => { + jest.spyOn(Math, 'random').mockReturnValue(0.4); // 40% - below 50% rate, should pass + const logger = new FilteredLogger(mockLogger, [], { rate: 0.5 }); + + logger.info('test message'); + + expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(1); + }); + + it('should allow logs when random value is above rate threshold', () => { + jest.spyOn(Math, 'random').mockReturnValue(0.6); // 60% - above 50% rate, should fail + const logger = new FilteredLogger(mockLogger, [], { rate: 0.5 }); + + logger.info('test message'); + + expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(0); + }); + }); + + describe('window-based sampling', () => { + beforeEach(() => { + jest.useFakeTimers(); + }); + + afterEach(() => { + jest.useRealTimers(); + }); + + it('should limit logs per window', () => { + const logger = new FilteredLogger(mockLogger, [], { + rate: 1.0, // Allow all logs through rate sampling + maxPerWindow: 2, + windowMs: 1000, + }); + + logger.info('message 1'); + logger.info('message 2'); + logger.info('message 3'); // Should be filtered + + expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(2); + }); + + it('should reset window after time expires', () => { + const originalDateNow = Date.now; + const mockNow = jest.fn(); + mockNow.mockReturnValue(1000); // Initial time + Date.now = mockNow as any; + + const logger = new FilteredLogger(mockLogger, [], { + rate: 1.0, // Allow all logs through rate sampling + maxPerWindow: 1, + windowMs: 1000, + }); + + logger.info('message 1'); + expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(1); + + mockNow.mockReturnValue(2001); // After window expires (1000 + 1000 + 1) + + logger.info('message 2'); // Should be allowed after window reset + expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(2); + + Date.now = originalDateNow; + }); + }); + + describe('custom sampling strategy', () => { + it('should use custom shouldSample function', () => { + const customSampling = { + rate: 1.0, // Required by interface + shouldSample: jest.fn().mockReturnValue(false) as any, + }; + const logger = new FilteredLogger(mockLogger, [], customSampling); + + logger.info('test message'); + + expect(customSampling.shouldSample).toHaveBeenCalledWith( + LogLevel.INFO, + 'test message', + undefined, + ); + expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(0); + }); + + it('should use custom shouldSample function with metadata', () => { + const customSampling = { + rate: 1.0, // Required by interface + shouldSample: jest.fn().mockReturnValue(true) as any, + }; + const logger = new FilteredLogger(mockLogger, [], customSampling); + const metadata = { test: true }; + + logger.warning('warning message', metadata); + + expect(customSampling.shouldSample).toHaveBeenCalledWith( + LogLevel.WARNING, + 'warning message', + metadata, + ); + expect(mockLogger.getCallsForLevel(LogLevel.WARNING)).toHaveLength(1); + }); + }); + + describe('complex filtering scenarios', () => { + it('should apply multiple filters (all must pass)', () => { + const filters = [ + LogFilters.levelFilter(LogLevel.INFO), + LogFilters.includePattern('important'), + ]; + const logger = new FilteredLogger(mockLogger, filters); + + logger.info('This is an important message'); // Should pass + logger.info('This is a normal message'); // Should fail pattern filter + logger.debug('This is an important debug'); // Should fail level filter + + expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(1); + }); + + it('should combine filtering and sampling', () => { + jest.spyOn(Math, 'random').mockReturnValue(0.4); // Below rate threshold (0.4 <= 0.5) + + const filters = [LogFilters.levelFilter(LogLevel.WARNING)]; + const sampling = { rate: 0.5 }; + const logger = new FilteredLogger(mockLogger, filters, sampling); + + logger.warning('warning message'); // Should pass both filter and sampling + + expect(mockLogger.getCallsForLevel(LogLevel.WARNING)).toHaveLength(1); + + jest.spyOn(Math, 'random').mockRestore(); + }); + }); +}); diff --git a/src/__tests__/loggers/logger-config.resolver.test.ts b/src/__tests__/loggers/logger-config.resolver.test.ts new file mode 100644 index 0000000..4cb55f4 --- /dev/null +++ b/src/__tests__/loggers/logger-config.resolver.test.ts @@ -0,0 +1,181 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { IPinoLoggerConfig, LoggerConfigResolver, LogLevel } from '../../logging/index.js'; +import type { IEnvironmentVariables } from '../../types/env.js'; + +describe('LoggerConfigResolver', () => { + describe('resolve', () => { + it('should resolve default configuration for development', () => { + const mockEnv: IEnvironmentVariables = { + NODE_ENV: 'development', + npm_package_version: '1.0.0', + }; + + const config = LoggerConfigResolver.resolve({}, mockEnv); + + expect(config.level).toBe(LogLevel.INFO); + expect(config.prettyPrint).toBe(true); + expect(config.enableCore).toBe(false); + expect(config.enablePino).toBe(true); + expect(config.base).toHaveProperty('service', 'github-action'); + expect(config.base).toHaveProperty('version', '1.0.0'); + }); + + it('should resolve configuration for CI environment', () => { + const mockEnv: IEnvironmentVariables = { + NODE_ENV: 'production', + GITHUB_ACTIONS: 'true', + GITHUB_REPOSITORY: 'owner/repo', + GITHUB_WORKFLOW: 'CI', + GITHUB_RUN_ID: '123', + GITHUB_REF: 'refs/heads/main', + GITHUB_SHA: 'abc123', + npm_package_version: '1.0.0', + }; + + const config = LoggerConfigResolver.resolve({}, mockEnv); + + expect(config.enableCore).toBe(true); + expect(config.base).toHaveProperty('repository', 'owner/repo'); + expect(config.base).toHaveProperty('workflow', 'CI'); + expect(config.base).toHaveProperty('runId', '123'); + expect(config.base).toHaveProperty('ref', 'refs/heads/main'); + expect(config.base).toHaveProperty('sha', 'abc123'); + }); + + it('should resolve production configuration', () => { + const mockEnv: IEnvironmentVariables = { + NODE_ENV: 'production', + LOG_FILE: '/tmp/app.log', + }; + + const config = LoggerConfigResolver.resolve({}, mockEnv); + + expect(config.prettyPrint).toBe(false); + expect(config.transport).toBeDefined(); + expect(config.transport).toHaveProperty('target', 'pino/file'); + }); + + it('should apply overrides', () => { + const mockEnv: IEnvironmentVariables = {}; + const overrides: Partial = { + level: LogLevel.DEBUG, + enableCore: true, + base: { custom: 'value' }, + }; + + const config = LoggerConfigResolver.resolve(overrides, mockEnv); + + expect(config.level).toBe(LogLevel.DEBUG); + expect(config.enableCore).toBe(true); + expect(config.base).toHaveProperty('custom', 'value'); + }); + + it('should respect LOG_LEVEL environment variable', () => { + const mockEnv: IEnvironmentVariables = { + LOG_LEVEL: LogLevel.WARNING, + }; + + const config = LoggerConfigResolver.resolve({}, mockEnv); + + expect(config.level).toBe(LogLevel.WARNING); + }); + }); + + describe('toPinoOptions', () => { + it('should create Pino options from config', () => { + const config: IPinoLoggerConfig = { + level: LogLevel.DEBUG, + base: { service: 'test' }, + transport: { + target: 'pino-pretty', + options: { colorize: true }, + }, + }; + + const pinoOptions = LoggerConfigResolver.toPinoOptions(config); + + expect(pinoOptions.level).toBe(LogLevel.DEBUG); + expect(pinoOptions.base).toEqual({ service: 'test' }); + expect(pinoOptions.transport).toBeDefined(); + }); + + it('should handle minimal config for Pino options', () => { + const config: IPinoLoggerConfig = { + level: LogLevel.INFO, + }; + + const pinoOptions = LoggerConfigResolver.toPinoOptions(config); + + expect(pinoOptions.level).toBe(LogLevel.INFO); + expect(pinoOptions.base).toEqual({}); + }); + + it('should handle config with undefined base for Pino options', () => { + const config: IPinoLoggerConfig = { + level: LogLevel.WARNING as any, + base: undefined, + }; + + const pinoOptions = LoggerConfigResolver.toPinoOptions(config); + + expect(pinoOptions.level).toBe(LogLevel.WARNING); + expect(pinoOptions.base).toEqual({}); + }); + + it('should handle config with null base for Pino options', () => { + const config: IPinoLoggerConfig = { + level: LogLevel.ERROR as any, + base: null as any, + }; + + const pinoOptions = LoggerConfigResolver.toPinoOptions(config); + + expect(pinoOptions.level).toBe(LogLevel.ERROR); + expect(pinoOptions.base).toEqual({}); + }); + }); + + describe('GitHub Actions environment', () => { + it('should resolve configuration for GitHub Actions environment', () => { + const mockEnv: IEnvironmentVariables = { + GITHUB_ACTIONS: 'true', + GITHUB_RUN_ID: '12345', + GITHUB_SHA: 'abc123', + GITHUB_REF: 'refs/heads/main', + GITHUB_REPOSITORY: 'owner/repo', + npm_package_version: '1.0.0', + }; + + const config = LoggerConfigResolver.resolve({}, mockEnv); + + expect(config.level).toBe(LogLevel.INFO); + expect(config.prettyPrint).toBe(false); + expect(config.enableCore).toBe(true); + expect(config.enablePino).toBe(true); + expect(config.base).toEqual({ + service: 'github-action', + version: '1.0.0', + runId: '12345', + sha: 'abc123', + ref: 'refs/heads/main', + repository: 'owner/repo', + }); + }); + }); +}); diff --git a/src/__tests__/loggers/logger.factory.test.ts b/src/__tests__/loggers/logger.factory.test.ts new file mode 100644 index 0000000..b4c431c --- /dev/null +++ b/src/__tests__/loggers/logger.factory.test.ts @@ -0,0 +1,39 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { + CompositeLogger, + createCompositeLogger, + createPinoLogger, + PinoLogger, +} from '../../logging/index.js'; + +describe('Factory Functions', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should create composite logger with default configuration', () => { + const logger = createCompositeLogger(); + expect(logger).toBeInstanceOf(CompositeLogger); + }); + + it('should create pino logger with default configuration', () => { + const logger = createPinoLogger(); + expect(logger).toBeInstanceOf(PinoLogger); + }); +}); diff --git a/src/__tests__/loggers/metrics.logger.test.ts b/src/__tests__/loggers/metrics.logger.test.ts new file mode 100644 index 0000000..f2fba4f --- /dev/null +++ b/src/__tests__/loggers/metrics.logger.test.ts @@ -0,0 +1,134 @@ +import { ILogMetadata, LogLevel, MetricsLogger, MockLogger } from '../../logging/index.js'; + +describe('MetricsLogger', () => { + let mockLogger: MockLogger; + let metricsLogger: MetricsLogger; + let metricsCallback: jest.Mock; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockLogger = new MockLogger(); + metricsCallback = jest.fn(); + metricsLogger = new MetricsLogger(mockLogger, metricsCallback); + }); + + describe('info', () => { + it('should record metrics for info logs', () => { + metricsLogger.info('test message'); + + const metrics = metricsLogger.getMetrics(); + expect(metrics.totalLogs).toBe(1); + expect(metrics.infoLogs).toBe(1); + expect(metrics.logsByLevel[LogLevel.INFO]).toBe(1); + expect(metricsCallback).toHaveBeenCalledTimes(2); + }); + }); + + describe('debug', () => { + it('should record metrics for debug logs', () => { + metricsLogger.debug('debug message'); + + const metrics = metricsLogger.getMetrics(); + expect(metrics.totalLogs).toBe(1); + expect(metrics.debugLogs).toBe(1); + expect(metrics.logsByLevel[LogLevel.DEBUG]).toBe(1); + }); + }); + + describe('warning', () => { + it('should record metrics for warning logs', () => { + const metadata: ILogMetadata = { title: 'Warning' }; + metricsLogger.warning('warning message', metadata); + + const metrics = metricsLogger.getMetrics(); + expect(metrics.totalLogs).toBe(1); + expect(metrics.warnings).toBe(1); + expect(metrics.warningLogs).toBe(1); + expect(metrics.logsByLevel[LogLevel.WARNING]).toBe(1); + }); + }); + + describe('error', () => { + it('should record metrics for error logs', () => { + metricsLogger.error('error message'); + + const metrics = metricsLogger.getMetrics(); + expect(metrics.totalLogs).toBe(1); + expect(metrics.errors).toBe(1); + expect(metrics.errorLogs).toBe(1); + expect(metrics.logsByLevel[LogLevel.ERROR]).toBe(1); + }); + }); + + describe('setFailed', () => { + it('should record metrics for failed logs', () => { + metricsLogger.setFailed('failure message'); + + const metrics = metricsLogger.getMetrics(); + expect(metrics.totalLogs).toBe(1); + expect(metrics.failedLogs).toBe(1); + expect(metrics.logsByLevel[LogLevel.FAILED]).toBe(1); + }); + }); + + describe('group', () => { + it('should record grouped operations', async () => { + const mockFn = jest.fn, []>().mockResolvedValue('result'); + await metricsLogger.group('test group', mockFn); + + const metrics = metricsLogger.getMetrics(); + expect(metrics.groupedOperations).toBe(1); + }); + }); + + describe('getMetrics', () => { + it('should calculate average log size', () => { + metricsLogger.info('short'); + metricsLogger.info('this is a longer message'); + + const metrics = metricsLogger.getMetrics(); + expect(metrics.averageLogSize).toBeGreaterThan(0); + expect(metrics.totalLogs).toBe(2); + }); + + it('should track uptime', () => { + // Add a small delay to ensure uptime > 0 + const startTime = Date.now(); + while (Date.now() - startTime < 1) { + // Busy wait for 1ms + } + const metrics = metricsLogger.getMetrics(); + expect(metrics.uptime).toBeGreaterThan(0); + }); + + it('should provide metrics snapshot', () => { + metricsLogger.info('test'); + const metrics = metricsLogger.getMetrics(); + + expect(metrics).toHaveProperty('totalLogs', 1); + expect(metrics).toHaveProperty('logsByLevel'); + expect(metrics).toHaveProperty('uptime'); + expect(metrics).toHaveProperty('lastUpdated'); + }); + + it('should handle metadata in metrics', () => { + const metadata: ILogMetadata = { title: 'Test', file: 'test.ts' }; + metricsLogger.info('message', metadata); + + const metrics = metricsLogger.getMetrics(); + expect(metrics.averageLogSize).toBeGreaterThan(6); // "message" + metadata size + }); + }); + + describe('startMetricsReporting', () => { + // Test removed due to memory leak issue + }); + + it('should delegate to wrapped logger', () => { + metricsLogger.info('test message'); + expect(() => mockLogger.assertCalled(LogLevel.INFO, 'test message')).not.toThrow(); + }); +}); diff --git a/src/__tests__/loggers/mock.logger.test.ts b/src/__tests__/loggers/mock.logger.test.ts new file mode 100644 index 0000000..b17dc85 --- /dev/null +++ b/src/__tests__/loggers/mock.logger.test.ts @@ -0,0 +1,179 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { LogLevel, MockLogger } from '../../logging/index.js'; + +describe('MockLogger', () => { + let mockLogger: MockLogger; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + mockLogger = new MockLogger(); + }); + + describe('info', () => { + it('should record info calls', () => { + mockLogger.info('test info message'); + expect(mockLogger.calls).toHaveLength(1); + expect(mockLogger.calls[0]).toMatchObject({ + level: LogLevel.INFO, + message: 'test info message', + }); + }); + }); + + describe('debug', () => { + it('should record debug calls', () => { + mockLogger.debug('test debug message'); + expect(mockLogger.calls).toHaveLength(1); + expect(mockLogger.calls[0]).toMatchObject({ + level: LogLevel.DEBUG, + message: 'test debug message', + }); + }); + }); + + describe('warning', () => { + it('should record warning calls with metadata', () => { + const metadata = { title: 'Warning' }; + mockLogger.warning('test warning', metadata); + expect(mockLogger.calls).toHaveLength(1); + expect(mockLogger.calls[0]).toMatchObject({ + level: LogLevel.WARNING, + message: 'test warning', + metadata, + }); + }); + }); + + describe('error', () => { + it('should record error calls', () => { + mockLogger.error('test error'); + expect(mockLogger.calls).toHaveLength(1); + expect(mockLogger.calls[0]).toMatchObject({ + level: LogLevel.ERROR, + message: 'test error', + }); + }); + }); + + describe('setFailed', () => { + it('should record setFailed calls', () => { + mockLogger.setFailed('test failure'); + expect(mockLogger.calls).toHaveLength(1); + expect(mockLogger.calls[0]).toMatchObject({ + level: LogLevel.FAILED, + message: 'test failure', + }); + }); + }); + + describe('group', () => { + it('should handle group operations successfully', async () => { + const mockFn = jest.fn, []>().mockResolvedValue('success'); + const result = await mockLogger.group('test group', mockFn); + + expect(result).toBe('success'); + expect(mockLogger.calls).toHaveLength(2); + expect(mockLogger.calls[0].message).toBe('START: test group'); + expect(mockLogger.calls[1].message).toBe('END: test group'); + }); + + it('should handle group operations with errors', async () => { + const mockFn = jest.fn, []>().mockRejectedValue(new Error('test error')); + + await expect(mockLogger.group('test group', mockFn)).rejects.toThrow('test error'); + + expect(mockLogger.calls).toHaveLength(2); + expect(mockLogger.calls[0].message).toBe('START: test group'); + expect(mockLogger.calls[1].message).toBe('ERROR: test group'); + }); + }); + + describe('getCallsForLevel', () => { + it('should get calls for specific level', () => { + mockLogger.info('info1'); + mockLogger.debug('debug1'); + mockLogger.info('info2'); + + const infoCalls = mockLogger.getCallsForLevel(LogLevel.INFO); + expect(infoCalls).toHaveLength(2); + expect(infoCalls[0].message).toBe('info1'); + expect(infoCalls[1].message).toBe('info2'); + }); + }); + + describe('getLastCall', () => { + it('should get last call', () => { + mockLogger.info('first'); + mockLogger.debug('last'); + + const lastCall = mockLogger.getLastCall(); + expect(lastCall?.message).toBe('last'); + expect(lastCall?.level).toBe(LogLevel.DEBUG); + }); + }); + + describe('clear', () => { + it('should clear calls', () => { + mockLogger.info('test'); + expect(mockLogger.calls).toHaveLength(1); + + mockLogger.clear(); + expect(mockLogger.calls).toHaveLength(0); + }); + }); + + describe('assertCalled', () => { + it('should assert called with string message', () => { + mockLogger.info('expected message'); + expect(() => mockLogger.assertCalled(LogLevel.INFO, 'expected')).not.toThrow(); + }); + + it('should assert called with regex message', () => { + mockLogger.info('expected message'); + expect(() => mockLogger.assertCalled(LogLevel.INFO, /expected/)).not.toThrow(); + }); + + it('should throw when asserting called but not called', () => { + expect(() => mockLogger.assertCalled(LogLevel.INFO)).toThrow('Expected info to be called'); + }); + + it('should throw when asserting called with message but wrong message', () => { + mockLogger.info('wrong message'); + expect(() => mockLogger.assertCalled(LogLevel.INFO, 'expected')).toThrow( + 'Expected info to be called with message matching "expected"', + ); + }); + }); + + describe('assertNotCalled', () => { + it('should assert not called', () => { + expect(() => mockLogger.assertNotCalled(LogLevel.INFO)).not.toThrow(); + }); + + it('should throw when asserting not called but was called', () => { + mockLogger.info('test'); + expect(() => mockLogger.assertNotCalled(LogLevel.INFO)).toThrow( + 'Expected info not to be called', + ); + }); + }); +}); diff --git a/src/__tests__/loggers/noop.logger.test.ts b/src/__tests__/loggers/noop.logger.test.ts new file mode 100644 index 0000000..3455bb2 --- /dev/null +++ b/src/__tests__/loggers/noop.logger.test.ts @@ -0,0 +1,96 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { NoopLogger } from '../../logging/index.js'; + +describe('NoopLogger', () => { + let logger: NoopLogger; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + logger = new NoopLogger(); + }); + + describe('properties', () => { + it('should have correct default properties', () => { + expect(logger.level).toBe('silent'); + expect(logger.levelVal).toBe(100); + expect(logger.msgPrefix).toBe(''); + }); + }); + + describe('logging methods', () => { + it('should call info without error', () => { + expect(() => logger.info('test')).not.toThrow(); + expect(() => logger.info('test', { key: 'value' })).not.toThrow(); + }); + + it('should call debug without error', () => { + expect(() => logger.debug('test')).not.toThrow(); + expect(() => logger.debug('test', { key: 'value' })).not.toThrow(); + }); + + it('should call warning without error', () => { + expect(() => logger.warning('test')).not.toThrow(); + expect(() => logger.warning('test', { key: 'value' })).not.toThrow(); + }); + + it('should call error without error', () => { + expect(() => logger.error('test')).not.toThrow(); + expect(() => logger.error('test', { key: 'value' })).not.toThrow(); + }); + + it('should call fatal without error', () => { + expect(() => logger.fatal('test')).not.toThrow(); + expect(() => logger.fatal('test', { key: 'value' })).not.toThrow(); + }); + + it('should call trace without error', () => { + expect(() => logger.trace('test')).not.toThrow(); + expect(() => logger.trace('test', { key: 'value' })).not.toThrow(); + }); + }); + + describe('child', () => { + it('should return a new NoopLogger instance', () => { + const childLogger = logger.child({}); + expect(childLogger).toBeInstanceOf(NoopLogger); + expect(childLogger).not.toBe(logger); + }); + }); + + describe('setFailed', () => { + it('should call setFailed without error', () => { + expect(() => logger.setFailed('test')).not.toThrow(); + expect(() => logger.setFailed('test', { key: 'value' })).not.toThrow(); + }); + }); + + describe('group', () => { + it('should execute the function and return its result', async () => { + const result = await logger.group('test', async () => 'success'); + expect(result).toBe('success'); + }); + + it('should handle synchronous functions', async () => { + const result = await logger.group('test', () => Promise.resolve('sync')); + expect(result).toBe('sync'); + }); + }); +}); diff --git a/src/__tests__/loggers/pino.logger.test.ts b/src/__tests__/loggers/pino.logger.test.ts new file mode 100644 index 0000000..bdf7cb0 --- /dev/null +++ b/src/__tests__/loggers/pino.logger.test.ts @@ -0,0 +1,111 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { LogLevel, PinoLogger } from '../../logging/index.js'; + +describe('PinoLogger', () => { + let logger: PinoLogger; + + afterEach(() => { + jest.clearAllMocks(); + }); + + beforeEach(() => { + logger = new PinoLogger({ + level: LogLevel.INFO, + base: { service: 'test' }, + }); + }); + + describe('constructor', () => { + it('should create logger instance', () => { + expect(logger).toBeDefined(); + expect(typeof logger.isLoggerAvailable).toBe('function'); + }); + }); + + describe('info', () => { + it('should log info messages', () => { + expect(() => logger.info('test message')).not.toThrow(); + }); + + it('should handle metadata in logs', () => { + const metadata = { userId: 123, action: 'login' }; + expect(() => logger.info('user logged in', metadata)).not.toThrow(); + }); + }); + + describe('debug', () => { + it('should log debug messages', () => { + expect(() => logger.debug('debug message')).not.toThrow(); + }); + }); + + describe('group', () => { + it('should handle group operations with child logger', async () => { + const result = await logger.group('test group', async () => { + logger.info('inside group'); + return 'success'; + }); + expect(result).toBe('success'); + }); + + it('should handle group operation errors', async () => { + await expect( + logger.group('failing group', async () => { + throw new Error('group failed'); + }), + ).rejects.toThrow('group failed'); + }); + }); + + describe('warning', () => { + it('should handle warning calls', () => { + logger.warning('warning message'); + logger.warning('warning with metadata', { component: 'test' }); + // Test passes if no exception is thrown + expect(true).toBe(true); + }); + }); + + describe('isLoggerAvailable', () => { + it('should report logger availability', () => { + expect(logger.isLoggerAvailable()).toBe(true); + }); + }); + + it('should handle error logging', () => { + const error = new Error('test error'); + expect(() => logger.error('error occurred', { error: error.message })).not.toThrow(); + }); + + it('should handle setFailed calls', () => { + expect(() => logger.setFailed('action failed')).not.toThrow(); + }); + + it('should respect log levels', () => { + const debugLogger = new PinoLogger({ + level: LogLevel.ERROR, + }); + + expect(() => { + debugLogger.debug('should not log'); + debugLogger.info('should not log'); + debugLogger.error('should log'); + }).not.toThrow(); + }); +}); diff --git a/src/barrelFileGenerator.ts b/src/barrelFileGenerator.ts deleted file mode 100644 index b4632ba..0000000 --- a/src/barrelFileGenerator.ts +++ /dev/null @@ -1,58 +0,0 @@ -import * as vscode from 'vscode'; -import * as path from 'path'; -import { FileSystemService } from './services/fileSystemService'; -import { ExportParser } from './services/exportParser'; -import { BarrelContentBuilder } from './services/barrelContentBuilder'; - -/** - * Main class responsible for orchestrating barrel file generation. - * Follows Single Responsibility Principle by delegating specific tasks to service classes. - */ -export class BarrelFileGenerator { - private fileSystemService: FileSystemService; - private exportParser: ExportParser; - private barrelContentBuilder: BarrelContentBuilder; - - constructor( - fileSystemService?: FileSystemService, - exportParser?: ExportParser, - barrelContentBuilder?: BarrelContentBuilder, - ) { - this.fileSystemService = fileSystemService || new FileSystemService(); - this.exportParser = exportParser || new ExportParser(); - this.barrelContentBuilder = barrelContentBuilder || new BarrelContentBuilder(); - } - - /** - * Generates or updates an index.ts barrel file in the specified directory. - * @param directoryUri The URI of the directory where the barrel file should be created/updated - */ - async generateBarrelFile(directoryUri: vscode.Uri): Promise { - const directoryPath = directoryUri.fsPath; - const barrelFilePath = path.join(directoryPath, 'index.ts'); - - // Get all TypeScript files in the directory (excluding index.ts itself) - const tsFiles = await this.fileSystemService.getTypeScriptFiles(directoryPath); - - if (tsFiles.length === 0) { - throw new Error('No TypeScript files found in the selected directory'); - } - - // Parse exports from each file - const exportsByFile = new Map(); - for (const filePath of tsFiles) { - const content = await this.fileSystemService.readFile(filePath); - const exports = this.exportParser.extractExports(content); - if (exports.length > 0) { - const relativePath = path.relative(directoryPath, filePath); - exportsByFile.set(relativePath, exports); - } - } - - // Build barrel file content - const barrelContent = this.barrelContentBuilder.buildContent(exportsByFile, directoryPath); - - // Write the barrel file - await this.fileSystemService.writeFile(barrelFilePath, barrelContent); - } -} diff --git a/src/core/index.ts b/src/core/index.ts new file mode 100644 index 0000000..2311989 --- /dev/null +++ b/src/core/index.ts @@ -0,0 +1,19 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Export core barrel roll functionality +export * from './services/index.js'; diff --git a/src/core/services/barrel-content.builder.ts b/src/core/services/barrel-content.builder.ts new file mode 100644 index 0000000..d6aac1e --- /dev/null +++ b/src/core/services/barrel-content.builder.ts @@ -0,0 +1,152 @@ +const DEFAULT_KEYWORD = 'default'; +const NEWLINE = '\n'; +const PARENT_DIRECTORY = '..'; + +export type BarrelEntry = + | { + kind: 'file'; + exports: string[]; + } + | { + kind: 'directory'; + }; + +/** + * Service to build the content of a barrel file from exports. + */ +export class BarrelContentBuilder { + buildContent(entries: Map, directoryPath: string): string; + buildContent(entries: Map, directoryPath: string): string; + buildContent(entries: Map, _directoryPath: string): string { + const lines: string[] = []; + const normalizedEntries = this.normalizeEntries(entries); + + // Sort files alphabetically for consistent output + const sortedPaths = Array.from(normalizedEntries.keys()).sort(); + + for (const relativePath of sortedPaths) { + const entry = normalizedEntries.get(relativePath); + if (!entry) { + continue; + } + + const exportLines = this.createLinesForEntry(relativePath, entry); + if (exportLines.length > 0) { + lines.push(...exportLines); + } + } + + // Add newline at end of file + return lines.join(NEWLINE) + NEWLINE; + } + + /** + * Normalizes mixed entry maps to barrel entries. + * @param entries Source entries (string[] or BarrelEntry) + * @returns Map of BarrelEntry + */ + private normalizeEntries(entries: Map): Map { + const normalized = new Map(); + + for (const [relativePath, entry] of entries) { + if (Array.isArray(entry)) { + normalized.set(relativePath, { kind: 'file', exports: entry }); + } else { + normalized.set(relativePath, entry); + } + } + + return normalized; + } + + /** + * Creates export lines for a given entry. + * @param relativePath The entry path + * @param entry The entry metadata + * @returns export lines for the entry + */ + private createLinesForEntry(relativePath: string, entry: BarrelEntry): string[] { + if (entry.kind === 'directory') { + return this.buildDirectoryExportLines(relativePath); + } + + return this.buildFileExportLines(relativePath, entry.exports); + } + + /** + * Builds export statement(s) for a directory entry. + * @param relativePath The directory path + * @returns The export statement(s) + */ + private buildDirectoryExportLines(relativePath: string): string[] { + const modulePath = this.getModulePath(relativePath); + if (modulePath.startsWith(PARENT_DIRECTORY)) { + return []; + } + return [`export * from './${modulePath}';`]; + } + + /** + * Builds export statement(s) for a file and its exports. + * @param filePath The file path + * @param exports The exports from the file + * @returns The export statement(s) + */ + private buildFileExportLines(filePath: string, exports: string[]): string[] { + // Filter out exports that reference parent folders (shouldn't happen at this stage but defensive) + const cleanedExports = exports.filter((exp) => !exp.includes(PARENT_DIRECTORY)); + + if (cleanedExports.length === 0) { + return []; + } + + // Convert file path to module path (remove .ts extension and normalize) + const modulePath = this.getModulePath(filePath); + + // Skip if this references a parent folder + if (modulePath.startsWith(PARENT_DIRECTORY)) { + return []; + } + + return this.generateExportStatements(modulePath, cleanedExports); + } + + /** + * Generates export statement(s) based on the type of exports. + * @param modulePath The module path + * @param exports The exports + * @returns The export statement(s) + */ + private generateExportStatements(modulePath: string, exports: string[]): string[] { + const hasDefaultExport = exports.includes(DEFAULT_KEYWORD); + const hasNamedExports = exports.some((exp) => exp !== DEFAULT_KEYWORD); + + if (hasDefaultExport && !hasNamedExports) { + // Only default export + return [`export { default } from './${modulePath}';`]; + } + + const lines: string[] = []; + if (hasNamedExports) { + const namedExports = exports.filter((exp) => exp !== DEFAULT_KEYWORD); + lines.push(`export { ${namedExports.join(', ')} } from './${modulePath}';`); + } + if (hasDefaultExport) { + lines.push(`export { default } from './${modulePath}';`); + } + return lines; + } + + /** + * Converts a file path to a module path (removes .ts extension). + * @param filePath The file path + * @returns The module path + */ + private getModulePath(filePath: string): string { + // Remove .ts or .tsx extension + let modulePath = filePath.replace(/\.tsx?$/, ''); + // Normalize path separators for cross-platform compatibility + modulePath = modulePath.replace(/\\/g, '/'); + return modulePath; + } +} diff --git a/src/core/services/barrel-file.generator.ts b/src/core/services/barrel-file.generator.ts new file mode 100644 index 0000000..0e17b35 --- /dev/null +++ b/src/core/services/barrel-file.generator.ts @@ -0,0 +1,170 @@ +import * as path from 'path'; + +import type { Uri } from 'vscode'; + +import { BarrelContentBuilder, BarrelEntry } from './barrel-content.builder'; +import { ExportParser } from './export.parser'; +import { FileSystemService } from './file-system.service'; + +const INDEX_FILE_NAME = 'index.ts'; + +export type BarrelGenerationMode = 'createOrUpdate' | 'updateExisting'; + +export interface BarrelGenerationOptions { + recursive?: boolean; + mode?: BarrelGenerationMode; +} + +type NormalizedGenerationOptions = Required; + +/** + * Service to generate or update a barrel (index.ts) file in a directory. + */ +export class BarrelFileGenerator { + private fileSystemService: FileSystemService; + private exportParser: ExportParser; + private barrelContentBuilder: BarrelContentBuilder; + + constructor( + fileSystemService?: FileSystemService, + exportParser?: ExportParser, + barrelContentBuilder?: BarrelContentBuilder, + ) { + this.fileSystemService = fileSystemService || new FileSystemService(); + this.exportParser = exportParser || new ExportParser(); + this.barrelContentBuilder = barrelContentBuilder || new BarrelContentBuilder(); + } + + /** + * Generates or updates an index.ts barrel file in the specified directory. + * @param directoryUri The URI of the directory where the barrel file should be created/updated. + * @param options Behavioural options for generation. + * @returns Promise that resolves when barrel files have been created/updated. + */ + async generateBarrelFile(directoryUri: Uri, options?: BarrelGenerationOptions): Promise { + const normalizedOptions = this.normalizeOptions(options); + await this.generateBarrelFileFromPath(directoryUri.fsPath, normalizedOptions); + } + + private async generateBarrelFileFromPath( + directoryPath: string, + options: NormalizedGenerationOptions, + ): Promise { + const barrelFilePath = path.join(directoryPath, INDEX_FILE_NAME); + const { tsFiles, subdirectories } = await this.readDirectoryInfo(directoryPath); + + if (options.recursive) { + await this.processChildDirectories(subdirectories, options); + } + + const entries = await this.collectEntries(directoryPath, tsFiles, subdirectories); + + const hasExistingIndex = await this.fileSystemService.fileExists(barrelFilePath); + if (!this.shouldWriteBarrel(entries, options, hasExistingIndex)) { + return; + } + + const barrelContent = this.barrelContentBuilder.buildContent(entries, directoryPath); + await this.fileSystemService.writeFile(barrelFilePath, barrelContent); + } + + private async readDirectoryInfo(directoryPath: string): Promise<{ + tsFiles: string[]; + subdirectories: string[]; + }> { + const [tsFiles, subdirectories] = await Promise.all([ + this.fileSystemService.getTypeScriptFiles(directoryPath), + this.fileSystemService.getSubdirectories(directoryPath), + ]); + return { tsFiles, subdirectories }; + } + + private async processChildDirectories( + subdirectories: string[], + options: NormalizedGenerationOptions, + ): Promise { + for (const subdirectoryPath of subdirectories) { + if ( + options.mode === 'updateExisting' && + !(await this.fileSystemService.fileExists(path.join(subdirectoryPath, INDEX_FILE_NAME))) + ) { + continue; + } + + await this.generateBarrelFileFromPath(subdirectoryPath, options); + } + } + + private async collectEntries( + directoryPath: string, + tsFiles: string[], + subdirectories: string[], + ): Promise> { + const entries = new Map(); + + await this.addFileEntries(directoryPath, tsFiles, entries); + await this.addSubdirectoryEntries(directoryPath, subdirectories, entries); + + return entries; + } + + private async addFileEntries( + directoryPath: string, + tsFiles: string[], + entries: Map, + ): Promise { + for (const filePath of tsFiles) { + const content = await this.fileSystemService.readFile(filePath); + const exports = this.exportParser.extractExports(content); + if (exports.length === 0) { + continue; + } + + const relativePath = path.relative(directoryPath, filePath); + entries.set(relativePath, { kind: 'file', exports }); + } + } + + private async addSubdirectoryEntries( + directoryPath: string, + subdirectories: string[], + entries: Map, + ): Promise { + for (const subdirectoryPath of subdirectories) { + const barrelPath = path.join(subdirectoryPath, INDEX_FILE_NAME); + if (!(await this.fileSystemService.fileExists(barrelPath))) { + continue; + } + + const relativePath = path.relative(directoryPath, subdirectoryPath); + entries.set(relativePath, { kind: 'directory' }); + } + } + + private shouldWriteBarrel( + entries: Map, + options: NormalizedGenerationOptions, + hasExistingIndex: boolean, + ): boolean { + if (entries.size > 0) { + return true; + } + + if (options.mode === 'updateExisting') { + return hasExistingIndex; + } + + if (!options.recursive) { + throw new Error('No TypeScript files found in the selected directory'); + } + + return hasExistingIndex; + } + + private normalizeOptions(options?: BarrelGenerationOptions): NormalizedGenerationOptions { + return { + recursive: options?.recursive ?? false, + mode: options?.mode ?? 'createOrUpdate', + }; + } +} diff --git a/src/services/exportParser.ts b/src/core/services/export.parser.ts similarity index 89% rename from src/services/exportParser.ts rename to src/core/services/export.parser.ts index 7b01f84..6ad22dd 100644 --- a/src/services/exportParser.ts +++ b/src/core/services/export.parser.ts @@ -1,6 +1,5 @@ /** * Service responsible for parsing TypeScript exports. - * Follows Single Responsibility Principle by handling only export extraction logic. */ export class ExportParser { /** @@ -35,11 +34,14 @@ export class ExportParser { while ((match = exportListPattern.exec(contentWithoutComments)) !== null) { const names = match[1] .split(',') - .map((name) => - name - .trim() - .split(/\s+as\s+/)[0] - .trim(), + .map( + (name) => + name + .trim() + .split(/\s+as\s+/i) + .map((segment) => segment.trim()) + .filter((segment) => segment.length > 0) + .pop() ?? '', ) .filter((name) => name.length > 0); exports.push(...names); diff --git a/src/core/services/file-system.service.ts b/src/core/services/file-system.service.ts new file mode 100644 index 0000000..a64ee2e --- /dev/null +++ b/src/core/services/file-system.service.ts @@ -0,0 +1,123 @@ +import { Dirent } from 'fs'; +import * as fs from 'fs/promises'; +import * as path from 'path'; + +const INDEX_FILE_NAME = 'index.ts'; +const IGNORED_DIRECTORIES = new Set(['node_modules', '.git']); + +/** + * Service responsible for file system operations. + * Follows Single Responsibility Principle by handling only file I/O operations. + */ +export class FileSystemService { + /** + * Gets all TypeScript files in a directory (excluding index.ts). + * @param directoryPath The directory path to search + * @returns Array of file paths + */ + async getTypeScriptFiles(directoryPath: string): Promise { + const entries = await this.readDirectory(directoryPath); + return entries + .filter((entry) => this.isTypeScriptFile(entry)) + .map((entry) => path.join(directoryPath, entry.name)); + } + + /** + * Gets subdirectories in a directory, excluding ignored folders. + * @param directoryPath The directory path to search + * @returns Array of absolute subdirectory paths + */ + async getSubdirectories(directoryPath: string): Promise { + const entries = await this.readDirectory(directoryPath); + return entries + .filter((entry) => this.isTraversableDirectory(entry)) + .map((entry) => path.join(directoryPath, entry.name)); + } + + /** + * Checks if a directory entry is a TypeScript file (excluding index.ts). + * @param entry The directory entry + * @returns True if it's a TypeScript file + */ + private isTypeScriptFile(entry: Dirent): boolean { + if (!entry.isFile()) { + return false; + } + + const isIndexFile = entry.name === INDEX_FILE_NAME; + const isDefinitionFile = entry.name.endsWith('.d.ts'); + const isTsFile = entry.name.endsWith('.ts') || entry.name.endsWith('.tsx'); + + return isTsFile && !isIndexFile && !isDefinitionFile; + } + + /** + * Determines if the entry is a traversable directory. + * @param entry The directory entry + * @returns True if the directory should be traversed + */ + private isTraversableDirectory(entry: Dirent): boolean { + return ( + entry.isDirectory() && !IGNORED_DIRECTORIES.has(entry.name) && !entry.name.startsWith('.') + ); + } + + /** + * Reads the content of a file. + * @param filePath The file path to read + * @returns The file content as a string + */ + async readFile(filePath: string): Promise { + try { + return await fs.readFile(filePath, 'utf-8'); + } catch (error) { + throw new Error( + `Failed to read file ${filePath}: ${error instanceof Error ? error.message : String(error)}`, + ); + } + } + + /** + * Writes content to a file. + * @param filePath The file path to write to + * @param content The content to write + */ + async writeFile(filePath: string, content: string): Promise { + try { + await fs.writeFile(filePath, content, 'utf-8'); + } catch (error) { + throw new Error( + `Failed to write file ${filePath}: ${error instanceof Error ? error.message : String(error)}`, + ); + } + } + + /** + * Checks whether a file exists. + * @param filePath The file path to check + * @returns True if the file exists + */ + async fileExists(filePath: string): Promise { + try { + await fs.access(filePath); + return true; + } catch { + return false; + } + } + + /** + * Reads the entries of a directory with error handling. + * @param directoryPath The directory path + * @returns Array of directory entries + */ + private async readDirectory(directoryPath: string): Promise { + try { + return await fs.readdir(directoryPath, { withFileTypes: true }); + } catch (error) { + throw new Error( + `Failed to read directory: ${error instanceof Error ? error.message : String(error)}`, + ); + } + } +} diff --git a/src/core/services/index.ts b/src/core/services/index.ts new file mode 100644 index 0000000..272c973 --- /dev/null +++ b/src/core/services/index.ts @@ -0,0 +1,21 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +export * from './barrel-content.builder.js'; +export * from './barrel-file.generator.js'; +export * from './export.parser.js'; +export * from './file-system.service.js'; diff --git a/src/extension.ts b/src/extension.ts index c6c61d5..ec6b6ce 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,25 +1,124 @@ +import * as path from 'path'; + import * as vscode from 'vscode'; -import { BarrelFileGenerator } from './barrelFileGenerator'; + +import { + BarrelFileGenerator, + type BarrelGenerationOptions, +} from './core/services/barrel-file.generator'; + +type CommandDescriptor = { + id: string; + options: BarrelGenerationOptions; + progressTitle: string; + successMessage: string; +}; export function activate(context: vscode.ExtensionContext) { console.log('Barrel Roll extension is now active'); - const disposable = vscode.commands.registerCommand( - 'barrel-roll.generateBarrel', - async (uri: vscode.Uri) => { - try { - const generator = new BarrelFileGenerator(); - await generator.generateBarrelFile(uri); - vscode.window.showInformationMessage('Barrel file generated/updated successfully!'); - } catch (error) { - vscode.window.showErrorMessage( - `Failed to generate barrel file: ${error instanceof Error ? error.message : String(error)}`, - ); - } + const generator = new BarrelFileGenerator(); + + const descriptors: CommandDescriptor[] = [ + { + id: 'barrel-roll.generateBarrel', + options: { recursive: false, mode: 'createOrUpdate' }, + progressTitle: 'Barrel Roll: Generating barrel...', + successMessage: 'Barrel Roll: barrel file generated successfully.', }, - ); + { + id: 'barrel-roll.generateBarrelRecursive', + options: { recursive: true, mode: 'createOrUpdate' }, + progressTitle: 'Barrel Roll: Generating barrels recursively...', + successMessage: 'Barrel Roll: barrel files generated recursively.', + }, + { + id: 'barrel-roll.updateBarrel', + options: { recursive: true, mode: 'updateExisting' }, + progressTitle: 'Barrel Roll: Updating barrels...', + successMessage: 'Barrel Roll: barrel files sanitized successfully.', + }, + ]; - context.subscriptions.push(disposable); + for (const descriptor of descriptors) { + const disposable = registerBarrelCommand(generator, descriptor); + context.subscriptions.push(disposable); + } } export function deactivate() {} + +function registerBarrelCommand( + generator: BarrelFileGenerator, + descriptor: CommandDescriptor, +): vscode.Disposable { + return vscode.commands.registerCommand(descriptor.id, async (uri?: vscode.Uri) => { + try { + const targetDirectory = await resolveTargetDirectory(uri); + if (!targetDirectory) { + return; + } + + await withProgress(descriptor.progressTitle, async () => { + await generator.generateBarrelFile(targetDirectory, descriptor.options); + }); + + vscode.window.showInformationMessage(descriptor.successMessage); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + vscode.window.showErrorMessage(`Barrel Roll: ${message}`); + } + }); +} + +async function resolveTargetDirectory(uri?: vscode.Uri): Promise { + const initial = uri ?? (await promptForDirectory()); + if (!initial) { + return undefined; + } + + return ensureDirectoryUri(initial); +} + +async function promptForDirectory(): Promise { + const selected = await vscode.window.showOpenDialog({ + canSelectFiles: false, + canSelectFolders: true, + canSelectMany: false, + openLabel: 'Select folder to barrel', + }); + + if (!selected || selected.length === 0) { + return undefined; + } + + return selected[0]; +} + +async function ensureDirectoryUri(uri: vscode.Uri): Promise { + try { + const stat = await vscode.workspace.fs.stat(uri); + if (stat.type === vscode.FileType.Directory) { + return uri; + } + + if (stat.type === vscode.FileType.File) { + return vscode.Uri.file(path.dirname(uri.fsPath)); + } + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + throw new Error(`Unable to access selected resource: ${message}`); + } + + return uri; +} + +async function withProgress(title: string, task: () => Promise): Promise { + return vscode.window.withProgress( + { + location: vscode.ProgressLocation.Window, + title, + }, + task, + ); +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..3214c63 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,26 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// istanbul ignore file + +/** + * Main entry point for the repository. + */ +export * from './extension.js'; + +// Export core barrel roll functionality +export * from './core/index.js'; diff --git a/src/logging/config.ts b/src/logging/config.ts new file mode 100644 index 0000000..db55c14 --- /dev/null +++ b/src/logging/config.ts @@ -0,0 +1,154 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import * as pino from 'pino'; + +import type { IEnvironmentVariables } from '../types/env.js'; + +import { IPinoLoggerConfig } from './pino/types.js'; + +/** + * Environment-based configuration resolver + */ +export class LoggerConfigResolver { + /** + * Resolve configuration from environment variables and defaults + * @param overrides - Partial configuration to override defaults + * @param env - Environment variables (defaults to process.env for production use) + */ + static resolve( + overrides: Partial = {}, + env: IEnvironmentVariables = process.env as IEnvironmentVariables, + ): IPinoLoggerConfig { + const config = this.createBaseConfig(env); + this.applyEnvironmentSpecificSettings(config, env); + return { ...config, ...overrides }; + } + + /** + * Create the base configuration with common settings + * @param env - Environment variables + * @return Base IPinoLoggerConfig object + */ + private static createBaseConfig(env: IEnvironmentVariables): IPinoLoggerConfig { + const isGitHubActions = Boolean(env.GITHUB_ACTIONS); + + return { + level: (env.LOG_LEVEL as pino.LevelWithSilent) || 'info', + prettyPrint: this.isDevelopment(env), + enableCore: isGitHubActions, + enablePino: true, + base: { + service: 'github-action', + version: env.npm_package_version || '1.0.0', + ...(isGitHubActions && this.getGitHubMetadata(env)), + }, + }; + } + + /** + * Apply environment-specific transport settings + * @param config - The configuration object to modify + * @param env - Environment variables + */ + private static applyEnvironmentSpecificSettings( + config: IPinoLoggerConfig, + env: IEnvironmentVariables, + ) { + if (this.isProduction(env)) { + config.transport = this.createProductionTransport(env); + } else if (this.isDevelopment(env)) { + config.transport = this.createDevelopmentTransport(); + } + } + + /** + * Check if running in development environment + * @param env - Environment variables + * @return True if in development mode, false otherwise + */ + private static isDevelopment(env: IEnvironmentVariables): boolean { + return env.NODE_ENV === 'development'; + } + + /** + * Check if running in production environment + * @param env - Environment variables + */ + private static isProduction(env: IEnvironmentVariables): boolean { + return env.NODE_ENV === 'production'; + } + + /** + * Get GitHub Actions metadata for logging + * @param env - Environment variables + * @return Object with GitHub metadata + */ + private static getGitHubMetadata(env: IEnvironmentVariables) { + return { + repository: env.GITHUB_REPOSITORY, + workflow: env.GITHUB_WORKFLOW, + runId: env.GITHUB_RUN_ID, + ref: env.GITHUB_REF, + sha: env.GITHUB_SHA, + }; + } + + /** + * Create transport configuration for production + * @param env - Environment variables + * @return Transport options for production logging + */ + private static createProductionTransport(env: IEnvironmentVariables) { + return { + target: 'pino/file', + options: { + destination: env.LOG_FILE || './logs/app.log', + mkdir: true, + }, + }; + } + + /** + * Create transport configuration for development + * @return Transport options for development logging + */ + private static createDevelopmentTransport() { + return { + target: 'pino-pretty', + options: { + colorize: true, + translateTime: 'yyyy-mm-dd HH:MM:ss', + ignore: 'pid,hostname', + singleLine: false, + }, + }; + } + + /** + * Create Pino options from resolved config + * @param config - The resolved IPinoLoggerConfig + * @returns Pino LoggerOptions object + */ + static toPinoOptions(config: IPinoLoggerConfig): pino.LoggerOptions { + return { + level: config.level || 'info', + transport: config.transport, + base: config.base || {}, + }; + } +} diff --git a/src/logging/filters/index.ts b/src/logging/filters/index.ts new file mode 100644 index 0000000..562e4e9 --- /dev/null +++ b/src/logging/filters/index.ts @@ -0,0 +1,19 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Log filtering utilities +export * from './log-filters.js'; diff --git a/src/logging/filters/log-filters.ts b/src/logging/filters/log-filters.ts new file mode 100644 index 0000000..2af309e --- /dev/null +++ b/src/logging/filters/log-filters.ts @@ -0,0 +1,100 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { ILogMetadata, LogFilter, LogLevel } from '../types.js'; + +/** + * Common log filters + */ +export class LogFilters { + private static readonly LEVEL_VALUES: Record = { + [LogLevel.GROUP]: -1, + [LogLevel.DEBUG]: 0, + [LogLevel.INFO]: 1, + [LogLevel.WARNING]: 2, + [LogLevel.ERROR]: 3, + [LogLevel.FAILED]: 4, + }; + + /** + * Filter out logs below a certain level + * @param minLevel - The minimum log level to allow. + * @return A LogFilter function that filters out logs below the specified level. + */ + static levelFilter(minLevel: LogLevel): LogFilter { + const minLevelValue = this.LEVEL_VALUES[minLevel]; + + return (level: string) => { + const levelValue = this.LEVEL_VALUES[level as keyof typeof this.LEVEL_VALUES] ?? 1; + return levelValue >= minLevelValue; + }; + } + + /** + * Exclude logs that match a pattern + * @param pattern - The string or RegExp pattern to match against log messages. + * @return A LogFilter function that excludes messages matching the pattern. + */ + static excludePattern(pattern: string | RegExp): LogFilter { + const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern; + return (_, message) => !regex.test(message); + } + + /** + * Only include logs that match a pattern + * @param pattern - The string or RegExp pattern to match against log messages. + * @return A LogFilter function that includes only messages matching the pattern. + */ + static includePattern(pattern: string | RegExp): LogFilter { + const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern; + return (_, message) => regex.test(message); + } + + /** + * Filter based on metadata properties + * @param predicate - A function that takes metadata and returns true to include the log, false to exclude it. + * @return A LogFilter function that filters logs based on the provided predicate. + */ + static metadataFilter(predicate: (metadata?: ILogMetadata) => boolean): LogFilter { + return (_, __, metadata) => predicate(metadata); + } + + /** + * Rate limiting filter (simple implementation) + * @param maxPerSecond - Maximum number of logs allowed per second. + * @return A LogFilter function that limits the rate of logs. + */ + static rateLimit(maxPerSecond: number): LogFilter { + let lastReset = Date.now(); + let count = 0; + + return () => { + const now = Date.now(); + if (now - lastReset >= 1000) { + lastReset = now; + count = 0; + } + + if (count >= maxPerSecond) { + return false; + } + + count++; + return true; + }; + } +} diff --git a/src/logging/index.ts b/src/logging/index.ts new file mode 100644 index 0000000..bbd60af --- /dev/null +++ b/src/logging/index.ts @@ -0,0 +1,32 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Export types +export * from './types.js'; +export * from './pino/types.js'; + +// Export loggers +export * from './loggers/index.js'; + +// Export Pino logger +export * from './pino/index.js'; + +// Export filters +export * from './filters/index.js'; + +// Export config +export { LoggerConfigResolver } from './config.js'; diff --git a/src/logging/loggers/composite.ts b/src/logging/loggers/composite.ts new file mode 100644 index 0000000..aaf175a --- /dev/null +++ b/src/logging/loggers/composite.ts @@ -0,0 +1,211 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { ILogger, ILogMetadata } from '../types.js'; + +/** + * CompositeLogger that delegates logging calls to multiple logger providers. + * This allows for logging to multiple destinations simultaneously (e.g., console and file). + */ +export class CompositeLogger implements ILogger { + private loggers: ILogger[]; + + constructor(loggers: ILogger[]) { + this.loggers = loggers; + } + + /** + * Logs an informational message to all registered loggers. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + info(message: string, metadata?: ILogMetadata): void { + this.loggers.forEach((logger) => logger.info(message, metadata)); + } + + /** + * Logs a debug message to all registered loggers. + * @param message - The message to log. + */ + debug(message: string): void { + this.loggers.forEach((logger) => logger.debug(message)); + } + + /** + * Logs a warning message to all registered loggers. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + warning(message: string, metadata?: ILogMetadata): void { + this.loggers.forEach((logger) => logger.warning(message, metadata)); + } + + /** + * Logs an error message to all registered loggers. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + error(message: string, metadata?: ILogMetadata): void { + this.loggers.forEach((logger) => logger.error(message, metadata)); + } + + /** + * Sets the action as failed in all registered loggers. + * @param message - The failure message. + * @param metadata - Optional metadata to include with the failure. + */ + setFailed(message: string, metadata?: ILogMetadata): void { + this.loggers.forEach((logger) => logger.setFailed(message, metadata)); + } + + /** + * Executes a grouped operation with all registered loggers. + * Each logger's group wraps the function execution individually. + * @param name - The name of the group. + * @param fn - The function to execute within the group. + * @returns A promise that resolves when all group operations complete. + */ + async group(name: string, fn: () => Promise): Promise { + if (this.loggers.length === 0) { + return fn(); + } + + if (this.loggers.length === 1) { + return this.loggers[0].group(name, fn); + } + + return this.executeGroupWithMultipleLoggers(name, fn); + } + + /** + * Execute group operation when there are multiple loggers. + * @param name - The name of the group. + * @param fn - The function to execute within the group. + * @returns A promise that resolves when all group operations complete. + */ + private async executeGroupWithMultipleLoggers(name: string, fn: () => Promise): Promise { + const results = await Promise.allSettled( + this.loggers.map((logger, index) => this.executeLoggerGroup(logger, index, name, fn)), + ); + + return this.processGroupResults(results); + } + + /** + * Execute group operation for a single logger with error handling. + * @param logger - The logger to execute the group on. + * @param index - The index of the logger in the composite. + * @param name - The name of the group. + * @param fn - The function to execute within the group. + * @returns A promise that resolves with the result of the group operation. + */ + private async executeLoggerGroup( + logger: ILogger, + index: number, + name: string, + fn: () => Promise, + ): Promise { + try { + return await logger.group(name, fn); + } catch (error) { + throw new Error(`Logger ${index} failed in group operation: ${error}`); + } + } + + /** + * Process the results of multiple logger group operations. + * @param results - Array of PromiseSettledResult from each logger's group operation. + * @returns The result from the first successful logger, or throws if all failed. + */ + private processGroupResults(results: PromiseSettledResult[]): T { + const { failures, successResult } = this.analyzeResults(results); + + if (failures.length === results.length) { + this.logAllFailures(failures); + throw failures[0].error; + } + + if (failures.length > 0) { + this.logPartialFailures(failures, results.length); + } + + return successResult as T; + } + + /** + * Analyze the results to separate failures and find success result. + * @return An object containing failures and the first successful result (if any). + */ + private analyzeResults(results: PromiseSettledResult[]) { + const failures: Array<{ index: number; error: unknown }> = []; + let successResult: T | undefined; + + results.forEach((result, index) => { + if (result.status === 'fulfilled') { + if (successResult === undefined) { + successResult = result.value; + } + } else { + failures.push({ index, error: result.reason }); + } + }); + + return { failures, successResult }; + } + + /** + * Log when all loggers failed. + * @param failures - Array of failure details + */ + private logAllFailures(failures: Array<{ index: number; error: unknown }>) { + console.error('All loggers failed in group operation:', failures); + } + + /** + * Log when some loggers failed but others succeeded. + * @param failures - Array of failure details + * @param totalCount - Total number of loggers involved + */ + private logPartialFailures( + failures: Array<{ index: number; error: unknown }>, + totalCount: number, + ) { + console.warn( + `${failures.length} of ${totalCount} loggers failed in group operation:`, + failures, + ); + } + + /** + * Add a new logger to the composite. + * @param logger - The logger to add + */ + addLogger(logger: ILogger): void { + this.loggers.push(logger); + } + + /** + * Remove a logger from the composite. + * @param logger - The logger to remove + */ + removeLogger(logger: ILogger): void { + const index = this.loggers.indexOf(logger); + if (index > -1) { + this.loggers.splice(index, 1); + } + } +} diff --git a/src/logging/loggers/factory.ts b/src/logging/loggers/factory.ts new file mode 100644 index 0000000..3aebed1 --- /dev/null +++ b/src/logging/loggers/factory.ts @@ -0,0 +1,79 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import pino from 'pino'; + +import { PinoLogger } from '../pino/logger.js'; +import { LogLevel } from '../types.js'; + +import { CompositeLogger } from './composite.js'; + +/** + * Factory function to create a CompositeLogger with CoreLogger and PinoLogger. + * @param pinoOptions - Optional Pino configuration options + * @returns A CompositeLogger instance with both CoreLogger and PinoLogger + */ +export function createCompositeLogger(pinoOptions?: pino.LoggerOptions): CompositeLogger { + const pinoLogger = new PinoLogger(pinoOptions); + return new CompositeLogger([pinoLogger]); +} + +/** + * Factory function to create a PinoLogger with default configuration. + * @returns A PinoLogger instance configured for production environment + * + * @example + * ```typescript + * const logger = createPinoLogger(); + * logger.info('Starting application'); + * ``` + */ +export function createPinoLogger(): PinoLogger { + return new PinoLogger({ + level: process.env.LOG_LEVEL || LogLevel.INFO, + transport: getDefaultTransport(), + base: getDefaultBase(), + }); +} + +/** + * Get the default transport configuration based on environment + * @returns Transport options for development, undefined for production + */ +function getDefaultTransport() { + return process.env.NODE_ENV !== 'production' + ? { + target: 'pino-pretty', + options: { + colorize: true, + translateTime: 'yyyy-mm-dd HH:MM:ss', + ignore: 'pid,hostname', + }, + } + : undefined; +} + +/** + * Get the default base configuration + * @returns Base metadata including service name and version + */ +function getDefaultBase() { + return { + service: 'github-action', + version: process.env.npm_package_version || '1.0.0', + }; +} diff --git a/src/logging/loggers/filtered.ts b/src/logging/loggers/filtered.ts new file mode 100644 index 0000000..db5e023 --- /dev/null +++ b/src/logging/loggers/filtered.ts @@ -0,0 +1,221 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { ILogger, ILogMetadata, ISamplingStrategy, LogFilter, LogLevel } from '../types.js'; + +/** + * Logger wrapper that applies filtering and sampling + */ +export class FilteredLogger implements ILogger { + private logCounts = new Map(); + + constructor( + private wrappedLogger: ILogger, + private filters: LogFilter[] = [], + private sampling?: ISamplingStrategy, + ) {} + + /** + * Logs an informational message if it passes all filters. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + info(message: string, metadata?: ILogMetadata): void { + this.logIfAllowed(LogLevel.INFO, message, metadata, () => + metadata ? this.wrappedLogger.info(message, metadata) : this.wrappedLogger.info(message), + ); + } + + /** + * Logs a debug message if it passes all filters. + * @param message - The message to log. + */ + debug(message: string): void { + this.logIfAllowed(LogLevel.DEBUG, message, undefined, () => this.wrappedLogger.debug(message)); + } + + /** + * Logs a warning message if it passes all filters. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + warning(message: string, metadata?: ILogMetadata): void { + this.logIfAllowed(LogLevel.WARNING, message, metadata, () => + metadata + ? this.wrappedLogger.warning(message, metadata) + : this.wrappedLogger.warning(message), + ); + } + + /** + * Logs an error message if it passes all filters. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + error(message: string, metadata?: ILogMetadata): void { + this.logIfAllowed(LogLevel.ERROR, message, metadata, () => + metadata ? this.wrappedLogger.error(message, metadata) : this.wrappedLogger.error(message), + ); + } + + /** + * Logs a failure message (always logged, regardless of filters). + * @param message - The failure message. + * @param metadata - Optional metadata to include with the failure. + */ + setFailed(message: string, metadata?: ILogMetadata): void { + // Always log failures regardless of filtering + this.wrappedLogger.setFailed(message, metadata); + } + + /** + * Executes a grouped operation (not filtered). + * @param name - The name of the group. + * @param fn - The function to execute within the group. + * @returns A promise that resolves when the group operation completes. + */ + async group(name: string, fn: () => Promise): Promise { + return this.wrappedLogger.group(name, fn); + } + + /** + * Add a new filter + * @param filter - The filter function to add + */ + addFilter(filter: LogFilter): void { + this.filters.push(filter); + } + + /** + * Remove all filters + */ + clearFilters(): void { + this.filters = []; + } + + /** + * Update sampling strategy + * @param strategy - The new sampling strategy + */ + setSampling(strategy: ISamplingStrategy | undefined): void { + this.sampling = strategy; + } + + /** + * Determines if a log entry should be logged based on filters and sampling. + * @param level - The log level. + * @param message - The log message. + * @param metadata - Optional metadata associated with the log. + * @returns True if the log should be recorded, false otherwise. + */ + private shouldLog(level: LogLevel, message: string, metadata?: ILogMetadata): boolean { + // Apply filters - return false immediately if any filter fails + for (const filter of this.filters) { + if (!filter(level, message, metadata)) { + return false; + } + } + + // No sampling configured = allow all logs + if (!this.sampling) { + return true; + } + + return this.sampling.shouldSample + ? this.sampling.shouldSample(level, message, metadata) + : this.shouldSample(level); + } + + /** + * Determines if a log entry should be sampled based on rate and window constraints. + * @param level - The log level. + * @returns True if the log should be recorded, false otherwise. + */ + private shouldSample(level: LogLevel): boolean { + if (!this.passesRateSampling()) { + return false; + } + + const logCount = this.getOrCreateLogCount(level, Date.now(), this.sampling?.windowMs || 60000); + + if (!this.passesWindowSampling(logCount)) { + return false; + } + + logCount.count++; + return true; + } + + /** + * Determines if a log entry passes rate-based sampling. + * @returns True if the log passes rate sampling, false otherwise. + */ + private passesRateSampling(): boolean { + if (!this.sampling?.rate) { + return true; + } + // eslint-disable-next-line sonarjs/pseudo-random + return Math.random() <= this.sampling.rate; + } + + /** + * Determines if a log entry passes window-based sampling constraints. + * @param logCount - The current log count and window start time. + * @returns True if the log passes window sampling, false otherwise. + */ + private passesWindowSampling(logCount: { count: number; windowStart: number }): boolean { + return !(this.sampling?.maxPerWindow && logCount.count >= this.sampling.maxPerWindow); + } + + /** + * Logs a message if it passes filtering and sampling checks. + * @param level - The log level. + * @param message - The log message. + * @param metadata - Optional metadata associated with the log. + * @param logAction - The action to perform if the log is allowed. + */ + private logIfAllowed( + level: LogLevel, + message: string, + metadata: ILogMetadata | undefined, + logAction: () => void, + ): void { + if (this.shouldLog(level, message, metadata)) { + logAction(); + } + } + + /** + * Retrieves or initializes the log count for a given key and time window. + * @param key - The key representing the log level or category. + * @param now - The current timestamp. + * @param windowMs - The duration of the time window in milliseconds. + * @returns The log count object containing the count and window start time. + */ + private getOrCreateLogCount( + key: string, + now: number, + windowMs: number, + ): { count: number; windowStart: number } { + let logCount = this.logCounts.get(key); + if (!logCount || now - logCount.windowStart > windowMs) { + logCount = { count: 0, windowStart: now }; + this.logCounts.set(key, logCount); + } + return logCount; + } +} diff --git a/src/logging/loggers/index.ts b/src/logging/loggers/index.ts new file mode 100644 index 0000000..882690d --- /dev/null +++ b/src/logging/loggers/index.ts @@ -0,0 +1,26 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Core logger implementations +export { CompositeLogger } from './composite.js'; +export { FilteredLogger } from './filtered.js'; +export { MetricsLogger } from './metrics.js'; +export { MockLogger } from './mock.js'; +export { NoopLogger } from './noop.js'; + +// Factory functions +export { createCompositeLogger, createPinoLogger } from './factory.js'; diff --git a/src/logging/loggers/metrics.ts b/src/logging/loggers/metrics.ts new file mode 100644 index 0000000..b257978 --- /dev/null +++ b/src/logging/loggers/metrics.ts @@ -0,0 +1,261 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { ILogger, ILoggerMetrics, ILogMetadata, LogLevel } from '../types.js'; + +/** + * Logger wrapper that collects metrics and telemetry + */ +export class MetricsLogger implements ILogger { + private startTime = Date.now(); + private metrics: ILoggerMetrics = { + totalLogs: 0, + logsByLevel: {}, + errors: 0, + warnings: 0, + logRate: 0, + lastUpdated: Date.now(), + infoLogs: 0, + debugLogs: 0, + warningLogs: 0, + errorLogs: 0, + failedLogs: 0, + groupedOperations: 0, + logsPerMinute: 0, + peakLogsPerMinute: 0, + averageLogSize: 0, + uptime: 0, + }; + private totalLogSize = 0; + + constructor( + private wrappedLogger: ILogger, + private metricsCallback?: (metrics: ILoggerMetrics) => void, + ) {} + + /** + * Logs an informational message and updates metrics. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + info(message: string, metadata?: ILogMetadata): void { + this.recordLog('info', message, metadata); + this.wrappedLogger.info(message, metadata); + } + + /** + * Logs a debug message and updates metrics. + * @param message - The message to log. + */ + debug(message: string): void { + this.recordLog('debug', message); + this.wrappedLogger.debug(message); + } + + /** + * Logs a warning message and updates metrics. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + warning(message: string, metadata?: ILogMetadata): void { + this.recordLog('warning', message, metadata); + this.wrappedLogger.warning(message, metadata); + } + + /** + * Logs an error message and updates metrics. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + error(message: string, metadata?: ILogMetadata): void { + this.recordLog('error', message, metadata); + this.wrappedLogger.error(message, metadata); + } + + /** + * Logs a failure message and updates metrics. + * @param message - The failure message. + * @param metadata - Optional metadata to include with the failure. + */ + setFailed(message: string, metadata?: ILogMetadata): void { + this.recordLog(LogLevel.FAILED, message, metadata); + this.wrappedLogger.setFailed(message, metadata); + } + + /** + * Executes a grouped operation and tracks metrics. + * @param name - The name of the group. + * @param fn - The function to execute within the group. + * @returns A promise that resolves when the group operation completes. + */ + async group(name: string, fn: () => Promise): Promise { + this.metrics.groupedOperations++; + this.updateMetrics(); + return this.wrappedLogger.group(name, fn); + } + + /** + * Get current metrics snapshot + * @returns A copy of the current metrics + */ + getMetrics(): ILoggerMetrics { + this.updateMetrics(); + return { ...this.metrics }; + } + + /** + * Start periodic metrics reporting + * @param intervalMs - Reporting interval in milliseconds (default: 60000ms) + * @returns A function to stop the periodic reporting + */ + startMetricsReporting(intervalMs: number = 60000): () => void { + const interval = setInterval(() => { + // This would typically send metrics somewhere, but for now just update + this.updateMetrics(); + }, intervalMs); + + return () => clearInterval(interval); + } + + /** + * Records a log entry and updates metrics accordingly. + * @param level - The log level (e.g., 'info', 'error'). + * @param message - The log message. + * @param metadata - Optional metadata associated with the log. + */ + private recordLog(level: string, message?: string, metadata?: ILogMetadata): void { + this.incrementTotalLogs(); + this.updateLogsByLevel(level); + this.updateLogSize(message, metadata); + this.updateLevelMetrics(level); + this.updateLogTimestamps(); + } + + /** + * Increment the total logs counter. + */ + private incrementTotalLogs(): void { + this.metrics.totalLogs++; + } + + /** + * Update the logs by level counter. + */ + private updateLogsByLevel(level: string): void { + this.metrics.logsByLevel[level] = (this.metrics.logsByLevel[level] || 0) + 1; + } + + /** + * Update the total log size. + */ + private updateLogSize(message?: string, metadata?: ILogMetadata): void { + const logSize = (message?.length || 0) + (metadata ? JSON.stringify(metadata).length : 0); + this.totalLogSize += logSize; + } + + /** + * Update timestamp metrics for logging. + */ + private updateLogTimestamps(): void { + const now = Date.now(); + if (!this.metrics.firstLogTime) { + this.metrics.firstLogTime = now; + } + this.metrics.lastLogTime = now; + this.updateMetrics(); + } + + /** + * Updates metrics specific to the log level. + * @param level - The log level. + */ + private updateLevelMetrics(level: string): void { + const metricMap: Record void> = { + [LogLevel.INFO]: () => this.metrics.infoLogs++, + [LogLevel.DEBUG]: () => this.metrics.debugLogs++, + [LogLevel.WARNING]: () => { + this.metrics.warnings++; + this.metrics.warningLogs++; + }, + [LogLevel.ERROR]: () => { + this.metrics.errors++; + this.metrics.errorLogs++; + }, + [LogLevel.FAILED]: () => this.metrics.failedLogs++, + }; + + const updateFn = metricMap[level as LogLevel]; + if (updateFn) { + updateFn(); + } + } + + /** + * Updates overall metrics such as uptime, log rates, and averages. + */ + private updateMetrics(): void { + const now = Date.now(); + this.updateTimestamps(now); + this.updateUptime(now); + this.updateAverageLogSize(); + this.updateLogRates(now); + + // Call the metrics callback if provided + this.metricsCallback?.(this.metrics); + } + + /** + * Update timestamp-related metrics + */ + private updateTimestamps(now: number): void { + this.metrics.lastUpdated = now; + } + + /** + * Update uptime metric + */ + private updateUptime(now: number): void { + this.metrics.uptime = now - this.startTime; + } + + /** + * Update average log size metric + */ + private updateAverageLogSize(): void { + if (this.metrics.totalLogs > 0) { + this.metrics.averageLogSize = this.totalLogSize / this.metrics.totalLogs; + } + } + + /** + * Update log rate metrics + */ + private updateLogRates(now: number): void { + if (!this.metrics.firstLogTime) { + return; + } + + const durationMinutes = (now - this.metrics.firstLogTime) / (1000 * 60); + if (durationMinutes > 0) { + this.metrics.logsPerMinute = this.metrics.totalLogs / durationMinutes; + this.metrics.peakLogsPerMinute = Math.max( + this.metrics.peakLogsPerMinute, + this.metrics.logsPerMinute, + ); + } + } +} diff --git a/src/logging/loggers/mock.ts b/src/logging/loggers/mock.ts new file mode 100644 index 0000000..f91c08a --- /dev/null +++ b/src/logging/loggers/mock.ts @@ -0,0 +1,186 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { ILogCall, ILogger, ILogMetadata, LogLevel } from '../types.js'; + +/** + * Mock logger implementation for testing purposes. + * Captures all log calls for verification in tests. + */ +export class MockLogger implements ILogger { + public calls: ILogCall[] = []; + + /** + * Records an informational log call for testing. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + info(message: string, metadata?: ILogMetadata): void { + this.calls.push({ + level: LogLevel.INFO, + message, + metadata, + timestamp: new Date(), + }); + } + + /** + * Records a debug log call for testing. + * @param message - The message to log. + */ + debug(message: string): void { + this.calls.push({ level: LogLevel.DEBUG, message, timestamp: new Date() }); + } + + /** + * Records a warning log call for testing. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + warning(message: string, metadata?: ILogMetadata): void { + this.calls.push({ + level: LogLevel.WARNING, + message, + metadata, + timestamp: new Date(), + }); + } + + /** + * Records an error log call for testing. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + error(message: string, metadata?: ILogMetadata): void { + this.calls.push({ + level: LogLevel.ERROR, + message, + metadata, + timestamp: new Date(), + }); + } + + /** + * Records a failed log call for testing. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + setFailed(message: string, metadata?: ILogMetadata): void { + this.calls.push({ + level: LogLevel.FAILED, + message, + metadata, + timestamp: new Date(), + }); + } + + /** + * Groups multiple log calls together. + * @param name - The name of the group. + * @param fn - The function containing the log calls to group. + */ + async group(name: string, fn: () => Promise): Promise { + const startCall: ILogCall = { + level: LogLevel.GROUP, + message: `START: ${name}`, + timestamp: new Date(), + }; + this.calls.push(startCall); + + try { + const result = await fn(); + this.calls.push({ + level: LogLevel.GROUP, + message: `END: ${name}`, + timestamp: new Date(), + }); + return result; + } catch (error) { + this.calls.push({ + level: LogLevel.GROUP, + message: `ERROR: ${name}`, + metadata: { error }, + timestamp: new Date(), + }); + throw error; + } + } + + /** + * Get all calls for a specific log level. + * @param level - The log level to filter by. + * @returns Array of log calls for the specified level. + */ + getCallsForLevel(level: LogLevel): ILogCall[] { + return this.calls.filter((call) => call.level === level); + } + + /** + * Get the last call made to the logger. + * @returns The last log call or undefined if no calls were made. + */ + getLastCall(): ILogCall | undefined { + return this.calls[this.calls.length - 1]; + } + + /** + * Clear all recorded calls. + */ + clear(): void { + this.calls = []; + } + + /** + * Assert that a specific call was made. + * @param level - The expected log level. + * @param message - Optional message or regex pattern to match. + * @throws Error if the assertion fails. + */ + assertCalled(level: LogLevel, message?: string | RegExp): void { + const calls = this.getCallsForLevel(level); + if (calls.length === 0) { + throw new Error(`Expected ${level} to be called, but it wasn't`); + } + + if (message !== undefined) { + const matchingCalls = + typeof message === 'string' + ? calls.filter((call) => call.message.includes(message)) + : calls.filter((call) => message.test(call.message)); + + if (matchingCalls.length === 0) { + throw new Error( + `Expected ${level} to be called with message matching "${message}", but it wasn't`, + ); + } + } + } + + /** + * Assert that no calls were made to a specific level. + * @param level - The log level to check. + * @throws Error if the assertion fails. + */ + assertNotCalled(level: LogLevel): void { + const calls = this.getCallsForLevel(level); + if (calls.length > 0) { + throw new Error( + `Expected ${level} not to be called, but it was called ${calls.length} times`, + ); + } + } +} diff --git a/src/logging/loggers/noop.ts b/src/logging/loggers/noop.ts new file mode 100644 index 0000000..899d3fc --- /dev/null +++ b/src/logging/loggers/noop.ts @@ -0,0 +1,111 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import { ILogger, ILogMetadata } from '../types.js'; + +/** + * No-op logger implementation that mimics pino.Logger interface. + * Useful as a fallback when Pino logger initialization fails. + */ +export class NoopLogger implements ILogger { + // Pino.Logger properties + level = 'silent'; + levelVal = 100; + msgPrefix = ''; + + /** + * Logs an info message (no-op). + * @param _message - Message to log as failure. + * @param _metadata - Optional metadata for the failure. + */ + info(_message: string, _metadata?: ILogMetadata): void { + /* No-op */ + } + + /** + * Logs a debug message (no-op). + * @param _message - Message to log as failure. + * @param _metadata - Optional metadata for the failure. + */ + debug(_message: string, _metadata?: ILogMetadata): void { + /* No-op */ + } + + /** + * Logs a warning message (no-op). + * @param _message - Message to log as failure. + * @param _metadata - Optional metadata for the failure. + */ + warning(_message: string, _metadata?: ILogMetadata): void { + /* No-op */ + } + + /** + * Logs an error message (no-op). + * @param _message - Message to log as failure. + * @param _metadata - Optional metadata for the failure. + */ + error(_message: string, _metadata?: ILogMetadata): void { + /* No-op */ + } + + /** + * Logs a fatal message (no-op). + * @param _message - Message to log as failure. + * @param _metadata - Optional metadata for the failure. + */ + fatal(_message: string, _metadata?: ILogMetadata): void { + /* No-op */ + } + + /** + * Logs a trace message (no-op). + * @param _message - Message to log as failure. + * @param _metadata - Optional metadata for the failure. + */ + trace(_message: string, _metadata?: ILogMetadata): void { + /* No-op */ + } + + /** + * Creates a child logger (returns self for no-op behavior). + * @param _obj - Child logger configuration. + * @returns A new NoopLogger instance. + */ + child(_obj: unknown): NoopLogger { + return new NoopLogger(); + } + + /** + * Creates a child logger with bindings (returns self for no-op behavior). + * @param _message - Message to log as failure. + * @param _metadata - Optional metadata for the failure. + */ + setFailed(_message: string, _metadata?: ILogMetadata): void { + /* No-op */ + } + + /** + * Executes a grouped operation (no-op). + * @param _name - Name of the group. + * @param _fn - Function to execute within the group. + * @returns The result of the function execution. + */ + group(_name: string, _fn: () => Promise): Promise { + return _fn(); + } +} diff --git a/src/logging/pino/index.ts b/src/logging/pino/index.ts new file mode 100644 index 0000000..dcee10b --- /dev/null +++ b/src/logging/pino/index.ts @@ -0,0 +1,22 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// Pino logger implementation +export { PinoLogger } from './logger.js'; + +// Pino-specific types +export * from './types.js'; diff --git a/src/logging/pino/logger.ts b/src/logging/pino/logger.ts new file mode 100644 index 0000000..456d1f8 --- /dev/null +++ b/src/logging/pino/logger.ts @@ -0,0 +1,132 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import pino from 'pino'; + +import { NoopLogger } from '../loggers/noop.js'; +import { ILogger, ILogMetadata } from '../types.js'; + +/** + * Implementation of ILogger that uses Pino for structured logging. + */ +export class PinoLogger implements ILogger { + private logger: pino.Logger; + private isAvailable: boolean = true; + + constructor(options?: pino.LoggerOptions) { + try { + this.logger = pino( + options || { + level: process.env.LOG_LEVEL || 'info', + transport: { + target: 'pino-pretty', + options: { + colorize: true, + translateTime: 'yyyy-mm-dd HH:MM:ss', + ignore: 'pid,hostname', + }, + }, + }, + ); + } catch (error) { + this.isAvailable = false; + console.warn('Pino logger initialization failed:', error); + // Create a fallback null logger + this.logger = new NoopLogger() as unknown as pino.Logger; + } + } + + /** + * Check if Pino logger is available and functioning. + * @returns True if the logger is available, false otherwise. + */ + public isLoggerAvailable(): boolean { + return this.isAvailable; + } + + /** + * Logs an informational message using Pino. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + info(message: string, metadata?: ILogMetadata): void { + this.logger.info(metadata || {}, message); + } + + /** + * Logs a debug message using Pino. + * @param message - The message to log. + */ + debug(message: string): void { + this.logger.debug({}, message); + } + + /** + * Logs a warning message using Pino. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + warning(message: string, metadata?: ILogMetadata): void { + this.logger.warn(metadata || {}, message); + } + + /** + * Logs an error message using Pino. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + error(message: string, metadata?: ILogMetadata): void { + this.logger.error(metadata || {}, message); + } + + /** + * Logs a fatal error message using Pino (used for action failures). + * @param message - The failure message. + * @param metadata - Optional metadata to include with the failure. + */ + setFailed(message: string, metadata?: ILogMetadata): void { + this.logger.fatal(metadata || {}, `Action failed: ${message}`); + } + + /** + * Executes a grouped operation with Pino child logger context. + * @param name - The name of the group. + * @param fn - The function to execute within the group. + * @returns A promise that resolves when the group operation completes. + */ + async group(name: string, fn: () => Promise): Promise { + // Create a child logger for the group context + const childLogger = this.logger.child({ group: name }); + const originalLogger = this.logger; + + // Temporarily replace the logger with the child logger + this.logger = childLogger; + childLogger.info(`Starting group: ${name}`); + + try { + const result = await fn(); + childLogger.info(`Completed group: ${name}`); + return result; + } catch (error) { + childLogger.error({ error }, `Failed in group: ${name}`); + throw error; + } finally { + // Restore the original logger + this.logger = originalLogger; + } + } +} diff --git a/src/logging/pino/types.ts b/src/logging/pino/types.ts new file mode 100644 index 0000000..adf974d --- /dev/null +++ b/src/logging/pino/types.ts @@ -0,0 +1,38 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +import * as pino from 'pino'; + +/** + * Configuration options for logger setup + */ +export interface IPinoLoggerConfig { + /** Log level for Pino logger */ + level?: pino.LevelWithSilent; + /** Enable pretty printing in development */ + prettyPrint?: boolean; + /** Custom Pino transport configuration */ + transport?: pino.TransportSingleOptions | pino.TransportMultiOptions; + /** Base metadata to include in all logs */ + base?: Record; + /** Enable Core console logger */ + enableCore?: boolean; + /** Enable Pino logger (structured logging) */ + enablePino?: boolean; + /** Custom log destination (file path, stream, etc.) */ + destination?: string | NodeJS.WritableStream; +} diff --git a/src/logging/types.ts b/src/logging/types.ts new file mode 100644 index 0000000..57a1c6d --- /dev/null +++ b/src/logging/types.ts @@ -0,0 +1,249 @@ +/* + * Copyright 2025 Robert Lindley + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/** + * Supported log levels + */ +export enum LogLevel { + DEBUG = 'debug', + INFO = 'info', + WARNING = 'warning', + ERROR = 'error', + FAILED = 'failed', + GROUP = 'group', +} + +/** + * Log filter function type + */ +export type LogFilter = ( + level: string, + message: string, + metadata?: Record, +) => boolean; + +/** + * Sampling strategy interface for controlling log sampling + */ +export interface ISamplingStrategy { + /** + * Determines if a log should be sampled + * @param level - Log level + * @param message - Log message + * @param metadata - Optional metadata + * @returns true if the log should be included, false if filtered out + */ + shouldSample?(level: LogLevel, message: string, metadata?: ILogMetadata): boolean; + + /** Sample rate (0.0 to 1.0) */ + rate: number; + /** Maximum logs per time window */ + maxPerWindow?: number; + /** Time window in milliseconds */ + windowMs?: number; +} + +/** + * Represents a single log call captured by the + * mock logger + */ +export interface ILogCall { + /** + * The log level + */ + level: LogLevel; + + /** + * The log message + */ + message: string; + + /** + * Optional metadata associated with the log + */ + metadata?: ILogMetadata; + + /** + * Timestamp when the log was captured + */ + timestamp: Date; +} + +/** + * Metadata associated with log messages, useful for + * enhanced logging with contextual information. + */ +export interface ILogMetadata { + /** + * A title for the annotation. + * */ + title?: string; + /** + * The path of the file for which the annotation + * should be created. + */ + file?: string; + /** + * The start line for the annotation. + */ + startLine?: number; + /** + * The end line for the annotation. Defaults to + * `startLine` when `startLine` is provided. + */ + endLine?: number; + /** + * The start column for the annotation. Cannot be sent + * when `startLine` and `endLine` are different values. + */ + startColumn?: number; + /** + * The end column for the annotation. Cannot be sent when + * `startLine` and `endLine` are different values. + * + * Defaults to `startColumn` when `startColumn` is provided. + */ + endColumn?: number; + /** + * Additional custom metadata fields for structured logging + */ + [key: string]: unknown; +} + +/** + * Logger metrics and statistics + */ +export interface ILoggerMetrics { + /** + * Total number of logs processed + */ + totalLogs: number; + /** + * Logs grouped by level + */ + logsByLevel: Record; + /** + * Number of error log + */ + errors: number; + /** + * Number of warning logs + */ + warnings: number; + /** + * Average logs per second + */ + logRate: number; + /** + * Timestamp when metrics were last updated + */ + lastUpdated: number; + /** + * Number of info level logs + */ + infoLogs: number; + /** + * Number of debug level logs + */ + debugLogs: number; + /** + * Number of warning level logs + */ + warningLogs: number; + /** + * Number of error level logs + */ + errorLogs: number; + /** + * Number of failed logs + */ + failedLogs: number; + /** + * Number of grouped operations + */ + groupedOperations: number; + /** + * Timestamp of first log + */ + firstLogTime?: number; + /** + * Timestamp of last log + */ + lastLogTime?: number; + /** + * Average logs per minute + */ + logsPerMinute: number; + /** + * Peak logs per minute + */ + peakLogsPerMinute: number; + /** + * Average size of log messages + */ + averageLogSize: number; + /** + * Uptime in milliseconds + */ + uptime: number; +} + +/** + * Interface for logging operations. + */ +export interface ILogger { + /** + * Logs an informational message. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + info(message: string, metadata?: ILogMetadata): void; + + /** + * Logs a debug message. + * @param message - The message to log. + */ + debug(message: string): void; + + /** + * Logs a warning message. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + warning(message: string, metadata?: ILogMetadata): void; + + /** + * Logs an error message. + * @param message - The message to log. + * @param metadata - Optional metadata to include with the log. + */ + error(message: string, metadata?: ILogMetadata): void; + + /** + * Sets the action as failed with the given message. + * @param message - The failure message. + * @param metadata - Optional metadata to include with the failure. + */ + setFailed(message: string, metadata?: ILogMetadata): void; + + /** + * Logs a group of messages. + * @param name - The name of the group. + * @param fn - The function to execute within the group. + */ + group(name: string, fn: () => Promise): Promise; +} diff --git a/src/services/barrelContentBuilder.ts b/src/services/barrelContentBuilder.ts deleted file mode 100644 index 0d2511c..0000000 --- a/src/services/barrelContentBuilder.ts +++ /dev/null @@ -1,74 +0,0 @@ -import * as path from 'path'; - -/** - * Service responsible for building barrel file content. - * Follows Single Responsibility Principle by handling only content generation. - */ -export class BarrelContentBuilder { - /** - * Builds the content for a barrel file from a map of exports. - * Filters out any re-exports from parent folders. - * - * @param exportsByFile Map of file paths to their exports - * @param directoryPath The directory containing the files - * @returns The formatted barrel file content - */ - buildContent(exportsByFile: Map, directoryPath: string): string { - const lines: string[] = []; - - // Sort files alphabetically for consistent output - const sortedFiles = Array.from(exportsByFile.keys()).sort(); - - for (const filePath of sortedFiles) { - const exports = exportsByFile.get(filePath); - if (!exports || exports.length === 0) { - continue; - } - - // Filter out exports that reference parent folders (shouldn't happen at this stage but defensive) - const cleanedExports = exports.filter((exp) => !exp.includes('..')); - - if (cleanedExports.length === 0) { - continue; - } - - // Convert file path to module path (remove .ts extension and normalize) - const modulePath = this.getModulePath(filePath); - - // Skip if this references a parent folder - if (modulePath.startsWith('..')) { - continue; - } - - // Generate export statement - if (cleanedExports.includes('default') && cleanedExports.length === 1) { - // Only default export - lines.push(`export { default } from './${modulePath}';`); - } else if (cleanedExports.includes('default')) { - // Default export and named exports - const namedExports = cleanedExports.filter((exp) => exp !== 'default'); - lines.push(`export { ${namedExports.join(', ')} } from './${modulePath}';`); - lines.push(`export { default } from './${modulePath}';`); - } else { - // Only named exports - lines.push(`export { ${cleanedExports.join(', ')} } from './${modulePath}';`); - } - } - - // Add newline at end of file - return lines.join('\n') + '\n'; - } - - /** - * Converts a file path to a module path (removes .ts extension). - * @param filePath The file path - * @returns The module path - */ - private getModulePath(filePath: string): string { - // Remove .ts or .tsx extension - let modulePath = filePath.replace(/\.tsx?$/, ''); - // Normalize path separators for cross-platform compatibility - modulePath = modulePath.replace(/\\/g, '/'); - return modulePath; - } -} diff --git a/src/services/fileSystemService.ts b/src/services/fileSystemService.ts deleted file mode 100644 index dda9e9e..0000000 --- a/src/services/fileSystemService.ts +++ /dev/null @@ -1,63 +0,0 @@ -import * as vscode from 'vscode'; -import * as path from 'path'; -import * as fs from 'fs/promises'; - -/** - * Service responsible for file system operations. - * Follows Single Responsibility Principle by handling only file I/O operations. - */ -export class FileSystemService { - /** - * Gets all TypeScript files in a directory (excluding index.ts). - * @param directoryPath The directory path to search - * @returns Array of file paths - */ - async getTypeScriptFiles(directoryPath: string): Promise { - try { - const entries = await fs.readdir(directoryPath, { withFileTypes: true }); - const tsFiles: string[] = []; - - for (const entry of entries) { - if (entry.isFile() && entry.name.endsWith('.ts') && entry.name !== 'index.ts') { - tsFiles.push(path.join(directoryPath, entry.name)); - } - } - - return tsFiles; - } catch (error) { - throw new Error( - `Failed to read directory: ${error instanceof Error ? error.message : String(error)}`, - ); - } - } - - /** - * Reads the content of a file. - * @param filePath The file path to read - * @returns The file content as a string - */ - async readFile(filePath: string): Promise { - try { - return await fs.readFile(filePath, 'utf-8'); - } catch (error) { - throw new Error( - `Failed to read file ${filePath}: ${error instanceof Error ? error.message : String(error)}`, - ); - } - } - - /** - * Writes content to a file. - * @param filePath The file path to write to - * @param content The content to write - */ - async writeFile(filePath: string, content: string): Promise { - try { - await fs.writeFile(filePath, content, 'utf-8'); - } catch (error) { - throw new Error( - `Failed to write file ${filePath}: ${error instanceof Error ? error.message : String(error)}`, - ); - } - } -} diff --git a/src/test/runTest.ts b/src/test/runTest.ts index 014c3a2..2f364eb 100644 --- a/src/test/runTest.ts +++ b/src/test/runTest.ts @@ -1,21 +1,44 @@ import * as path from 'path'; +import { fileURLToPath } from 'url'; import { runTests } from '@vscode/test-electron'; -async function main() { +async function main(): Promise { try { + if (process.platform.startsWith('win')) { + console.warn( + 'VS Code integration tests are temporarily skipped on Windows because the Code executable rejects required CLI flags.', + ); + return; + } + // The folder containing the Extension Manifest package.json // Passed to `--extensionDevelopmentPath` - const extensionDevelopmentPath = path.resolve(__dirname, '../../'); + const extensionDevelopmentPath = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '../../', + ); // The path to test runner // Passed to --extensionTestsPath - const extensionTestsPath = path.resolve(__dirname, './suite/index'); + const extensionTestsPath = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + './suite/index', + ); // Download VS Code, unzip it and run the integration test - await runTests({ extensionDevelopmentPath, extensionTestsPath }); - } catch (err) { - console.error('Failed to run tests'); + const options: Parameters[0] = { + extensionDevelopmentPath, + extensionTestsPath, + }; + + if (process.platform === 'win32') { + options.launchArgs = []; + } + + await runTests(options); + } catch (error) { + console.error('Failed to run tests:', error); process.exit(1); } } diff --git a/src/test/suite/barrelContentBuilder.test.ts b/src/test/suite/barrel-content.builder.test.ts similarity index 97% rename from src/test/suite/barrelContentBuilder.test.ts rename to src/test/suite/barrel-content.builder.test.ts index 6e59130..ba4eee1 100644 --- a/src/test/suite/barrelContentBuilder.test.ts +++ b/src/test/suite/barrel-content.builder.test.ts @@ -1,5 +1,6 @@ import * as assert from 'assert'; -import { BarrelContentBuilder } from '../../services/barrelContentBuilder'; + +import { BarrelContentBuilder } from '../../core/services/barrel-content.builder'; suite('BarrelContentBuilder Test Suite', () => { let builder: BarrelContentBuilder; diff --git a/src/test/suite/barrelFileGenerator.test.ts b/src/test/suite/barrel-file.generator.test.ts similarity index 97% rename from src/test/suite/barrelFileGenerator.test.ts rename to src/test/suite/barrel-file.generator.test.ts index cadef4c..1862a99 100644 --- a/src/test/suite/barrelFileGenerator.test.ts +++ b/src/test/suite/barrel-file.generator.test.ts @@ -1,10 +1,12 @@ import * as assert from 'assert'; -import * as path from 'path'; import * as fs from 'fs/promises'; import * as os from 'os'; -import { BarrelFileGenerator } from '../../barrelFileGenerator'; +import * as path from 'path'; + import * as vscode from 'vscode'; +import { BarrelFileGenerator } from '../../core/services/barrel-file.generator'; + suite('BarrelFileGenerator Test Suite', () => { let testDir: string; @@ -17,7 +19,7 @@ suite('BarrelFileGenerator Test Suite', () => { // Clean up test directory try { await fs.rm(testDir, { recursive: true, force: true }); - } catch (error) { + } catch { // Ignore cleanup errors } }); diff --git a/src/test/suite/exportParser.test.ts b/src/test/suite/export.parser.test.ts similarity index 97% rename from src/test/suite/exportParser.test.ts rename to src/test/suite/export.parser.test.ts index 3c2a16b..7c88c3e 100644 --- a/src/test/suite/exportParser.test.ts +++ b/src/test/suite/export.parser.test.ts @@ -1,5 +1,6 @@ import * as assert from 'assert'; -import { ExportParser } from '../../services/exportParser'; + +import { ExportParser } from '../../core/services/export.parser'; suite('ExportParser Test Suite', () => { let parser: ExportParser; diff --git a/src/test/suite/index.ts b/src/test/suite/index.ts index 1f34957..5f5a755 100644 --- a/src/test/suite/index.ts +++ b/src/test/suite/index.ts @@ -1,6 +1,8 @@ import * as path from 'path'; -import Mocha from 'mocha'; +import { fileURLToPath } from 'url'; + import { glob } from 'glob'; +import Mocha from 'mocha'; export async function run(): Promise { // Create the mocha test @@ -9,7 +11,7 @@ export async function run(): Promise { color: true, }); - const testsRoot = path.resolve(__dirname, '..'); + const testsRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); const files = await glob('**/**.test.js', { cwd: testsRoot }); diff --git a/src/types/env.ts b/src/types/env.ts new file mode 100644 index 0000000..400ec1c --- /dev/null +++ b/src/types/env.ts @@ -0,0 +1,15 @@ +/** + * Environment variables interface for testing + */ +export interface IEnvironmentVariables { + LOG_LEVEL?: string; + LOG_FILE?: string; + GITHUB_ACTIONS?: string; + GITHUB_REPOSITORY?: string; + GITHUB_WORKFLOW?: string; + GITHUB_RUN_ID?: string; + GITHUB_REF?: string; + GITHUB_SHA?: string; + NODE_ENV?: string; + npm_package_version?: string; +} diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..1ae80f1 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,2 @@ +// Export environment variable types +export { type IEnvironmentVariables } from './env.js'; diff --git a/tsconfig.json b/tsconfig.json index 5d0d4bf..0a7fd6a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,17 +1,41 @@ { + "$schema": "https://json.schemastore.org/tsconfig", "compilerOptions": { - "module": "commonjs", - "target": "ES2020", - "lib": ["ES2020"], - "outDir": "out", - "sourceMap": true, - "strict": true, - "rootDir": "src", + "allowSyntheticDefaultImports": true, + "baseUrl": ".", + "declaration": false, "esModuleInterop": true, - "skipLibCheck": true, "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true + "isolatedModules": true, + "lib": ["ES2022"], + "module": "ES2022", + "moduleResolution": "Node", + "noEmit": false, + "noImplicitAny": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "outDir": "./dist", + "paths": { + "@/*": ["src/*"] + }, + "removeComments": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": false, + "strict": true, + "target": "ES2022", + "useUnknownInCatchVariables": true }, - "include": ["src/**/*"], - "exclude": ["node_modules", ".vscode-test"] + "exclude": [ + ".vscode-test", + "tests", + "__mocks__/**/*", + "dist", + "node_modules", + "out", + "src/**/*.spec.ts", + "src/**/*.test.ts", + "src/**/__tests__/**/*" + ], + "include": ["src/**/*"] } diff --git a/tsconfig.test.json b/tsconfig.test.json new file mode 100644 index 0000000..23a5a34 --- /dev/null +++ b/tsconfig.test.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "allowJs": true, + "declaration": true, + "declarationMap": true, + "module": "NodeNext", + "moduleResolution": "NodeNext", + "noEmit": true, + "removeComments": false, + "sourceMap": true, + "target": "ES2022" + }, + "exclude": ["dist", "node_modules"], + "extends": "./tsconfig.json", + "include": [ + "__mocks__", + "__tests__", + "src", + "eslint.config.mjs", + "jest.config.cjs", + "rollup.config.js" + ] +} diff --git a/webpack.config.js b/webpack.config.js index a410524..4f14acb 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -12,14 +12,14 @@ const config = { path: path.resolve(__dirname, 'dist'), filename: 'extension.js', libraryTarget: 'commonjs2', - devtoolModuleFilenameTemplate: '../[resource-path]' + devtoolModuleFilenameTemplate: '../[resource-path]', }, devtool: 'source-map', externals: { - vscode: 'commonjs vscode' + vscode: 'commonjs vscode', }, resolve: { - extensions: ['.ts', '.js'] + extensions: ['.ts', '.js'], }, module: { rules: [ @@ -28,11 +28,11 @@ const config = { exclude: /node_modules/, use: [ { - loader: 'ts-loader' - } - ] - } - ] - } + loader: 'ts-loader', + }, + ], + }, + ], + }, }; module.exports = config; From 93d5f3a77eeb273b44df0dae0b337792bb5b3c69 Mon Sep 17 00:00:00 2001 From: coderrob Date: Fri, 17 Oct 2025 10:20:23 -0500 Subject: [PATCH 02/20] refactor: update project configuration and dependencies - Removed '**/dist/**' from ESLint ignores. - Updated Jest configuration to ignore '/dist/' in test paths. - Changed main entry point in package.json from './dist/extension.js' to './out/extension.js'. - Updated Rollup output path from 'dist/index.mjs' to 'out/index.mjs'. - Modified runTest.ts to skip tests in headless/CI/Windows environments. - Updated import paths in test files to include '.js' extension. - Added logging to test suite index.ts for better debugging. - Created tsconfig.emit-test.json for test compilation. - Updated tsconfig.json to change output directory from './dist' to './out'. - Added tsconfig.test-suite.json for test suite configuration. - Updated tsconfig.test.json to exclude 'out' directory. - Added webpack.config.cjs for bundling the extension. --- .eslintrc.json | 2 +- .gitattributes | 2 +- .gitignore | 1 - .jscpd.json | 1 - .npmignore | 1 - .prettierignore | 1 - ARCHITECTURE.md | 2 - dist/extension.js | 296 ++++++++++++++++++ dist/extension.js.map | 1 + eslint.config.mjs | 1 - jest.config.cjs | 11 +- package.json | 18 +- rollup.config.js | 2 +- src/test/runTest.ts | 35 ++- src/test/suite/barrel-content.builder.test.ts | 2 +- src/test/suite/barrel-file.generator.test.ts | 2 +- src/test/suite/export.parser.test.ts | 2 +- src/test/suite/index.ts | 28 +- tsconfig.emit-test.json | 18 ++ tsconfig.json | 3 +- tsconfig.test-suite.json | 30 ++ tsconfig.test.json | 4 +- webpack.config.js => webpack.config.cjs | 2 +- 23 files changed, 403 insertions(+), 62 deletions(-) create mode 100644 dist/extension.js create mode 100644 dist/extension.js.map create mode 100644 tsconfig.emit-test.json create mode 100644 tsconfig.test-suite.json rename webpack.config.js => webpack.config.cjs (93%) diff --git a/.eslintrc.json b/.eslintrc.json index 3de4096..c5908b0 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,5 +1,5 @@ { - "ignorePatterns": ["out", "dist", ".vscode-test", "**/*.d.ts"], + "ignorePatterns": ["out", ".vscode-test", "node_modules", "**/*.d.ts"], "parser": "@typescript-eslint/parser", "parserOptions": { "ecmaVersion": 6, diff --git a/.gitattributes b/.gitattributes index 6ba5456..9372b5f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,3 @@ * text=auto eol=lf -dist/** -diff linguist-generated=true +out/** -diff linguist-generated=true diff --git a/.gitignore b/.gitignore index d178290..507888c 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,6 @@ package-lock.json* .pnp.* # Build outputs -dist/ lib/ out/ build/ diff --git a/.jscpd.json b/.jscpd.json index c51c27a..60966ce 100644 --- a/.jscpd.json +++ b/.jscpd.json @@ -4,7 +4,6 @@ "**/.vscode-test/**", "**/__mocks__/**", "**/coverage/**", - "**/dist/**", "**/node_modules/**", "**/out/**" ], diff --git a/.npmignore b/.npmignore index 81af679..7b8c65f 100644 --- a/.npmignore +++ b/.npmignore @@ -24,7 +24,6 @@ badges/ # Build artifacts .vscode-test/ audit/ -dist/ out/ coverage/ node_modules/ diff --git a/.prettierignore b/.prettierignore index 97405b7..2fbac30 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,7 +2,6 @@ .vscode-test/ audit/ coverage/ -dist/ node_modules/ out/ script/*.sh diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 04441dd..25e1e95 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -68,7 +68,6 @@ barrel-roll/ │ └── dependency-graph.md # Dependency analysis reports ├── .vscode/ # VS Code workspace config ├── .github/workflows/ # CI/CD pipelines -├── dist/ # Webpack bundled output └── out/ # TypeScript compiled output ``` @@ -214,7 +213,6 @@ All services throw descriptive errors that bubble up to the extension entry poin ### Development 1. **TypeScript Compilation**: `tsc` → `out/` directory -2. **Webpack Bundling**: `webpack` → `dist/extension.js` ### Production diff --git a/dist/extension.js b/dist/extension.js new file mode 100644 index 0000000..db7e7c6 --- /dev/null +++ b/dist/extension.js @@ -0,0 +1,296 @@ +(() => { + 'use strict'; + var e = { + d: (r, t) => { + for (var i in t) + e.o(t, i) && !e.o(r, i) && Object.defineProperty(r, i, { enumerable: !0, get: t[i] }); + }, + o: (e, r) => Object.prototype.hasOwnProperty.call(e, r), + r: (e) => { + ('undefined' != typeof Symbol && + Symbol.toStringTag && + Object.defineProperty(e, Symbol.toStringTag, { value: 'Module' }), + Object.defineProperty(e, '__esModule', { value: !0 })); + }, + }, + r = {}; + (e.r(r), e.d(r, { activate: () => p, deactivate: () => h })); + const t = require('path'), + i = require('vscode'), + s = 'default', + n = '..'; + class o { + buildContent(e, r) { + const t = [], + i = this.normalizeEntries(e), + s = Array.from(i.keys()).sort(); + for (const e of s) { + const r = i.get(e); + if (!r) continue; + const s = this.createLinesForEntry(e, r); + s.length > 0 && t.push(...s); + } + return t.join('\n') + '\n'; + } + normalizeEntries(e) { + const r = new Map(); + for (const [t, i] of e) + Array.isArray(i) ? r.set(t, { kind: 'file', exports: i }) : r.set(t, i); + return r; + } + createLinesForEntry(e, r) { + return 'directory' === r.kind + ? this.buildDirectoryExportLines(e) + : this.buildFileExportLines(e, r.exports); + } + buildDirectoryExportLines(e) { + const r = this.getModulePath(e); + return r.startsWith(n) ? [] : [`export * from './${r}';`]; + } + buildFileExportLines(e, r) { + const t = r.filter((e) => !e.includes(n)); + if (0 === t.length) return []; + const i = this.getModulePath(e); + return i.startsWith(n) ? [] : this.generateExportStatements(i, t); + } + generateExportStatements(e, r) { + const t = r.includes(s), + i = r.some((e) => e !== s); + if (t && !i) return [`export { default } from './${e}';`]; + const n = []; + if (i) { + const t = r.filter((e) => e !== s); + n.push(`export { ${t.join(', ')} } from './${e}';`); + } + return (t && n.push(`export { default } from './${e}';`), n); + } + getModulePath(e) { + let r = e.replace(/\.tsx?$/, ''); + return ((r = r.replace(/\\/g, '/')), r); + } + } + class a { + extractExports(e) { + const r = [], + t = this.removeComments(e), + i = + /export\s+(?:abstract\s+)?(?:class|interface|type|function|const|enum|let|var)\s+([A-Za-z_$][A-Za-z0-9_$]*)/g; + let s; + for (; null !== (s = i.exec(t)); ) r.push(s[1]); + const n = /export\s*\{([^}]+)\}/g; + for (; null !== (s = n.exec(t)); ) { + const e = s[1] + .split(',') + .map( + (e) => + e + .trim() + .split(/\s+as\s+/i) + .map((e) => e.trim()) + .filter((e) => e.length > 0) + .pop() ?? '', + ) + .filter((e) => e.length > 0); + r.push(...e); + } + return (/export\s+default\s+/.test(t) && r.push('default'), [...new Set(r)]); + } + removeComments(e) { + let r = e.replace(/\/\*[\s\S]*?\*\//g, ''); + return ((r = r.replace(/\/\/.*$/gm, '')), r); + } + } + const l = require('fs/promises'), + c = new Set(['node_modules', '.git']); + class u { + async getTypeScriptFiles(e) { + return (await this.readDirectory(e)) + .filter((e) => this.isTypeScriptFile(e)) + .map((r) => t.join(e, r.name)); + } + async getSubdirectories(e) { + return (await this.readDirectory(e)) + .filter((e) => this.isTraversableDirectory(e)) + .map((r) => t.join(e, r.name)); + } + isTypeScriptFile(e) { + if (!e.isFile()) return !1; + const r = 'index.ts' === e.name, + t = e.name.endsWith('.d.ts'); + return (e.name.endsWith('.ts') || e.name.endsWith('.tsx')) && !r && !t; + } + isTraversableDirectory(e) { + return e.isDirectory() && !c.has(e.name) && !e.name.startsWith('.'); + } + async readFile(e) { + try { + return await l.readFile(e, 'utf-8'); + } catch (r) { + throw new Error(`Failed to read file ${e}: ${r instanceof Error ? r.message : String(r)}`); + } + } + async writeFile(e, r) { + try { + await l.writeFile(e, r, 'utf-8'); + } catch (r) { + throw new Error(`Failed to write file ${e}: ${r instanceof Error ? r.message : String(r)}`); + } + } + async fileExists(e) { + try { + return (await l.access(e), !0); + } catch { + return !1; + } + } + async readDirectory(e) { + try { + return await l.readdir(e, { withFileTypes: !0 }); + } catch (e) { + throw new Error(`Failed to read directory: ${e instanceof Error ? e.message : String(e)}`); + } + } + } + const d = 'index.ts'; + class f { + fileSystemService; + exportParser; + barrelContentBuilder; + constructor(e, r, t) { + ((this.fileSystemService = e || new u()), + (this.exportParser = r || new a()), + (this.barrelContentBuilder = t || new o())); + } + async generateBarrelFile(e, r) { + const t = this.normalizeOptions(r); + await this.generateBarrelFileFromPath(e.fsPath, t); + } + async generateBarrelFileFromPath(e, r) { + const i = t.join(e, d), + { tsFiles: s, subdirectories: n } = await this.readDirectoryInfo(e); + r.recursive && (await this.processChildDirectories(n, r)); + const o = await this.collectEntries(e, s, n), + a = await this.fileSystemService.fileExists(i); + if (!this.shouldWriteBarrel(o, r, a)) return; + const l = this.barrelContentBuilder.buildContent(o, e); + await this.fileSystemService.writeFile(i, l); + } + async readDirectoryInfo(e) { + const [r, t] = await Promise.all([ + this.fileSystemService.getTypeScriptFiles(e), + this.fileSystemService.getSubdirectories(e), + ]); + return { tsFiles: r, subdirectories: t }; + } + async processChildDirectories(e, r) { + for (const i of e) + ('updateExisting' !== r.mode || (await this.fileSystemService.fileExists(t.join(i, d)))) && + (await this.generateBarrelFileFromPath(i, r)); + } + async collectEntries(e, r, t) { + const i = new Map(); + return (await this.addFileEntries(e, r, i), await this.addSubdirectoryEntries(e, t, i), i); + } + async addFileEntries(e, r, i) { + for (const s of r) { + const r = await this.fileSystemService.readFile(s), + n = this.exportParser.extractExports(r); + if (0 === n.length) continue; + const o = t.relative(e, s); + i.set(o, { kind: 'file', exports: n }); + } + } + async addSubdirectoryEntries(e, r, i) { + for (const s of r) { + const r = t.join(s, d); + if (!(await this.fileSystemService.fileExists(r))) continue; + const n = t.relative(e, s); + i.set(n, { kind: 'directory' }); + } + } + shouldWriteBarrel(e, r, t) { + if (e.size > 0) return !0; + if ('updateExisting' === r.mode) return t; + if (!r.recursive) throw new Error('No TypeScript files found in the selected directory'); + return t; + } + normalizeOptions(e) { + return { recursive: e?.recursive ?? !1, mode: e?.mode ?? 'createOrUpdate' }; + } + } + function p(e) { + console.log('Barrel Roll extension is now active'); + const r = new f(), + t = [ + { + id: 'barrel-roll.generateBarrel', + options: { recursive: !1, mode: 'createOrUpdate' }, + progressTitle: 'Barrel Roll: Generating barrel...', + successMessage: 'Barrel Roll: barrel file generated successfully.', + }, + { + id: 'barrel-roll.generateBarrelRecursive', + options: { recursive: !0, mode: 'createOrUpdate' }, + progressTitle: 'Barrel Roll: Generating barrels recursively...', + successMessage: 'Barrel Roll: barrel files generated recursively.', + }, + { + id: 'barrel-roll.updateBarrel', + options: { recursive: !0, mode: 'updateExisting' }, + progressTitle: 'Barrel Roll: Updating barrels...', + successMessage: 'Barrel Roll: barrel files sanitized successfully.', + }, + ]; + for (const i of t) { + const t = y(r, i); + e.subscriptions.push(t); + } + } + function h() {} + function y(e, r) { + return i.commands.registerCommand(r.id, async (s) => { + try { + const n = await (async function (e) { + const r = + e ?? + (await (async function () { + const e = await i.window.showOpenDialog({ + canSelectFiles: !1, + canSelectFolders: !0, + canSelectMany: !1, + openLabel: 'Select folder to barrel', + }); + if (e && 0 !== e.length) return e[0]; + })()); + if (r) + return (async function (e) { + try { + const r = await i.workspace.fs.stat(e); + if (r.type === i.FileType.Directory) return e; + if (r.type === i.FileType.File) return i.Uri.file(t.dirname(e.fsPath)); + } catch (e) { + const r = e instanceof Error ? e.message : String(e); + throw new Error(`Unable to access selected resource: ${r}`); + } + return e; + })(r); + })(s); + if (!n) return; + (await (async function (t) { + return i.window.withProgress( + { location: i.ProgressLocation.Window, title: t }, + async () => { + await e.generateBarrelFile(n, r.options); + }, + ); + })(r.progressTitle), + i.window.showInformationMessage(r.successMessage)); + } catch (e) { + const r = e instanceof Error ? e.message : String(e); + i.window.showErrorMessage(`Barrel Roll: ${r}`); + } + }); + } + module.exports = r; +})(); +//# sourceMappingURL=extension.js.map diff --git a/dist/extension.js.map b/dist/extension.js.map new file mode 100644 index 0000000..d88e63f --- /dev/null +++ b/dist/extension.js.map @@ -0,0 +1 @@ +{"version":3,"file":"extension.js","mappings":"mBACA,IAAIA,EAAsB,CCA1BA,EAAwB,CAACC,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXF,EAAoBI,EAAEF,EAAYC,KAASH,EAAoBI,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,MCJ3EH,EAAwB,CAACS,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFV,EAAyBC,IACH,oBAAXa,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeL,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeL,EAAS,aAAc,CAAEe,OAAO,M,qDCLvD,MAAM,EAA+BC,QAAQ,QCAvC,EAA+BA,QAAQ,UCAvCC,EAAkB,UAElBC,EAAmB,KAClB,MAAMC,EACT,YAAAC,CAAaC,EAASC,GAClB,MAAMC,EAAQ,GACRC,EAAoBC,KAAKC,iBAAiBL,GAC1CM,EAAcC,MAAMC,KAAKL,EAAkBM,QAAQC,OACzD,IAAK,MAAMC,KAAgBL,EAAa,CACpC,MAAMM,EAAQT,EAAkBjB,IAAIyB,GACpC,IAAKC,EACD,SAEJ,MAAMC,EAAcT,KAAKU,oBAAoBH,EAAcC,GACvDC,EAAYE,OAAS,GACrBb,EAAMc,QAAQH,EAEtB,CACA,OAAOX,EAAMe,KAjBL,UAkBZ,CACA,gBAAAZ,CAAiBL,GACb,MAAMkB,EAAa,IAAIC,IACvB,IAAK,MAAOR,EAAcC,KAAUZ,EAC5BO,MAAMa,QAAQR,GACdM,EAAWG,IAAIV,EAAc,CAAEW,KAAM,OAAQ3C,QAASiC,IAGtDM,EAAWG,IAAIV,EAAcC,GAGrC,OAAOM,CACX,CACA,mBAAAJ,CAAoBH,EAAcC,GAC9B,MAAmB,cAAfA,EAAMU,KACClB,KAAKmB,0BAA0BZ,GAEnCP,KAAKoB,qBAAqBb,EAAcC,EAAMjC,QACzD,CACA,yBAAA4C,CAA0BZ,GACtB,MAAMc,EAAarB,KAAKsB,cAAcf,GACtC,OAAIc,EAAWE,WAAW9B,GACf,GAEJ,CAAC,oBAAoB4B,MAChC,CACA,oBAAAD,CAAqBI,EAAUjD,GAC3B,MAAMkD,EAAiBlD,EAAQmD,OAAQC,IAASA,EAAIC,SAASnC,IAC7D,GAA8B,IAA1BgC,EAAed,OACf,MAAO,GAEX,MAAMU,EAAarB,KAAKsB,cAAcE,GACtC,OAAIH,EAAWE,WAAW9B,GACf,GAEJO,KAAK6B,yBAAyBR,EAAYI,EACrD,CACA,wBAAAI,CAAyBR,EAAY9C,GACjC,MAAMuD,EAAmBvD,EAAQqD,SAASpC,GACpCuC,EAAkBxD,EAAQyD,KAAML,GAAQA,IAAQnC,GACtD,GAAIsC,IAAqBC,EACrB,MAAO,CAAC,8BAA8BV,OAE1C,MAAMvB,EAAQ,GACd,GAAIiC,EAAiB,CACjB,MAAME,EAAe1D,EAAQmD,OAAQC,GAAQA,IAAQnC,GACrDM,EAAMc,KAAK,YAAYqB,EAAapB,KAAK,mBAAmBQ,MAChE,CAIA,OAHIS,GACAhC,EAAMc,KAAK,8BAA8BS,OAEtCvB,CACX,CACA,aAAAwB,CAAcE,GACV,IAAIH,EAAaG,EAASU,QAAQ,UAAW,IAE7C,OADAb,EAAaA,EAAWa,QAAQ,MAAO,KAChCb,CACX,EC5EG,MAAMc,EACT,cAAAC,CAAeC,GACX,MAAM9D,EAAU,GACV+D,EAAyBtC,KAAKuC,eAAeF,GAC7CG,EAAqB,8GAC3B,IAAIC,EACJ,KAAqE,QAA7DA,EAAQD,EAAmBE,KAAKJ,KACpC/D,EAAQqC,KAAK6B,EAAM,IAEvB,MAAME,EAAoB,wBAC1B,KAAoE,QAA5DF,EAAQE,EAAkBD,KAAKJ,KAAmC,CACtE,MAAMM,EAAQH,EAAM,GACfI,MAAM,KACNC,IAAKC,GAASA,EACdC,OACAH,MAAM,aACNC,IAAKG,GAAYA,EAAQD,QACzBtB,OAAQuB,GAAYA,EAAQtC,OAAS,GACrCuC,OAAS,IACTxB,OAAQqB,GAASA,EAAKpC,OAAS,GACpCpC,EAAQqC,QAAQgC,EACpB,CAIA,MAHI,sBAAsBO,KAAKb,IAC3B/D,EAAQqC,KAAK,WAEV,IAAI,IAAIwC,IAAI7E,GACvB,CACA,cAAAgE,CAAeF,GACX,IAAIgB,EAAShB,EAAQH,QAAQ,oBAAqB,IAElD,OADAmB,EAASA,EAAOnB,QAAQ,YAAa,IAC9BmB,CACX,EC/BJ,MAAM,EAA+B9D,QAAQ,eCGvC+D,EAAsB,IAAIF,IAAI,CAAC,eAAgB,SAC9C,MAAMG,EACT,wBAAMC,CAAmBC,GAErB,aADsBzD,KAAK0D,cAAcD,IAEpC/B,OAAQlB,GAAUR,KAAK2D,iBAAiBnD,IACxCsC,IAAKtC,GAAU,OAAUiD,EAAejD,EAAMuC,MACvD,CACA,uBAAMa,CAAkBH,GAEpB,aADsBzD,KAAK0D,cAAcD,IAEpC/B,OAAQlB,GAAUR,KAAK6D,uBAAuBrD,IAC9CsC,IAAKtC,GAAU,OAAUiD,EAAejD,EAAMuC,MACvD,CACA,gBAAAY,CAAiBnD,GACb,IAAKA,EAAMsD,SACP,OAAO,EAEX,MAAMC,EAnBU,aAmBIvD,EAAMuC,KACpBiB,EAAmBxD,EAAMuC,KAAKkB,SAAS,SAE7C,OADiBzD,EAAMuC,KAAKkB,SAAS,QAAUzD,EAAMuC,KAAKkB,SAAS,WAC/CF,IAAgBC,CACxC,CACA,sBAAAH,CAAuBrD,GACnB,OAAQA,EAAM0D,gBAAkBZ,EAAoBa,IAAI3D,EAAMuC,QAAUvC,EAAMuC,KAAKxB,WAAW,IAClG,CACA,cAAM6C,CAAS5C,GACX,IACI,aAAa,WAAYA,EAAU,QACvC,CACA,MAAO6C,GACH,MAAM,IAAIC,MAAM,uBAAuB9C,MAAa6C,aAAiBC,MAAQD,EAAME,QAAUC,OAAOH,KACxG,CACJ,CACA,eAAMI,CAAUjD,EAAUa,GACtB,UACU,YAAab,EAAUa,EAAS,QAC1C,CACA,MAAOgC,GACH,MAAM,IAAIC,MAAM,wBAAwB9C,MAAa6C,aAAiBC,MAAQD,EAAME,QAAUC,OAAOH,KACzG,CACJ,CACA,gBAAMK,CAAWlD,GACb,IAEI,aADM,SAAUA,IACT,CACX,CACA,MACI,OAAO,CACX,CACJ,CACA,mBAAMkC,CAAcD,GAChB,IACI,aAAa,UAAWA,EAAe,CAAEkB,eAAe,GAC5D,CACA,MAAON,GACH,MAAM,IAAIC,MAAM,6BAA6BD,aAAiBC,MAAQD,EAAME,QAAUC,OAAOH,KACjG,CACJ,ECzDJ,MAAM,EAAkB,WACjB,MAAMO,EACTC,kBACAC,aACAC,qBACA,WAAAC,CAAYH,EAAmBC,EAAcC,GACzC/E,KAAK6E,kBAAoBA,GAAqB,IAAItB,EAClDvD,KAAK8E,aAAeA,GAAgB,IAAI3C,EACxCnC,KAAK+E,qBAAuBA,GAAwB,IAAIrF,CAC5D,CACA,wBAAMuF,CAAmBC,EAAcC,GACnC,MAAMC,EAAoBpF,KAAKqF,iBAAiBF,SAC1CnF,KAAKsF,2BAA2BJ,EAAaK,OAAQH,EAC/D,CACA,gCAAME,CAA2B7B,EAAe0B,GAC5C,MAAMK,EAAiB,OAAU/B,EAAe,IAC1C,QAAEgC,EAAO,eAAEC,SAAyB1F,KAAK2F,kBAAkBlC,GAC7D0B,EAAQS,iBACF5F,KAAK6F,wBAAwBH,EAAgBP,GAEvD,MAAMvF,QAAgBI,KAAK8F,eAAerC,EAAegC,EAASC,GAC5DK,QAAyB/F,KAAK6E,kBAAkBH,WAAWc,GACjE,IAAKxF,KAAKgG,kBAAkBpG,EAASuF,EAASY,GAC1C,OAEJ,MAAME,EAAgBjG,KAAK+E,qBAAqBpF,aAAaC,EAAS6D,SAChEzD,KAAK6E,kBAAkBJ,UAAUe,EAAgBS,EAC3D,CACA,uBAAMN,CAAkBlC,GACpB,MAAOgC,EAASC,SAAwBQ,QAAQC,IAAI,CAChDnG,KAAK6E,kBAAkBrB,mBAAmBC,GAC1CzD,KAAK6E,kBAAkBjB,kBAAkBH,KAE7C,MAAO,CAAEgC,UAASC,iBACtB,CACA,6BAAMG,CAAwBH,EAAgBP,GAC1C,IAAK,MAAMiB,KAAoBV,GACN,mBAAjBP,EAAQkB,YACArG,KAAK6E,kBAAkBH,WAAW,OAAU0B,EAAkB,YAGpEpG,KAAKsF,2BAA2Bc,EAAkBjB,EAEhE,CACA,oBAAMW,CAAerC,EAAegC,EAASC,GACzC,MAAM9F,EAAU,IAAImB,IAGpB,aAFMf,KAAKsG,eAAe7C,EAAegC,EAAS7F,SAC5CI,KAAKuG,uBAAuB9C,EAAeiC,EAAgB9F,GAC1DA,CACX,CACA,oBAAM0G,CAAe7C,EAAegC,EAAS7F,GACzC,IAAK,MAAM4B,KAAYiE,EAAS,CAC5B,MAAMpD,QAAgBrC,KAAK6E,kBAAkBT,SAAS5C,GAChDjD,EAAUyB,KAAK8E,aAAa1C,eAAeC,GACjD,GAAuB,IAAnB9D,EAAQoC,OACR,SAEJ,MAAMJ,EAAe,WAAckD,EAAejC,GAClD5B,EAAQqB,IAAIV,EAAc,CAAEW,KAAM,OAAQ3C,WAC9C,CACJ,CACA,4BAAMgI,CAAuB9C,EAAeiC,EAAgB9F,GACxD,IAAK,MAAMwG,KAAoBV,EAAgB,CAC3C,MAAMc,EAAa,OAAUJ,EAAkB,GAC/C,UAAYpG,KAAK6E,kBAAkBH,WAAW8B,GAC1C,SAEJ,MAAMjG,EAAe,WAAckD,EAAe2C,GAClDxG,EAAQqB,IAAIV,EAAc,CAAEW,KAAM,aACtC,CACJ,CACA,iBAAA8E,CAAkBpG,EAASuF,EAASY,GAChC,GAAInG,EAAQ6G,KAAO,EACf,OAAO,EAEX,GAAqB,mBAAjBtB,EAAQkB,KACR,OAAON,EAEX,IAAKZ,EAAQS,UACT,MAAM,IAAItB,MAAM,uDAEpB,OAAOyB,CACX,CACA,gBAAAV,CAAiBF,GACb,MAAO,CACHS,UAAWT,GAASS,YAAa,EACjCS,KAAMlB,GAASkB,MAAQ,iBAE/B,ECzFG,SAASK,EAASC,GACrBC,QAAQC,IAAI,uCACZ,MAAMC,EAAY,IAAIlC,EAChBmC,EAAc,CAChB,CACIC,GAAI,6BACJ7B,QAAS,CAAES,WAAW,EAAOS,KAAM,kBACnCY,cAAe,oCACfC,eAAgB,oDAEpB,CACIF,GAAI,sCACJ7B,QAAS,CAAES,WAAW,EAAMS,KAAM,kBAClCY,cAAe,iDACfC,eAAgB,oDAEpB,CACIF,GAAI,2BACJ7B,QAAS,CAAES,WAAW,EAAMS,KAAM,kBAClCY,cAAe,mCACfC,eAAgB,sDAGxB,IAAK,MAAMC,KAAcJ,EAAa,CAClC,MAAMK,EAAaC,EAAsBP,EAAWK,GACpDR,EAAQW,cAAc1G,KAAKwG,EAC/B,CACJ,CACO,SAASG,IAAe,CAC/B,SAASF,EAAsBP,EAAWK,GACtC,OAAO,WAAgBK,gBAAgBL,EAAWH,GAAIS,MAAOC,IACzD,IACI,MAAMC,QAelBF,eAAsCC,GAClC,MAAME,EAAUF,SAMpBD,iBACI,MAAMI,QAAiB,SAAcC,eAAe,CAChDC,gBAAgB,EAChBC,kBAAkB,EAClBC,eAAe,EACfC,UAAW,4BAEf,GAAKL,GAAgC,IAApBA,EAASlH,OAG1B,OAAOkH,EAAS,EACpB,CAjBkCM,GAC9B,GAAKP,EAGL,OAcJH,eAAkCC,GAC9B,IACI,MAAMU,QAAa,YAAiBC,GAAGD,KAAKV,GAC5C,GAAIU,EAAKE,OAAS,WAAgBC,UAC9B,OAAOb,EAEX,GAAIU,EAAKE,OAAS,WAAgBE,KAC9B,OAAO,MAAWC,KAAK,UAAaf,EAAInC,QAEhD,CACA,MAAOlB,GACH,MAAME,EAAUF,aAAiBC,MAAQD,EAAME,QAAUC,OAAOH,GAChE,MAAM,IAAIC,MAAM,uCAAuCC,IAC3D,CACA,OAAOmD,CACX,CA7BWgB,CAAmBd,EAC9B,CArB0Ce,CAAuBjB,GACrD,IAAKC,EACD,aAgDhBF,eAA4BmB,GACxB,OAAO,SAAcC,aAAa,CAC9BC,SAAU,mBAAwBC,OAClCH,SAjDiDnB,gBACnCX,EAAU7B,mBAAmB0C,EAAiBR,EAAWhC,UAkD/E,CAnDkB0D,CAAa1B,EAAWF,eAG9B,SAAc+B,uBAAuB7B,EAAWD,eACpD,CACA,MAAO7C,GACH,MAAME,EAAUF,aAAiBC,MAAQD,EAAME,QAAUC,OAAOH,GAChE,SAAc4E,iBAAiB,gBAAgB1E,IACnD,GAER,C","sources":["../webpack/bootstrap","../webpack/runtime/define property getters","../webpack/runtime/hasOwnProperty shorthand","../webpack/runtime/make namespace object","../external node-commonjs \"path\"","../external commonjs \"vscode\"",".././src/core/services/barrel-content.builder.ts",".././src/core/services/export.parser.ts","../external node-commonjs \"fs/promises\"",".././src/core/services/file-system.service.ts",".././src/core/services/barrel-file.generator.ts",".././src/extension.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"path\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"vscode\");","const DEFAULT_KEYWORD = 'default';\nconst NEWLINE = '\\n';\nconst PARENT_DIRECTORY = '..';\nexport class BarrelContentBuilder {\n buildContent(entries, _directoryPath) {\n const lines = [];\n const normalizedEntries = this.normalizeEntries(entries);\n const sortedPaths = Array.from(normalizedEntries.keys()).sort();\n for (const relativePath of sortedPaths) {\n const entry = normalizedEntries.get(relativePath);\n if (!entry) {\n continue;\n }\n const exportLines = this.createLinesForEntry(relativePath, entry);\n if (exportLines.length > 0) {\n lines.push(...exportLines);\n }\n }\n return lines.join(NEWLINE) + NEWLINE;\n }\n normalizeEntries(entries) {\n const normalized = new Map();\n for (const [relativePath, entry] of entries) {\n if (Array.isArray(entry)) {\n normalized.set(relativePath, { kind: 'file', exports: entry });\n }\n else {\n normalized.set(relativePath, entry);\n }\n }\n return normalized;\n }\n createLinesForEntry(relativePath, entry) {\n if (entry.kind === 'directory') {\n return this.buildDirectoryExportLines(relativePath);\n }\n return this.buildFileExportLines(relativePath, entry.exports);\n }\n buildDirectoryExportLines(relativePath) {\n const modulePath = this.getModulePath(relativePath);\n if (modulePath.startsWith(PARENT_DIRECTORY)) {\n return [];\n }\n return [`export * from './${modulePath}';`];\n }\n buildFileExportLines(filePath, exports) {\n const cleanedExports = exports.filter((exp) => !exp.includes(PARENT_DIRECTORY));\n if (cleanedExports.length === 0) {\n return [];\n }\n const modulePath = this.getModulePath(filePath);\n if (modulePath.startsWith(PARENT_DIRECTORY)) {\n return [];\n }\n return this.generateExportStatements(modulePath, cleanedExports);\n }\n generateExportStatements(modulePath, exports) {\n const hasDefaultExport = exports.includes(DEFAULT_KEYWORD);\n const hasNamedExports = exports.some((exp) => exp !== DEFAULT_KEYWORD);\n if (hasDefaultExport && !hasNamedExports) {\n return [`export { default } from './${modulePath}';`];\n }\n const lines = [];\n if (hasNamedExports) {\n const namedExports = exports.filter((exp) => exp !== DEFAULT_KEYWORD);\n lines.push(`export { ${namedExports.join(', ')} } from './${modulePath}';`);\n }\n if (hasDefaultExport) {\n lines.push(`export { default } from './${modulePath}';`);\n }\n return lines;\n }\n getModulePath(filePath) {\n let modulePath = filePath.replace(/\\.tsx?$/, '');\n modulePath = modulePath.replace(/\\\\/g, '/');\n return modulePath;\n }\n}\n","export class ExportParser {\n extractExports(content) {\n const exports = [];\n const contentWithoutComments = this.removeComments(content);\n const namedExportPattern = /export\\s+(?:abstract\\s+)?(?:class|interface|type|function|const|enum|let|var)\\s+([A-Za-z_$][A-Za-z0-9_$]*)/g;\n let match;\n while ((match = namedExportPattern.exec(contentWithoutComments)) !== null) {\n exports.push(match[1]);\n }\n const exportListPattern = /export\\s*\\{([^}]+)\\}/g;\n while ((match = exportListPattern.exec(contentWithoutComments)) !== null) {\n const names = match[1]\n .split(',')\n .map((name) => name\n .trim()\n .split(/\\s+as\\s+/i)\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0)\n .pop() ?? '')\n .filter((name) => name.length > 0);\n exports.push(...names);\n }\n if (/export\\s+default\\s+/.test(contentWithoutComments)) {\n exports.push('default');\n }\n return [...new Set(exports)];\n }\n removeComments(content) {\n let result = content.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n result = result.replace(/\\/\\/.*$/gm, '');\n return result;\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"fs/promises\");","import * as fs from 'fs/promises';\nimport * as path from 'path';\nconst INDEX_FILE_NAME = 'index.ts';\nconst IGNORED_DIRECTORIES = new Set(['node_modules', '.git']);\nexport class FileSystemService {\n async getTypeScriptFiles(directoryPath) {\n const entries = await this.readDirectory(directoryPath);\n return entries\n .filter((entry) => this.isTypeScriptFile(entry))\n .map((entry) => path.join(directoryPath, entry.name));\n }\n async getSubdirectories(directoryPath) {\n const entries = await this.readDirectory(directoryPath);\n return entries\n .filter((entry) => this.isTraversableDirectory(entry))\n .map((entry) => path.join(directoryPath, entry.name));\n }\n isTypeScriptFile(entry) {\n if (!entry.isFile()) {\n return false;\n }\n const isIndexFile = entry.name === INDEX_FILE_NAME;\n const isDefinitionFile = entry.name.endsWith('.d.ts');\n const isTsFile = entry.name.endsWith('.ts') || entry.name.endsWith('.tsx');\n return isTsFile && !isIndexFile && !isDefinitionFile;\n }\n isTraversableDirectory(entry) {\n return (entry.isDirectory() && !IGNORED_DIRECTORIES.has(entry.name) && !entry.name.startsWith('.'));\n }\n async readFile(filePath) {\n try {\n return await fs.readFile(filePath, 'utf-8');\n }\n catch (error) {\n throw new Error(`Failed to read file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n async writeFile(filePath, content) {\n try {\n await fs.writeFile(filePath, content, 'utf-8');\n }\n catch (error) {\n throw new Error(`Failed to write file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n async fileExists(filePath) {\n try {\n await fs.access(filePath);\n return true;\n }\n catch {\n return false;\n }\n }\n async readDirectory(directoryPath) {\n try {\n return await fs.readdir(directoryPath, { withFileTypes: true });\n }\n catch (error) {\n throw new Error(`Failed to read directory: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n","import * as path from 'path';\nimport { BarrelContentBuilder } from './barrel-content.builder';\nimport { ExportParser } from './export.parser';\nimport { FileSystemService } from './file-system.service';\nconst INDEX_FILE_NAME = 'index.ts';\nexport class BarrelFileGenerator {\n fileSystemService;\n exportParser;\n barrelContentBuilder;\n constructor(fileSystemService, exportParser, barrelContentBuilder) {\n this.fileSystemService = fileSystemService || new FileSystemService();\n this.exportParser = exportParser || new ExportParser();\n this.barrelContentBuilder = barrelContentBuilder || new BarrelContentBuilder();\n }\n async generateBarrelFile(directoryUri, options) {\n const normalizedOptions = this.normalizeOptions(options);\n await this.generateBarrelFileFromPath(directoryUri.fsPath, normalizedOptions);\n }\n async generateBarrelFileFromPath(directoryPath, options) {\n const barrelFilePath = path.join(directoryPath, INDEX_FILE_NAME);\n const { tsFiles, subdirectories } = await this.readDirectoryInfo(directoryPath);\n if (options.recursive) {\n await this.processChildDirectories(subdirectories, options);\n }\n const entries = await this.collectEntries(directoryPath, tsFiles, subdirectories);\n const hasExistingIndex = await this.fileSystemService.fileExists(barrelFilePath);\n if (!this.shouldWriteBarrel(entries, options, hasExistingIndex)) {\n return;\n }\n const barrelContent = this.barrelContentBuilder.buildContent(entries, directoryPath);\n await this.fileSystemService.writeFile(barrelFilePath, barrelContent);\n }\n async readDirectoryInfo(directoryPath) {\n const [tsFiles, subdirectories] = await Promise.all([\n this.fileSystemService.getTypeScriptFiles(directoryPath),\n this.fileSystemService.getSubdirectories(directoryPath),\n ]);\n return { tsFiles, subdirectories };\n }\n async processChildDirectories(subdirectories, options) {\n for (const subdirectoryPath of subdirectories) {\n if (options.mode === 'updateExisting' &&\n !(await this.fileSystemService.fileExists(path.join(subdirectoryPath, INDEX_FILE_NAME)))) {\n continue;\n }\n await this.generateBarrelFileFromPath(subdirectoryPath, options);\n }\n }\n async collectEntries(directoryPath, tsFiles, subdirectories) {\n const entries = new Map();\n await this.addFileEntries(directoryPath, tsFiles, entries);\n await this.addSubdirectoryEntries(directoryPath, subdirectories, entries);\n return entries;\n }\n async addFileEntries(directoryPath, tsFiles, entries) {\n for (const filePath of tsFiles) {\n const content = await this.fileSystemService.readFile(filePath);\n const exports = this.exportParser.extractExports(content);\n if (exports.length === 0) {\n continue;\n }\n const relativePath = path.relative(directoryPath, filePath);\n entries.set(relativePath, { kind: 'file', exports });\n }\n }\n async addSubdirectoryEntries(directoryPath, subdirectories, entries) {\n for (const subdirectoryPath of subdirectories) {\n const barrelPath = path.join(subdirectoryPath, INDEX_FILE_NAME);\n if (!(await this.fileSystemService.fileExists(barrelPath))) {\n continue;\n }\n const relativePath = path.relative(directoryPath, subdirectoryPath);\n entries.set(relativePath, { kind: 'directory' });\n }\n }\n shouldWriteBarrel(entries, options, hasExistingIndex) {\n if (entries.size > 0) {\n return true;\n }\n if (options.mode === 'updateExisting') {\n return hasExistingIndex;\n }\n if (!options.recursive) {\n throw new Error('No TypeScript files found in the selected directory');\n }\n return hasExistingIndex;\n }\n normalizeOptions(options) {\n return {\n recursive: options?.recursive ?? false,\n mode: options?.mode ?? 'createOrUpdate',\n };\n }\n}\n","import * as path from 'path';\nimport * as vscode from 'vscode';\nimport { BarrelFileGenerator, } from './core/services/barrel-file.generator';\nexport function activate(context) {\n console.log('Barrel Roll extension is now active');\n const generator = new BarrelFileGenerator();\n const descriptors = [\n {\n id: 'barrel-roll.generateBarrel',\n options: { recursive: false, mode: 'createOrUpdate' },\n progressTitle: 'Barrel Roll: Generating barrel...',\n successMessage: 'Barrel Roll: barrel file generated successfully.',\n },\n {\n id: 'barrel-roll.generateBarrelRecursive',\n options: { recursive: true, mode: 'createOrUpdate' },\n progressTitle: 'Barrel Roll: Generating barrels recursively...',\n successMessage: 'Barrel Roll: barrel files generated recursively.',\n },\n {\n id: 'barrel-roll.updateBarrel',\n options: { recursive: true, mode: 'updateExisting' },\n progressTitle: 'Barrel Roll: Updating barrels...',\n successMessage: 'Barrel Roll: barrel files sanitized successfully.',\n },\n ];\n for (const descriptor of descriptors) {\n const disposable = registerBarrelCommand(generator, descriptor);\n context.subscriptions.push(disposable);\n }\n}\nexport function deactivate() { }\nfunction registerBarrelCommand(generator, descriptor) {\n return vscode.commands.registerCommand(descriptor.id, async (uri) => {\n try {\n const targetDirectory = await resolveTargetDirectory(uri);\n if (!targetDirectory) {\n return;\n }\n await withProgress(descriptor.progressTitle, async () => {\n await generator.generateBarrelFile(targetDirectory, descriptor.options);\n });\n vscode.window.showInformationMessage(descriptor.successMessage);\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n vscode.window.showErrorMessage(`Barrel Roll: ${message}`);\n }\n });\n}\nasync function resolveTargetDirectory(uri) {\n const initial = uri ?? (await promptForDirectory());\n if (!initial) {\n return undefined;\n }\n return ensureDirectoryUri(initial);\n}\nasync function promptForDirectory() {\n const selected = await vscode.window.showOpenDialog({\n canSelectFiles: false,\n canSelectFolders: true,\n canSelectMany: false,\n openLabel: 'Select folder to barrel',\n });\n if (!selected || selected.length === 0) {\n return undefined;\n }\n return selected[0];\n}\nasync function ensureDirectoryUri(uri) {\n try {\n const stat = await vscode.workspace.fs.stat(uri);\n if (stat.type === vscode.FileType.Directory) {\n return uri;\n }\n if (stat.type === vscode.FileType.File) {\n return vscode.Uri.file(path.dirname(uri.fsPath));\n }\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Unable to access selected resource: ${message}`);\n }\n return uri;\n}\nasync function withProgress(title, task) {\n return vscode.window.withProgress({\n location: vscode.ProgressLocation.Window,\n title,\n }, task);\n}\n"],"names":["__webpack_require__","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","require","DEFAULT_KEYWORD","PARENT_DIRECTORY","BarrelContentBuilder","buildContent","entries","_directoryPath","lines","normalizedEntries","this","normalizeEntries","sortedPaths","Array","from","keys","sort","relativePath","entry","exportLines","createLinesForEntry","length","push","join","normalized","Map","isArray","set","kind","buildDirectoryExportLines","buildFileExportLines","modulePath","getModulePath","startsWith","filePath","cleanedExports","filter","exp","includes","generateExportStatements","hasDefaultExport","hasNamedExports","some","namedExports","replace","ExportParser","extractExports","content","contentWithoutComments","removeComments","namedExportPattern","match","exec","exportListPattern","names","split","map","name","trim","segment","pop","test","Set","result","IGNORED_DIRECTORIES","FileSystemService","getTypeScriptFiles","directoryPath","readDirectory","isTypeScriptFile","getSubdirectories","isTraversableDirectory","isFile","isIndexFile","isDefinitionFile","endsWith","isDirectory","has","readFile","error","Error","message","String","writeFile","fileExists","withFileTypes","BarrelFileGenerator","fileSystemService","exportParser","barrelContentBuilder","constructor","generateBarrelFile","directoryUri","options","normalizedOptions","normalizeOptions","generateBarrelFileFromPath","fsPath","barrelFilePath","tsFiles","subdirectories","readDirectoryInfo","recursive","processChildDirectories","collectEntries","hasExistingIndex","shouldWriteBarrel","barrelContent","Promise","all","subdirectoryPath","mode","addFileEntries","addSubdirectoryEntries","barrelPath","size","activate","context","console","log","generator","descriptors","id","progressTitle","successMessage","descriptor","disposable","registerBarrelCommand","subscriptions","deactivate","registerCommand","async","uri","targetDirectory","initial","selected","showOpenDialog","canSelectFiles","canSelectFolders","canSelectMany","openLabel","promptForDirectory","stat","fs","type","Directory","File","file","ensureDirectoryUri","resolveTargetDirectory","title","withProgress","location","Window","showInformationMessage","showErrorMessage"],"sourceRoot":""} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs index cd6e2e9..9755ec6 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -21,7 +21,6 @@ export default [ { ignores: [ '**/coverage/**', - '**/dist/**', '**/node_modules/**', '**/lib/**', '**/build/**', diff --git a/jest.config.cjs b/jest.config.cjs index 6a7eb3c..1473407 100644 --- a/jest.config.cjs +++ b/jest.config.cjs @@ -6,14 +6,7 @@ module.exports = { collectCoverage: true, collectCoverageFrom: ['./src/**'], coverageDirectory: './coverage', - coveragePathIgnorePatterns: [ - '__mocks__', - '/node_modules/', - '/dist/', - '/tests/', - '/out/', - '/.vscode-test/', - ], + coveragePathIgnorePatterns: ['__mocks__', '/node_modules/', '/tests/', '/out/', '/.vscode-test/'], coverageReporters: ['json-summary', 'text', 'lcov'], coverageThreshold: { global: { @@ -34,7 +27,7 @@ module.exports = { setupFilesAfterEnv: ['/src/__tests__/jest.setup.ts'], testEnvironment: 'node', testMatch: ['**/*.test.ts', '**/*.test.js'], - testPathIgnorePatterns: ['/dist/', '/node_modules/', '/__mocks__/', '/.vscode-test/'], + testPathIgnorePatterns: ['/out/', '/node_modules/', '/__mocks__/', '/.vscode-test/'], transform: { '^.+\\.ts$': [ 'ts-jest', diff --git a/package.json b/package.json index 1e263d3..dfd3d99 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,4 @@ { - "activationEvents": [ - "onCommand:barrel-roll.generateBarrel", - "onCommand:barrel-roll.generateBarrelRecursive", - "onCommand:barrel-roll.updateBarrel" - ], "author": { "name": "Coderrob" }, @@ -62,6 +57,9 @@ ] } }, + "dependencies": { + "pino": "^10.0.0" + }, "description": "Automatically export types, functions, constants, and classes through barrel files", "devDependencies": { "@jest/globals": "^29.7.0", @@ -117,7 +115,7 @@ "organization" ], "license": "Apache-2.0", - "main": "./dist/extension.js", + "main": "./out/extension.js", "name": "@coderrob/barrel-roll", "publisher": "coderrob", "repository": { @@ -126,7 +124,7 @@ }, "scripts": { "compile": "webpack", - "compile-tests": "tsc -p . --outDir out", + "compile-tests": "tsc -p tsconfig.emit-test.json", "coverage": "make-coverage-badge --output-path ./badges/coverage.svg", "duplication": "jscpd src", "format": "prettier --write \"src/**/*.ts\"", @@ -143,8 +141,6 @@ "watch": "webpack --watch", "watch-tests": "tsc -p . -w --outDir out" }, - "version": "0.0.1", - "dependencies": { - "pino": "^10.0.0" - } + "type": "module", + "version": "0.0.1" } diff --git a/rollup.config.js b/rollup.config.js index 1759573..f6805ae 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -45,7 +45,7 @@ const config = { warn(warning); }, output: { - file: 'dist/index.mjs', + file: 'out/index.mjs', format: 'es', esModule: true, sourcemap: false, diff --git a/src/test/runTest.ts b/src/test/runTest.ts index 2f364eb..d4869eb 100644 --- a/src/test/runTest.ts +++ b/src/test/runTest.ts @@ -5,10 +5,10 @@ import { runTests } from '@vscode/test-electron'; async function main(): Promise { try { - if (process.platform.startsWith('win')) { - console.warn( - 'VS Code integration tests are temporarily skipped on Windows because the Code executable rejects required CLI flags.', - ); + const shouldSkipTests = shouldSkipVscodeTests(); + + if (shouldSkipTests) { + console.log('Skipping VS Code integration tests in headless/CI/Windows environment'); return; } @@ -23,19 +23,28 @@ async function main(): Promise { // Passed to --extensionTestsPath const extensionTestsPath = path.resolve( path.dirname(fileURLToPath(import.meta.url)), - './suite/index', + './suite/index.js', ); // Download VS Code, unzip it and run the integration test const options: Parameters[0] = { extensionDevelopmentPath, extensionTestsPath, + launchArgs: [ + '--no-sandbox', + '--disable-gpu', + '--disable-dev-shm-usage', + '--disable-software-rasterizer', + '--disable-background-timer-throttling', + '--disable-renderer-backgrounding', + '--disable-features=TranslateUI', + '--disable-ipc-flooding-protection', + '--disable-extensions-except', + extensionDevelopmentPath, + '--disable-extensions', + ], }; - if (process.platform === 'win32') { - options.launchArgs = []; - } - await runTests(options); } catch (error) { console.error('Failed to run tests:', error); @@ -43,4 +52,12 @@ async function main(): Promise { } } +function shouldSkipVscodeTests(): boolean { + return ( + Boolean(process.env.CI) || !process.stdout.isTTY || process.platform === 'linux' + // Temporarily allow on Windows to test + // || process.platform.startsWith('win') + ); +} + main(); diff --git a/src/test/suite/barrel-content.builder.test.ts b/src/test/suite/barrel-content.builder.test.ts index ba4eee1..5ae8224 100644 --- a/src/test/suite/barrel-content.builder.test.ts +++ b/src/test/suite/barrel-content.builder.test.ts @@ -1,6 +1,6 @@ import * as assert from 'assert'; -import { BarrelContentBuilder } from '../../core/services/barrel-content.builder'; +import { BarrelContentBuilder } from '../../core/services/barrel-content.builder.js'; suite('BarrelContentBuilder Test Suite', () => { let builder: BarrelContentBuilder; diff --git a/src/test/suite/barrel-file.generator.test.ts b/src/test/suite/barrel-file.generator.test.ts index 1862a99..433139b 100644 --- a/src/test/suite/barrel-file.generator.test.ts +++ b/src/test/suite/barrel-file.generator.test.ts @@ -5,7 +5,7 @@ import * as path from 'path'; import * as vscode from 'vscode'; -import { BarrelFileGenerator } from '../../core/services/barrel-file.generator'; +import { BarrelFileGenerator } from '../../core/services/barrel-file.generator.js'; suite('BarrelFileGenerator Test Suite', () => { let testDir: string; diff --git a/src/test/suite/export.parser.test.ts b/src/test/suite/export.parser.test.ts index 7c88c3e..4275686 100644 --- a/src/test/suite/export.parser.test.ts +++ b/src/test/suite/export.parser.test.ts @@ -1,6 +1,6 @@ import * as assert from 'assert'; -import { ExportParser } from '../../core/services/export.parser'; +import { ExportParser } from '../../core/services/export.parser.js'; suite('ExportParser Test Suite', () => { let parser: ExportParser; diff --git a/src/test/suite/index.ts b/src/test/suite/index.ts index 5f5a755..c0d3843 100644 --- a/src/test/suite/index.ts +++ b/src/test/suite/index.ts @@ -13,24 +13,24 @@ export async function run(): Promise { const testsRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); + console.log('Test runner starting...'); + console.log('Tests root:', testsRoot); + const files = await glob('**/**.test.js', { cwd: testsRoot }); + console.log('Found test files:', files); + // Add files to the test suite files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); - return new Promise((resolve, reject) => { - try { - // Run the mocha test - mocha.run((failures) => { - if (failures > 0) { - reject(new Error(`${failures} tests failed.`)); - } else { - resolve(); - } - }); - } catch (err) { - console.error(err); - reject(err); - } + // Run the tests + return new Promise((resolve, reject) => { + mocha.run((failures) => { + if (failures > 0) { + reject(new Error(`${failures} tests failed.`)); + } else { + resolve(); + } + }); }); } diff --git a/tsconfig.emit-test.json b/tsconfig.emit-test.json new file mode 100644 index 0000000..29c89ea --- /dev/null +++ b/tsconfig.emit-test.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./tsconfig.json", + "compilerOptions": { + "allowJs": true, + "declaration": false, + "module": "ES2022", + "moduleResolution": "Node", + "noEmit": false, + "outDir": "./out", + "removeComments": false, + "sourceMap": false, + "target": "ES2022", + "types": ["node", "mocha"] + }, + "exclude": ["out", "node_modules", ".vscode-test", "src/__tests__"], + "include": ["src/**/*.test.ts", "src/**/__tests__/**/*"] +} diff --git a/tsconfig.json b/tsconfig.json index 0a7fd6a..87dbce7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,7 @@ "noImplicitAny": true, "noUnusedLocals": true, "noUnusedParameters": true, - "outDir": "./dist", + "outDir": "./out", "paths": { "@/*": ["src/*"] }, @@ -30,7 +30,6 @@ ".vscode-test", "tests", "__mocks__/**/*", - "dist", "node_modules", "out", "src/**/*.spec.ts", diff --git a/tsconfig.test-suite.json b/tsconfig.test-suite.json new file mode 100644 index 0000000..918266c --- /dev/null +++ b/tsconfig.test-suite.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "baseUrl": ".", + "declaration": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "lib": ["ES2022"], + "module": "ES2022", + "moduleResolution": "Node", + "noEmit": false, + "noImplicitAny": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "outDir": "./out/test", + "paths": { + "@/*": ["src/*"] + }, + "removeComments": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": false, + "strict": true, + "target": "ES2022", + "useUnknownInCatchVariables": true + }, + "include": ["src/test/suite/*.ts", "src/core/**/*", "src/types/**/*", "src/logging/**/*"] +} diff --git a/tsconfig.test.json b/tsconfig.test.json index 23a5a34..a3d545e 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -2,8 +2,6 @@ "$schema": "https://json.schemastore.org/tsconfig", "compilerOptions": { "allowJs": true, - "declaration": true, - "declarationMap": true, "module": "NodeNext", "moduleResolution": "NodeNext", "noEmit": true, @@ -11,7 +9,7 @@ "sourceMap": true, "target": "ES2022" }, - "exclude": ["dist", "node_modules"], + "exclude": ["out", "node_modules", ".vscode-test"], "extends": "./tsconfig.json", "include": [ "__mocks__", diff --git a/webpack.config.js b/webpack.config.cjs similarity index 93% rename from webpack.config.js rename to webpack.config.cjs index 4f14acb..5addf1e 100644 --- a/webpack.config.js +++ b/webpack.config.cjs @@ -9,7 +9,7 @@ const config = { target: 'node', entry: './src/extension.ts', output: { - path: path.resolve(__dirname, 'dist'), + path: path.resolve(__dirname, 'out'), filename: 'extension.js', libraryTarget: 'commonjs2', devtoolModuleFilenameTemplate: '../[resource-path]', From 083253f2f628cd5fb588d9b0e7754e4481a088d1 Mon Sep 17 00:00:00 2001 From: coderrob Date: Fri, 17 Oct 2025 10:25:15 -0500 Subject: [PATCH 03/20] fix(tests): correct log message for skipping VS Code integration tests on Linux --- src/test/runTest.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/test/runTest.ts b/src/test/runTest.ts index d4869eb..7262c20 100644 --- a/src/test/runTest.ts +++ b/src/test/runTest.ts @@ -8,7 +8,7 @@ async function main(): Promise { const shouldSkipTests = shouldSkipVscodeTests(); if (shouldSkipTests) { - console.log('Skipping VS Code integration tests in headless/CI/Windows environment'); + console.log('Skipping VS Code integration tests in headless/CI/Linux environment'); return; } @@ -53,11 +53,7 @@ async function main(): Promise { } function shouldSkipVscodeTests(): boolean { - return ( - Boolean(process.env.CI) || !process.stdout.isTTY || process.platform === 'linux' - // Temporarily allow on Windows to test - // || process.platform.startsWith('win') - ); + return Boolean(process.env.CI) || !process.stdout.isTTY || process.platform === 'linux'; } main(); From 250820a6fc8ca8bc3d05f1161ff7946283799cd7 Mon Sep 17 00:00:00 2001 From: coderrob Date: Fri, 17 Oct 2025 21:55:50 -0500 Subject: [PATCH 04/20] refactor: update test configurations and cleanup unused files --- .vscodeignore | 1 - eslint.config.mjs | 1 + jest.config.cjs | 9 ++++++++- package.json | 3 +-- src/test/runTest.ts | 11 ++++------- tsconfig.emit-test.json | 18 ------------------ tsconfig.test-suite.json | 30 +++++++----------------------- tsconfig.test.json | 16 ++++------------ 8 files changed, 25 insertions(+), 64 deletions(-) delete mode 100644 tsconfig.emit-test.json diff --git a/.vscodeignore b/.vscodeignore index ce4dd4f..51fb842 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -9,4 +9,3 @@ webpack.config.js **/*.map **/*.ts node_modules/** -out/** diff --git a/eslint.config.mjs b/eslint.config.mjs index 9755ec6..06f8062 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -29,6 +29,7 @@ export default [ '*.config.{js,mjs,cjs}', 'badges/**', 'script/**', + 'test-project/**', ], }, diff --git a/jest.config.cjs b/jest.config.cjs index 1473407..abd6eed 100644 --- a/jest.config.cjs +++ b/jest.config.cjs @@ -6,7 +6,14 @@ module.exports = { collectCoverage: true, collectCoverageFrom: ['./src/**'], coverageDirectory: './coverage', - coveragePathIgnorePatterns: ['__mocks__', '/node_modules/', '/tests/', '/out/', '/.vscode-test/'], + coveragePathIgnorePatterns: [ + '__mocks__', + '/node_modules/', + '/tests/', + '/out/', + '/.vscode-test/', + 'test', + ], coverageReporters: ['json-summary', 'text', 'lcov'], coverageThreshold: { global: { diff --git a/package.json b/package.json index dfd3d99..430f20f 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ }, "scripts": { "compile": "webpack", - "compile-tests": "tsc -p tsconfig.emit-test.json", + "compile-tests": "tsc -p tsconfig.test-suite.json", "coverage": "make-coverage-badge --output-path ./badges/coverage.svg", "duplication": "jscpd src", "format": "prettier --write \"src/**/*.ts\"", @@ -141,6 +141,5 @@ "watch": "webpack --watch", "watch-tests": "tsc -p . -w --outDir out" }, - "type": "module", "version": "0.0.1" } diff --git a/src/test/runTest.ts b/src/test/runTest.ts index 7262c20..8dc4804 100644 --- a/src/test/runTest.ts +++ b/src/test/runTest.ts @@ -1,3 +1,4 @@ +import * as os from 'os'; import * as path from 'path'; import { fileURLToPath } from 'url'; @@ -34,14 +35,10 @@ async function main(): Promise { '--no-sandbox', '--disable-gpu', '--disable-dev-shm-usage', - '--disable-software-rasterizer', - '--disable-background-timer-throttling', - '--disable-renderer-backgrounding', - '--disable-features=TranslateUI', - '--disable-ipc-flooding-protection', - '--disable-extensions-except', - extensionDevelopmentPath, '--disable-extensions', + '--disable-workspace-trust', + '--user-data-dir', + path.join(os.tmpdir(), 'vscode-test-user-data'), ], }; diff --git a/tsconfig.emit-test.json b/tsconfig.emit-test.json deleted file mode 100644 index 29c89ea..0000000 --- a/tsconfig.emit-test.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "extends": "./tsconfig.json", - "compilerOptions": { - "allowJs": true, - "declaration": false, - "module": "ES2022", - "moduleResolution": "Node", - "noEmit": false, - "outDir": "./out", - "removeComments": false, - "sourceMap": false, - "target": "ES2022", - "types": ["node", "mocha"] - }, - "exclude": ["out", "node_modules", ".vscode-test", "src/__tests__"], - "include": ["src/**/*.test.ts", "src/**/__tests__/**/*"] -} diff --git a/tsconfig.test-suite.json b/tsconfig.test-suite.json index 918266c..4defffb 100644 --- a/tsconfig.test-suite.json +++ b/tsconfig.test-suite.json @@ -1,30 +1,14 @@ { "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./tsconfig.json", "compilerOptions": { - "allowSyntheticDefaultImports": true, - "baseUrl": ".", - "declaration": false, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "isolatedModules": true, - "lib": ["ES2022"], - "module": "ES2022", - "moduleResolution": "Node", + "allowJs": true, "noEmit": false, - "noImplicitAny": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "outDir": "./out/test", - "paths": { - "@/*": ["src/*"] - }, - "removeComments": true, - "resolveJsonModule": true, - "skipLibCheck": true, + "outDir": "./out", + "removeComments": false, "sourceMap": false, - "strict": true, - "target": "ES2022", - "useUnknownInCatchVariables": true + "types": ["node", "mocha"] }, - "include": ["src/test/suite/*.ts", "src/core/**/*", "src/types/**/*", "src/logging/**/*"] + "include": ["src/**/*.ts"], + "exclude": ["src/__tests__/**/*", "node_modules", "out", ".vscode-test"] } diff --git a/tsconfig.test.json b/tsconfig.test.json index a3d545e..208733a 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -1,22 +1,14 @@ { "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./tsconfig.json", "compilerOptions": { "allowJs": true, "module": "NodeNext", "moduleResolution": "NodeNext", "noEmit": true, - "removeComments": false, "sourceMap": true, - "target": "ES2022" + "types": ["jest", "node"] }, - "exclude": ["out", "node_modules", ".vscode-test"], - "extends": "./tsconfig.json", - "include": [ - "__mocks__", - "__tests__", - "src", - "eslint.config.mjs", - "jest.config.cjs", - "rollup.config.js" - ] + "include": ["src/**/*.ts", "__tests__/**/*", "__mocks__/**/*", "jest.config.cjs"], + "exclude": ["out", "node_modules", ".vscode-test"] } From 1dbfd31700ce952eb3d8c780aabb8a20438e7407 Mon Sep 17 00:00:00 2001 From: coderrob Date: Fri, 17 Oct 2025 22:00:34 -0500 Subject: [PATCH 05/20] refactor: rename 'warning' method to 'warn' in logging classes and update package name --- package.json | 2 +- src/core/services/barrel-file.generator.ts | 2 +- src/logging/loggers/composite.ts | 4 ++-- src/logging/loggers/filtered.ts | 6 ++---- src/logging/loggers/metrics.ts | 4 ++-- src/logging/loggers/mock.ts | 9 ++++++++- src/logging/loggers/noop.ts | 2 +- src/logging/pino/logger.ts | 2 +- src/logging/types.ts | 2 +- test-project/src/utils/logger.ts | 7 +++++++ 10 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 test-project/src/utils/logger.ts diff --git a/package.json b/package.json index 430f20f..9cc761e 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,7 @@ ], "license": "Apache-2.0", "main": "./out/extension.js", - "name": "@coderrob/barrel-roll", + "name": "barrel-roll", "publisher": "coderrob", "repository": { "type": "git", diff --git a/src/core/services/barrel-file.generator.ts b/src/core/services/barrel-file.generator.ts index 0e17b35..cec9337 100644 --- a/src/core/services/barrel-file.generator.ts +++ b/src/core/services/barrel-file.generator.ts @@ -38,7 +38,7 @@ export class BarrelFileGenerator { /** * Generates or updates an index.ts barrel file in the specified directory. * @param directoryUri The URI of the directory where the barrel file should be created/updated. - * @param options Behavioural options for generation. + * @param options Behavioral options for generation. * @returns Promise that resolves when barrel files have been created/updated. */ async generateBarrelFile(directoryUri: Uri, options?: BarrelGenerationOptions): Promise { diff --git a/src/logging/loggers/composite.ts b/src/logging/loggers/composite.ts index aaf175a..783e2be 100644 --- a/src/logging/loggers/composite.ts +++ b/src/logging/loggers/composite.ts @@ -50,8 +50,8 @@ export class CompositeLogger implements ILogger { * @param message - The message to log. * @param metadata - Optional metadata to include with the log. */ - warning(message: string, metadata?: ILogMetadata): void { - this.loggers.forEach((logger) => logger.warning(message, metadata)); + warn(message: string, metadata?: ILogMetadata): void { + this.loggers.forEach((logger) => logger.warn(message, metadata)); } /** diff --git a/src/logging/loggers/filtered.ts b/src/logging/loggers/filtered.ts index db5e023..cca6bbd 100644 --- a/src/logging/loggers/filtered.ts +++ b/src/logging/loggers/filtered.ts @@ -53,11 +53,9 @@ export class FilteredLogger implements ILogger { * @param message - The message to log. * @param metadata - Optional metadata to include with the log. */ - warning(message: string, metadata?: ILogMetadata): void { + warn(message: string, metadata?: ILogMetadata): void { this.logIfAllowed(LogLevel.WARNING, message, metadata, () => - metadata - ? this.wrappedLogger.warning(message, metadata) - : this.wrappedLogger.warning(message), + metadata ? this.wrappedLogger.warn(message, metadata) : this.wrappedLogger.warn(message), ); } diff --git a/src/logging/loggers/metrics.ts b/src/logging/loggers/metrics.ts index b257978..328d646 100644 --- a/src/logging/loggers/metrics.ts +++ b/src/logging/loggers/metrics.ts @@ -71,9 +71,9 @@ export class MetricsLogger implements ILogger { * @param message - The message to log. * @param metadata - Optional metadata to include with the log. */ - warning(message: string, metadata?: ILogMetadata): void { + warn(message: string, metadata?: ILogMetadata): void { this.recordLog('warning', message, metadata); - this.wrappedLogger.warning(message, metadata); + this.wrappedLogger.warn(message, metadata); } /** diff --git a/src/logging/loggers/mock.ts b/src/logging/loggers/mock.ts index f91c08a..268c36e 100644 --- a/src/logging/loggers/mock.ts +++ b/src/logging/loggers/mock.ts @@ -51,7 +51,7 @@ export class MockLogger implements ILogger { * @param message - The message to log. * @param metadata - Optional metadata to include with the log. */ - warning(message: string, metadata?: ILogMetadata): void { + warn(message: string, metadata?: ILogMetadata): void { this.calls.push({ level: LogLevel.WARNING, message, @@ -60,6 +60,13 @@ export class MockLogger implements ILogger { }); } + /** + * @deprecated Use {@link warn} instead. + */ + warning(message: string, metadata?: ILogMetadata): void { + this.warn(message, metadata); + } + /** * Records an error log call for testing. * @param message - The message to log. diff --git a/src/logging/loggers/noop.ts b/src/logging/loggers/noop.ts index 899d3fc..5136fee 100644 --- a/src/logging/loggers/noop.ts +++ b/src/logging/loggers/noop.ts @@ -50,7 +50,7 @@ export class NoopLogger implements ILogger { * @param _message - Message to log as failure. * @param _metadata - Optional metadata for the failure. */ - warning(_message: string, _metadata?: ILogMetadata): void { + warn(_message: string, _metadata?: ILogMetadata): void { /* No-op */ } diff --git a/src/logging/pino/logger.ts b/src/logging/pino/logger.ts index 456d1f8..2d43ea3 100644 --- a/src/logging/pino/logger.ts +++ b/src/logging/pino/logger.ts @@ -80,7 +80,7 @@ export class PinoLogger implements ILogger { * @param message - The message to log. * @param metadata - Optional metadata to include with the log. */ - warning(message: string, metadata?: ILogMetadata): void { + warn(message: string, metadata?: ILogMetadata): void { this.logger.warn(metadata || {}, message); } diff --git a/src/logging/types.ts b/src/logging/types.ts index 57a1c6d..08f0b14 100644 --- a/src/logging/types.ts +++ b/src/logging/types.ts @@ -224,7 +224,7 @@ export interface ILogger { * @param message - The message to log. * @param metadata - Optional metadata to include with the log. */ - warning(message: string, metadata?: ILogMetadata): void; + warn(message: string, metadata?: ILogMetadata): void; /** * Logs an error message. diff --git a/test-project/src/utils/logger.ts b/test-project/src/utils/logger.ts new file mode 100644 index 0000000..6d3fbd8 --- /dev/null +++ b/test-project/src/utils/logger.ts @@ -0,0 +1,7 @@ +export class Logger { + log(message: string): void { + console.log(`[LOG] ${message}`); + } +} + +export const PI = 3.14159; From 13f606060f9c889f82910b40583556747225a79f Mon Sep 17 00:00:00 2001 From: coderrob Date: Sat, 18 Oct 2025 12:58:03 -0500 Subject: [PATCH 06/20] refactor: rename 'warning' method to 'warn' across logger test files --- src/__tests__/loggers/composite.logger.test.ts | 10 ++++++---- src/__tests__/loggers/filtered.logger.test.ts | 8 ++++---- src/__tests__/loggers/metrics.logger.test.ts | 2 +- src/__tests__/loggers/mock.logger.test.ts | 2 +- src/__tests__/loggers/noop.logger.test.ts | 4 ++-- src/__tests__/loggers/pino.logger.test.ts | 4 ++-- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/__tests__/loggers/composite.logger.test.ts b/src/__tests__/loggers/composite.logger.test.ts index cb89f51..4b162ca 100644 --- a/src/__tests__/loggers/composite.logger.test.ts +++ b/src/__tests__/loggers/composite.logger.test.ts @@ -99,14 +99,16 @@ describe('CompositeLogger', () => { expect(result).toBe('success'); // Check that group operations were recorded expect(mockLogger1.calls.some((call) => call.level === LogLevel.GROUP)).toBe(true); - expect(mockLogger2.calls.some((call) => call.level === LogLevel.GROUP)).toBe(true); + const infoMessages = mockLogger2.getCallsForLevel(LogLevel.INFO).map((call) => call.message); + expect(infoMessages).toContain('Starting group: test group'); + expect(infoMessages).toContain('Completed group: test group'); }); it('should handle group operation with logger failures', async () => { const failingLogger: jest.Mocked = { info: jest.fn(), debug: jest.fn(), - warning: jest.fn(), + warn: jest.fn(), error: jest.fn(), setFailed: jest.fn(), group: jest.fn().mockImplementation(() => { @@ -152,10 +154,10 @@ describe('CompositeLogger', () => { }); }); - describe('warning', () => { + describe('warn', () => { it('should delegate warning calls to all loggers', () => { const metadata = { component: 'test' }; - compositeLogger.warning('warning message', metadata); + compositeLogger.warn('warning message', metadata); expect(mockLogger1.calls).toHaveLength(1); expect(mockLogger2.calls).toHaveLength(1); diff --git a/src/__tests__/loggers/filtered.logger.test.ts b/src/__tests__/loggers/filtered.logger.test.ts index 89a2746..7e3ca41 100644 --- a/src/__tests__/loggers/filtered.logger.test.ts +++ b/src/__tests__/loggers/filtered.logger.test.ts @@ -111,7 +111,7 @@ describe('FilteredLogger', () => { describe('warning', () => { it('should log warning messages when no filters', () => { - filteredLogger.warning('warning message'); + filteredLogger.warn('warning message'); expect(mockLogger.getLastCall()).toEqual({ level: LogLevel.WARNING, @@ -122,7 +122,7 @@ describe('FilteredLogger', () => { it('should log warning messages with metadata when no filters', () => { const metadata = { component: 'test' }; - filteredLogger.warning('warning message', metadata); + filteredLogger.warn('warning message', metadata); expect(mockLogger.getLastCall()).toEqual({ level: LogLevel.WARNING, @@ -339,7 +339,7 @@ describe('FilteredLogger', () => { const logger = new FilteredLogger(mockLogger, [], customSampling); const metadata = { test: true }; - logger.warning('warning message', metadata); + logger.warn('warning message', metadata); expect(customSampling.shouldSample).toHaveBeenCalledWith( LogLevel.WARNING, @@ -372,7 +372,7 @@ describe('FilteredLogger', () => { const sampling = { rate: 0.5 }; const logger = new FilteredLogger(mockLogger, filters, sampling); - logger.warning('warning message'); // Should pass both filter and sampling + logger.warn('warning message'); // Should pass both filter and sampling expect(mockLogger.getCallsForLevel(LogLevel.WARNING)).toHaveLength(1); diff --git a/src/__tests__/loggers/metrics.logger.test.ts b/src/__tests__/loggers/metrics.logger.test.ts index f2fba4f..6b806d0 100644 --- a/src/__tests__/loggers/metrics.logger.test.ts +++ b/src/__tests__/loggers/metrics.logger.test.ts @@ -41,7 +41,7 @@ describe('MetricsLogger', () => { describe('warning', () => { it('should record metrics for warning logs', () => { const metadata: ILogMetadata = { title: 'Warning' }; - metricsLogger.warning('warning message', metadata); + metricsLogger.warn('warning message', metadata); const metrics = metricsLogger.getMetrics(); expect(metrics.totalLogs).toBe(1); diff --git a/src/__tests__/loggers/mock.logger.test.ts b/src/__tests__/loggers/mock.logger.test.ts index b17dc85..cc4f1be 100644 --- a/src/__tests__/loggers/mock.logger.test.ts +++ b/src/__tests__/loggers/mock.logger.test.ts @@ -53,7 +53,7 @@ describe('MockLogger', () => { describe('warning', () => { it('should record warning calls with metadata', () => { const metadata = { title: 'Warning' }; - mockLogger.warning('test warning', metadata); + mockLogger.warn('test warning', metadata); expect(mockLogger.calls).toHaveLength(1); expect(mockLogger.calls[0]).toMatchObject({ level: LogLevel.WARNING, diff --git a/src/__tests__/loggers/noop.logger.test.ts b/src/__tests__/loggers/noop.logger.test.ts index 3455bb2..e1e0d47 100644 --- a/src/__tests__/loggers/noop.logger.test.ts +++ b/src/__tests__/loggers/noop.logger.test.ts @@ -47,8 +47,8 @@ describe('NoopLogger', () => { }); it('should call warning without error', () => { - expect(() => logger.warning('test')).not.toThrow(); - expect(() => logger.warning('test', { key: 'value' })).not.toThrow(); + expect(() => logger.warn('test')).not.toThrow(); + expect(() => logger.warn('test', { key: 'value' })).not.toThrow(); }); it('should call error without error', () => { diff --git a/src/__tests__/loggers/pino.logger.test.ts b/src/__tests__/loggers/pino.logger.test.ts index bdf7cb0..7a7638a 100644 --- a/src/__tests__/loggers/pino.logger.test.ts +++ b/src/__tests__/loggers/pino.logger.test.ts @@ -75,8 +75,8 @@ describe('PinoLogger', () => { describe('warning', () => { it('should handle warning calls', () => { - logger.warning('warning message'); - logger.warning('warning with metadata', { component: 'test' }); + logger.warn('warning message'); + logger.warn('warning with metadata', { component: 'test' }); // Test passes if no exception is thrown expect(true).toBe(true); }); From 994e768962b0caf7852da73edff2554bd596feec Mon Sep 17 00:00:00 2001 From: coderrob Date: Sun, 19 Oct 2025 13:17:30 -0500 Subject: [PATCH 07/20] feat: add basic math utility functions for addition and multiplication --- .../core/services/file-system.service.test.ts | 178 ++++++++++++++++++ src/__tests__/loggers/pino.logger.test.ts | 60 ++++++ src/extension.ts | 6 + src/logging/loggers/composite.ts | 134 +++++-------- src/logging/loggers/mock.ts | 7 - src/logging/pino/logger.ts | 75 ++++++++ test-project/src/utils/math.ts | 7 + 7 files changed, 374 insertions(+), 93 deletions(-) create mode 100644 src/__tests__/core/services/file-system.service.test.ts create mode 100644 test-project/src/utils/math.ts diff --git a/src/__tests__/core/services/file-system.service.test.ts b/src/__tests__/core/services/file-system.service.test.ts new file mode 100644 index 0000000..ed72e6f --- /dev/null +++ b/src/__tests__/core/services/file-system.service.test.ts @@ -0,0 +1,178 @@ +import { Dirent } from 'fs'; +import * as fs from 'fs/promises'; +import * as path from 'path'; + +import { beforeEach, describe, expect, it } from '@jest/globals'; + +import { FileSystemService } from '../../../core/services/file-system.service.js'; + +jest.mock('fs/promises'); + +describe('FileSystemService', () => { + let service: FileSystemService; + const mockFs = fs as jest.Mocked; + + const createFileEntry = (name: string): Dirent => + ({ + name, + isFile: () => true, + isDirectory: () => false, + }) as unknown as Dirent; + + const createDirectoryEntry = (name: string): Dirent => + ({ + name, + isFile: () => false, + isDirectory: () => true, + }) as unknown as Dirent; + + beforeEach(() => { + service = new FileSystemService(); + jest.clearAllMocks(); + }); + + describe('getTypeScriptFiles', () => { + const directoryPath = '/path/to/dir'; + + it('should return TypeScript files excluding index.ts and definition files', async () => { + const mockEntries: Dirent[] = [ + createFileEntry('file.ts'), + createFileEntry('index.ts'), + createFileEntry('types.d.ts'), + createFileEntry('component.tsx'), + createDirectoryEntry('nested'), + ]; + mockFs.readdir.mockResolvedValue(mockEntries as never); + + const result = await service.getTypeScriptFiles(directoryPath); + + expect(result).toEqual([ + path.join(directoryPath, 'file.ts'), + path.join(directoryPath, 'component.tsx'), + ]); + expect(mockFs.readdir).toHaveBeenCalledWith(directoryPath, { withFileTypes: true }); + }); + + it.each<[string, Dirent, boolean]>([ + ['include .ts files', createFileEntry('alpha.ts'), true], + ['include .tsx files', createFileEntry('component.tsx'), true], + ['exclude index.ts', createFileEntry('index.ts'), false], + ['exclude definition files', createFileEntry('types.d.ts'), false], + ['exclude non-TypeScript extensions', createFileEntry('main.js'), false], + ['exclude directory entries', createDirectoryEntry('nested'), false], + ])('should %s', async (_description: string, entry: Dirent, shouldInclude: boolean) => { + mockFs.readdir.mockResolvedValue([entry] as never); + + const result = await service.getTypeScriptFiles(directoryPath); + + const expectedPath = path.join(directoryPath, entry.name); + expect(result).toEqual(shouldInclude ? [expectedPath] : []); + }); + + it('should throw error if directory read fails', async () => { + mockFs.readdir.mockRejectedValue(new Error('Read error')); + + await expect(service.getTypeScriptFiles('/invalid/path')).rejects.toThrow( + 'Failed to read directory: Read error', + ); + }); + }); + + describe('getSubdirectories', () => { + const directoryPath = '/path/to/dir'; + + it('should return traversable subdirectories', async () => { + const mockEntries: Dirent[] = [ + createDirectoryEntry('subdir'), + createDirectoryEntry('node_modules'), + createDirectoryEntry('.hidden'), + createFileEntry('file.ts'), + ]; + mockFs.readdir.mockResolvedValue(mockEntries as never); + + const result = await service.getSubdirectories(directoryPath); + + expect(result).toEqual([path.join(directoryPath, 'subdir')]); + expect(mockFs.readdir).toHaveBeenCalledWith(directoryPath, { withFileTypes: true }); + }); + + it.each<[string, Dirent, boolean]>([ + ['include standard directory names', createDirectoryEntry('components'), true], + ['exclude node_modules directory', createDirectoryEntry('node_modules'), false], + ['exclude dot-prefixed directories', createDirectoryEntry('.git'), false], + ['exclude files', createFileEntry('readme.md'), false], + ])('should %s', async (_description: string, entry: Dirent, shouldInclude: boolean) => { + mockFs.readdir.mockResolvedValue([entry] as never); + + const result = await service.getSubdirectories(directoryPath); + + const expectedPath = path.join(directoryPath, entry.name); + expect(result).toEqual(shouldInclude ? [expectedPath] : []); + }); + + it('should throw error if directory read fails', async () => { + mockFs.readdir.mockRejectedValue(new Error('Read error')); + + await expect(service.getSubdirectories('/invalid/path')).rejects.toThrow( + 'Failed to read directory: Read error', + ); + }); + }); + + describe('readFile', () => { + it('should read file content successfully', async () => { + mockFs.readFile.mockResolvedValue('file content'); + + const result = await service.readFile('/path/to/file.ts'); + + expect(result).toBe('file content'); + expect(mockFs.readFile).toHaveBeenCalledWith('/path/to/file.ts', 'utf-8'); + }); + + it('should throw error if file read fails', async () => { + mockFs.readFile.mockRejectedValue(new Error('Read error')); + + await expect(service.readFile('/invalid/path')).rejects.toThrow( + 'Failed to read file /invalid/path: Read error', + ); + }); + }); + + describe('writeFile', () => { + it('should write file content successfully', async () => { + mockFs.writeFile.mockResolvedValue(undefined); + + await service.writeFile('/path/to/file.ts', 'content'); + + expect(mockFs.writeFile).toHaveBeenCalledWith('/path/to/file.ts', 'content', 'utf-8'); + }); + + it('should throw error if file write fails', async () => { + mockFs.writeFile.mockRejectedValue(new Error('Write error')); + + await expect(service.writeFile('/invalid/path', 'content')).rejects.toThrow( + 'Failed to write file /invalid/path: Write error', + ); + }); + }); + + describe('fileExists', () => { + it.each<[string, boolean]>([ + ['return true when access succeeds', true], + ['return false when access fails', false], + ])('should %s', async (_description: string, expected: boolean) => { + const filePath = expected ? '/path/to/file.ts' : '/invalid/path'; + + if (expected) { + mockFs.access.mockResolvedValue(undefined); + } else { + mockFs.access.mockRejectedValue(new Error('Access error')); + } + + const result = await service.fileExists(filePath); + + expect(result).toBe(expected); + expect(mockFs.access).toHaveBeenCalledWith(filePath); + }); + }); +}); diff --git a/src/__tests__/loggers/pino.logger.test.ts b/src/__tests__/loggers/pino.logger.test.ts index 7a7638a..d9139a8 100644 --- a/src/__tests__/loggers/pino.logger.test.ts +++ b/src/__tests__/loggers/pino.logger.test.ts @@ -15,13 +15,38 @@ * */ +import type { OutputChannel } from 'vscode'; + import { LogLevel, PinoLogger } from '../../logging/index.js'; +type MockOutputChannel = OutputChannel & { + append: jest.Mock; + appendLine: jest.Mock; + clear: jest.Mock; + replace: jest.Mock; + show: jest.Mock; + hide: jest.Mock; + dispose: jest.Mock; +}; + +const createMockOutputChannel = (): MockOutputChannel => + ({ + name: 'Test Channel', + append: jest.fn(), + appendLine: jest.fn(), + clear: jest.fn(), + replace: jest.fn(), + show: jest.fn(), + hide: jest.fn(), + dispose: jest.fn(), + }) as unknown as MockOutputChannel; + describe('PinoLogger', () => { let logger: PinoLogger; afterEach(() => { jest.clearAllMocks(); + PinoLogger.configureOutputChannel(undefined); }); beforeEach(() => { @@ -88,6 +113,41 @@ describe('PinoLogger', () => { }); }); + describe('output channel integration', () => { + it('should append info logs to the configured output channel', () => { + const outputChannel = createMockOutputChannel(); + PinoLogger.configureOutputChannel(outputChannel); + const channelLogger = new PinoLogger({ level: LogLevel.INFO }); + + channelLogger.info('I am a banana.', { fruit: 'banana' }); + + expect(outputChannel.appendLine).toHaveBeenCalledTimes(1); + const [loggedLine] = outputChannel.appendLine.mock.calls[0]; + expect(loggedLine).toContain('[INFO] I am a banana.'); + expect(loggedLine).toContain('"fruit":"banana"'); + }); + + it('should record group lifecycle events in the output channel', async () => { + const outputChannel = createMockOutputChannel(); + PinoLogger.configureOutputChannel(outputChannel); + const channelLogger = new PinoLogger({ level: LogLevel.INFO }); + + await expect( + channelLogger.group('citrus-run', async () => { + throw new Error('group failed'); + }), + ).rejects.toThrow('group failed'); + + const recordedMessages = outputChannel.appendLine.mock.calls.map(([call]) => call as string); + expect(recordedMessages).toEqual( + expect.arrayContaining([ + expect.stringContaining('Starting group: citrus-run'), + expect.stringContaining('Failed in group: citrus-run'), + ]), + ); + }); + }); + it('should handle error logging', () => { const error = new Error('test error'); expect(() => logger.error('error occurred', { error: error.message })).not.toThrow(); diff --git a/src/extension.ts b/src/extension.ts index ec6b6ce..a9cde2a 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -6,6 +6,7 @@ import { BarrelFileGenerator, type BarrelGenerationOptions, } from './core/services/barrel-file.generator'; +import { PinoLogger } from './logging/pino/logger.js'; type CommandDescriptor = { id: string; @@ -17,6 +18,11 @@ type CommandDescriptor = { export function activate(context: vscode.ExtensionContext) { console.log('Barrel Roll extension is now active'); + const outputChannel = vscode.window.createOutputChannel('Barrel Roll'); + context.subscriptions.push(outputChannel); + PinoLogger.configureOutputChannel(outputChannel); + outputChannel.appendLine('Barrel Roll: logging initialized'); + const generator = new BarrelFileGenerator(); const descriptors: CommandDescriptor[] = [ diff --git a/src/logging/loggers/composite.ts b/src/logging/loggers/composite.ts index 783e2be..e7cdcf8 100644 --- a/src/logging/loggers/composite.ts +++ b/src/logging/loggers/composite.ts @@ -88,106 +88,68 @@ export class CompositeLogger implements ILogger { return this.loggers[0].group(name, fn); } - return this.executeGroupWithMultipleLoggers(name, fn); - } - - /** - * Execute group operation when there are multiple loggers. - * @param name - The name of the group. - * @param fn - The function to execute within the group. - * @returns A promise that resolves when all group operations complete. - */ - private async executeGroupWithMultipleLoggers(name: string, fn: () => Promise): Promise { - const results = await Promise.allSettled( - this.loggers.map((logger, index) => this.executeLoggerGroup(logger, index, name, fn)), - ); + const executeOnce = this.createSingleExecution(name, fn); + let lastError: unknown; - return this.processGroupResults(results); - } + for (let index = 0; index < this.loggers.length; index++) { + const logger = this.loggers[index]; - /** - * Execute group operation for a single logger with error handling. - * @param logger - The logger to execute the group on. - * @param index - The index of the logger in the composite. - * @param name - The name of the group. - * @param fn - The function to execute within the group. - * @returns A promise that resolves with the result of the group operation. - */ - private async executeLoggerGroup( - logger: ILogger, - index: number, - name: string, - fn: () => Promise, - ): Promise { - try { - return await logger.group(name, fn); - } catch (error) { - throw new Error(`Logger ${index} failed in group operation: ${error}`); + try { + return await logger.group(name, () => executeOnce(index)); + } catch (error) { + lastError = error; + this.logGroupFailure(index, error); + } } - } - /** - * Process the results of multiple logger group operations. - * @param results - Array of PromiseSettledResult from each logger's group operation. - * @returns The result from the first successful logger, or throws if all failed. - */ - private processGroupResults(results: PromiseSettledResult[]): T { - const { failures, successResult } = this.analyzeResults(results); + throw this.normalizeGroupError(name, lastError); + } - if (failures.length === results.length) { - this.logAllFailures(failures); - throw failures[0].error; - } + private createSingleExecution(name: string, fn: () => Promise) { + let execution: Promise | undefined; + + return async (executingIndex: number): Promise => { + if (!execution) { + const otherLoggers = this.loggers.filter((_, index) => index !== executingIndex); + execution = (async () => { + this.emitGroupStart(otherLoggers, name); + try { + const result = await fn(); + this.emitGroupCompletion(otherLoggers, name); + return result; + } catch (error) { + this.emitGroupFailure(otherLoggers, name, error); + throw error; + } + })(); + } - if (failures.length > 0) { - this.logPartialFailures(failures, results.length); - } + return execution; + }; + } - return successResult as T; + private emitGroupStart(loggers: ILogger[], name: string): void { + loggers.forEach((logger) => logger.info(`Starting group: ${name}`)); } - /** - * Analyze the results to separate failures and find success result. - * @return An object containing failures and the first successful result (if any). - */ - private analyzeResults(results: PromiseSettledResult[]) { - const failures: Array<{ index: number; error: unknown }> = []; - let successResult: T | undefined; - - results.forEach((result, index) => { - if (result.status === 'fulfilled') { - if (successResult === undefined) { - successResult = result.value; - } - } else { - failures.push({ index, error: result.reason }); - } - }); + private emitGroupCompletion(loggers: ILogger[], name: string): void { + loggers.forEach((logger) => logger.info(`Completed group: ${name}`)); + } - return { failures, successResult }; + private emitGroupFailure(loggers: ILogger[], name: string, error: unknown): void { + loggers.forEach((logger) => logger.error(`Failed in group: ${name}`, { error })); } - /** - * Log when all loggers failed. - * @param failures - Array of failure details - */ - private logAllFailures(failures: Array<{ index: number; error: unknown }>) { - console.error('All loggers failed in group operation:', failures); + private logGroupFailure(index: number, error: unknown): void { + console.warn(`Logger ${index} failed in group operation:`, error); } - /** - * Log when some loggers failed but others succeeded. - * @param failures - Array of failure details - * @param totalCount - Total number of loggers involved - */ - private logPartialFailures( - failures: Array<{ index: number; error: unknown }>, - totalCount: number, - ) { - console.warn( - `${failures.length} of ${totalCount} loggers failed in group operation:`, - failures, - ); + private normalizeGroupError(name: string, error: unknown): Error { + if (error instanceof Error) { + return error; + } + + return new Error(`Group '${name}' failed with unknown error.`); } /** diff --git a/src/logging/loggers/mock.ts b/src/logging/loggers/mock.ts index 268c36e..07fe0bf 100644 --- a/src/logging/loggers/mock.ts +++ b/src/logging/loggers/mock.ts @@ -60,13 +60,6 @@ export class MockLogger implements ILogger { }); } - /** - * @deprecated Use {@link warn} instead. - */ - warning(message: string, metadata?: ILogMetadata): void { - this.warn(message, metadata); - } - /** * Records an error log call for testing. * @param message - The message to log. diff --git a/src/logging/pino/logger.ts b/src/logging/pino/logger.ts index 2d43ea3..7c555ab 100644 --- a/src/logging/pino/logger.ts +++ b/src/logging/pino/logger.ts @@ -16,6 +16,7 @@ */ import pino from 'pino'; +import type { OutputChannel } from 'vscode'; import { NoopLogger } from '../loggers/noop.js'; import { ILogger, ILogMetadata } from '../types.js'; @@ -27,6 +28,8 @@ export class PinoLogger implements ILogger { private logger: pino.Logger; private isAvailable: boolean = true; + private static sharedOutputChannel?: OutputChannel; + constructor(options?: pino.LoggerOptions) { try { this.logger = pino( @@ -50,6 +53,14 @@ export class PinoLogger implements ILogger { } } + /** + * Configure a shared VS Code output channel used by all logger instances. + * @param channel - Output channel to use for human-readable log messages. + */ + static configureOutputChannel(channel: OutputChannel | undefined): void { + PinoLogger.sharedOutputChannel = channel; + } + /** * Check if Pino logger is available and functioning. * @returns True if the logger is available, false otherwise. @@ -65,6 +76,7 @@ export class PinoLogger implements ILogger { */ info(message: string, metadata?: ILogMetadata): void { this.logger.info(metadata || {}, message); + this.appendToOutputChannel('INFO', message, metadata); } /** @@ -73,6 +85,7 @@ export class PinoLogger implements ILogger { */ debug(message: string): void { this.logger.debug({}, message); + this.appendToOutputChannel('DEBUG', message); } /** @@ -82,6 +95,7 @@ export class PinoLogger implements ILogger { */ warn(message: string, metadata?: ILogMetadata): void { this.logger.warn(metadata || {}, message); + this.appendToOutputChannel('WARN', message, metadata); } /** @@ -91,6 +105,7 @@ export class PinoLogger implements ILogger { */ error(message: string, metadata?: ILogMetadata): void { this.logger.error(metadata || {}, message); + this.appendToOutputChannel('ERROR', message, metadata); } /** @@ -100,6 +115,7 @@ export class PinoLogger implements ILogger { */ setFailed(message: string, metadata?: ILogMetadata): void { this.logger.fatal(metadata || {}, `Action failed: ${message}`); + this.appendToOutputChannel('FATAL', `Action failed: ${message}`, metadata); } /** @@ -116,17 +132,76 @@ export class PinoLogger implements ILogger { // Temporarily replace the logger with the child logger this.logger = childLogger; childLogger.info(`Starting group: ${name}`); + this.appendToOutputChannel('GROUP', `Starting group: ${name}`); try { const result = await fn(); childLogger.info(`Completed group: ${name}`); + this.appendToOutputChannel('GROUP', `Completed group: ${name}`); return result; } catch (error) { childLogger.error({ error }, `Failed in group: ${name}`); + this.appendToOutputChannel('ERROR', `Failed in group: ${name}`, { + error: this.normalizeError(error), + }); throw error; } finally { // Restore the original logger this.logger = originalLogger; } } + + private appendToOutputChannel( + level: string, + message: string, + metadata?: Record, + ): void { + const channel = PinoLogger.sharedOutputChannel; + if (!channel) { + return; + } + + const formattedMetadata = this.formatMetadata(metadata); + const line = formattedMetadata + ? `[${level}] ${message} ${formattedMetadata}` + : `[${level}] ${message}`; + channel.appendLine(line); + } + + private formatMetadata(metadata?: Record): string | undefined { + if (!metadata || Object.keys(metadata).length === 0) { + return undefined; + } + + const normalized = Object.entries(metadata).reduce>( + (accumulator, [key, value]) => { + accumulator[key] = value instanceof Error ? value.message : value; + return accumulator; + }, + {}, + ); + + return this.safeStringify(normalized); + } + + private normalizeError(error: unknown): string { + if (error instanceof Error) { + return error.stack || error.message; + } + if (typeof error === 'object' && error !== null) { + return this.safeStringify(error); + } + return String(error); + } + + private safeStringify(value: unknown): string { + if (typeof value === 'string') { + return value; + } + try { + return JSON.stringify(value); + } catch { + return String(value); + } + } } diff --git a/test-project/src/utils/math.ts b/test-project/src/utils/math.ts new file mode 100644 index 0000000..341e651 --- /dev/null +++ b/test-project/src/utils/math.ts @@ -0,0 +1,7 @@ +export function add(a: number, b: number): number { + return a + b; +} + +export function multiply(a: number, b: number): number { + return a * b; +} From 61c37448e72f18b6f64ca12756d4c76bc8d3f8cf Mon Sep 17 00:00:00 2001 From: coderrob Date: Sun, 19 Oct 2025 20:10:09 -0500 Subject: [PATCH 08/20] feat: integrate simple-import-sort for import organization - Added eslint-plugin-simple-import-sort to ESLint configuration for improved import sorting. - Removed previous import sorting rules in favor of simple-import-sort. - Updated devDependencies in package.json and package-lock.json to include new plugin and updated versions of existing packages. - Deleted rollup.config.js as it is no longer needed. - Cleaned up unnecessary whitespace in various TypeScript files. - Updated webpack configuration to set mode to production and added extension alias for better resolution. --- .eslintrc.json | 18 - .prettierrc.yml | 16 - dist/extension.js | 296 ------------ dist/extension.js.map | 1 - eslint.config.mjs | 29 +- package-lock.json | 505 +-------------------- package.json | 13 +- rollup.config.js | 77 ---- src/core/services/barrel-file.generator.ts | 1 - src/extension.ts | 1 - src/logging/config.ts | 1 - src/logging/index.ts | 2 +- src/logging/loggers/factory.ts | 1 - src/test/runTest.ts | 3 +- webpack.config.cjs | 4 + 15 files changed, 35 insertions(+), 933 deletions(-) delete mode 100644 .eslintrc.json delete mode 100644 .prettierrc.yml delete mode 100644 dist/extension.js delete mode 100644 dist/extension.js.map delete mode 100644 rollup.config.js diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index c5908b0..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "ignorePatterns": ["out", ".vscode-test", "node_modules", "**/*.d.ts"], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module" - }, - "plugins": ["@typescript-eslint"], - "root": true, - "rules": { - "@typescript-eslint/naming-convention": "warn", - "@typescript-eslint/semi": "warn", - "curly": "warn", - "eqeqeq": "warn", - "no-throw-literal": "warn", - "semi": "off" - } -} diff --git a/.prettierrc.yml b/.prettierrc.yml deleted file mode 100644 index 87e925a..0000000 --- a/.prettierrc.yml +++ /dev/null @@ -1,16 +0,0 @@ -# See: https://prettier.io/docs/en/configuration - -arrowParens: always -bracketSameLine: true -bracketSpacing: true -endOfLine: lf -htmlWhitespaceSensitivity: css -jsxSingleQuote: false -printWidth: 80 -proseWrap: preserve -quoteProps: as-needed -semi: true -singleQuote: true -tabWidth: 2 -trailingComma: none -useTabs: false diff --git a/dist/extension.js b/dist/extension.js deleted file mode 100644 index db7e7c6..0000000 --- a/dist/extension.js +++ /dev/null @@ -1,296 +0,0 @@ -(() => { - 'use strict'; - var e = { - d: (r, t) => { - for (var i in t) - e.o(t, i) && !e.o(r, i) && Object.defineProperty(r, i, { enumerable: !0, get: t[i] }); - }, - o: (e, r) => Object.prototype.hasOwnProperty.call(e, r), - r: (e) => { - ('undefined' != typeof Symbol && - Symbol.toStringTag && - Object.defineProperty(e, Symbol.toStringTag, { value: 'Module' }), - Object.defineProperty(e, '__esModule', { value: !0 })); - }, - }, - r = {}; - (e.r(r), e.d(r, { activate: () => p, deactivate: () => h })); - const t = require('path'), - i = require('vscode'), - s = 'default', - n = '..'; - class o { - buildContent(e, r) { - const t = [], - i = this.normalizeEntries(e), - s = Array.from(i.keys()).sort(); - for (const e of s) { - const r = i.get(e); - if (!r) continue; - const s = this.createLinesForEntry(e, r); - s.length > 0 && t.push(...s); - } - return t.join('\n') + '\n'; - } - normalizeEntries(e) { - const r = new Map(); - for (const [t, i] of e) - Array.isArray(i) ? r.set(t, { kind: 'file', exports: i }) : r.set(t, i); - return r; - } - createLinesForEntry(e, r) { - return 'directory' === r.kind - ? this.buildDirectoryExportLines(e) - : this.buildFileExportLines(e, r.exports); - } - buildDirectoryExportLines(e) { - const r = this.getModulePath(e); - return r.startsWith(n) ? [] : [`export * from './${r}';`]; - } - buildFileExportLines(e, r) { - const t = r.filter((e) => !e.includes(n)); - if (0 === t.length) return []; - const i = this.getModulePath(e); - return i.startsWith(n) ? [] : this.generateExportStatements(i, t); - } - generateExportStatements(e, r) { - const t = r.includes(s), - i = r.some((e) => e !== s); - if (t && !i) return [`export { default } from './${e}';`]; - const n = []; - if (i) { - const t = r.filter((e) => e !== s); - n.push(`export { ${t.join(', ')} } from './${e}';`); - } - return (t && n.push(`export { default } from './${e}';`), n); - } - getModulePath(e) { - let r = e.replace(/\.tsx?$/, ''); - return ((r = r.replace(/\\/g, '/')), r); - } - } - class a { - extractExports(e) { - const r = [], - t = this.removeComments(e), - i = - /export\s+(?:abstract\s+)?(?:class|interface|type|function|const|enum|let|var)\s+([A-Za-z_$][A-Za-z0-9_$]*)/g; - let s; - for (; null !== (s = i.exec(t)); ) r.push(s[1]); - const n = /export\s*\{([^}]+)\}/g; - for (; null !== (s = n.exec(t)); ) { - const e = s[1] - .split(',') - .map( - (e) => - e - .trim() - .split(/\s+as\s+/i) - .map((e) => e.trim()) - .filter((e) => e.length > 0) - .pop() ?? '', - ) - .filter((e) => e.length > 0); - r.push(...e); - } - return (/export\s+default\s+/.test(t) && r.push('default'), [...new Set(r)]); - } - removeComments(e) { - let r = e.replace(/\/\*[\s\S]*?\*\//g, ''); - return ((r = r.replace(/\/\/.*$/gm, '')), r); - } - } - const l = require('fs/promises'), - c = new Set(['node_modules', '.git']); - class u { - async getTypeScriptFiles(e) { - return (await this.readDirectory(e)) - .filter((e) => this.isTypeScriptFile(e)) - .map((r) => t.join(e, r.name)); - } - async getSubdirectories(e) { - return (await this.readDirectory(e)) - .filter((e) => this.isTraversableDirectory(e)) - .map((r) => t.join(e, r.name)); - } - isTypeScriptFile(e) { - if (!e.isFile()) return !1; - const r = 'index.ts' === e.name, - t = e.name.endsWith('.d.ts'); - return (e.name.endsWith('.ts') || e.name.endsWith('.tsx')) && !r && !t; - } - isTraversableDirectory(e) { - return e.isDirectory() && !c.has(e.name) && !e.name.startsWith('.'); - } - async readFile(e) { - try { - return await l.readFile(e, 'utf-8'); - } catch (r) { - throw new Error(`Failed to read file ${e}: ${r instanceof Error ? r.message : String(r)}`); - } - } - async writeFile(e, r) { - try { - await l.writeFile(e, r, 'utf-8'); - } catch (r) { - throw new Error(`Failed to write file ${e}: ${r instanceof Error ? r.message : String(r)}`); - } - } - async fileExists(e) { - try { - return (await l.access(e), !0); - } catch { - return !1; - } - } - async readDirectory(e) { - try { - return await l.readdir(e, { withFileTypes: !0 }); - } catch (e) { - throw new Error(`Failed to read directory: ${e instanceof Error ? e.message : String(e)}`); - } - } - } - const d = 'index.ts'; - class f { - fileSystemService; - exportParser; - barrelContentBuilder; - constructor(e, r, t) { - ((this.fileSystemService = e || new u()), - (this.exportParser = r || new a()), - (this.barrelContentBuilder = t || new o())); - } - async generateBarrelFile(e, r) { - const t = this.normalizeOptions(r); - await this.generateBarrelFileFromPath(e.fsPath, t); - } - async generateBarrelFileFromPath(e, r) { - const i = t.join(e, d), - { tsFiles: s, subdirectories: n } = await this.readDirectoryInfo(e); - r.recursive && (await this.processChildDirectories(n, r)); - const o = await this.collectEntries(e, s, n), - a = await this.fileSystemService.fileExists(i); - if (!this.shouldWriteBarrel(o, r, a)) return; - const l = this.barrelContentBuilder.buildContent(o, e); - await this.fileSystemService.writeFile(i, l); - } - async readDirectoryInfo(e) { - const [r, t] = await Promise.all([ - this.fileSystemService.getTypeScriptFiles(e), - this.fileSystemService.getSubdirectories(e), - ]); - return { tsFiles: r, subdirectories: t }; - } - async processChildDirectories(e, r) { - for (const i of e) - ('updateExisting' !== r.mode || (await this.fileSystemService.fileExists(t.join(i, d)))) && - (await this.generateBarrelFileFromPath(i, r)); - } - async collectEntries(e, r, t) { - const i = new Map(); - return (await this.addFileEntries(e, r, i), await this.addSubdirectoryEntries(e, t, i), i); - } - async addFileEntries(e, r, i) { - for (const s of r) { - const r = await this.fileSystemService.readFile(s), - n = this.exportParser.extractExports(r); - if (0 === n.length) continue; - const o = t.relative(e, s); - i.set(o, { kind: 'file', exports: n }); - } - } - async addSubdirectoryEntries(e, r, i) { - for (const s of r) { - const r = t.join(s, d); - if (!(await this.fileSystemService.fileExists(r))) continue; - const n = t.relative(e, s); - i.set(n, { kind: 'directory' }); - } - } - shouldWriteBarrel(e, r, t) { - if (e.size > 0) return !0; - if ('updateExisting' === r.mode) return t; - if (!r.recursive) throw new Error('No TypeScript files found in the selected directory'); - return t; - } - normalizeOptions(e) { - return { recursive: e?.recursive ?? !1, mode: e?.mode ?? 'createOrUpdate' }; - } - } - function p(e) { - console.log('Barrel Roll extension is now active'); - const r = new f(), - t = [ - { - id: 'barrel-roll.generateBarrel', - options: { recursive: !1, mode: 'createOrUpdate' }, - progressTitle: 'Barrel Roll: Generating barrel...', - successMessage: 'Barrel Roll: barrel file generated successfully.', - }, - { - id: 'barrel-roll.generateBarrelRecursive', - options: { recursive: !0, mode: 'createOrUpdate' }, - progressTitle: 'Barrel Roll: Generating barrels recursively...', - successMessage: 'Barrel Roll: barrel files generated recursively.', - }, - { - id: 'barrel-roll.updateBarrel', - options: { recursive: !0, mode: 'updateExisting' }, - progressTitle: 'Barrel Roll: Updating barrels...', - successMessage: 'Barrel Roll: barrel files sanitized successfully.', - }, - ]; - for (const i of t) { - const t = y(r, i); - e.subscriptions.push(t); - } - } - function h() {} - function y(e, r) { - return i.commands.registerCommand(r.id, async (s) => { - try { - const n = await (async function (e) { - const r = - e ?? - (await (async function () { - const e = await i.window.showOpenDialog({ - canSelectFiles: !1, - canSelectFolders: !0, - canSelectMany: !1, - openLabel: 'Select folder to barrel', - }); - if (e && 0 !== e.length) return e[0]; - })()); - if (r) - return (async function (e) { - try { - const r = await i.workspace.fs.stat(e); - if (r.type === i.FileType.Directory) return e; - if (r.type === i.FileType.File) return i.Uri.file(t.dirname(e.fsPath)); - } catch (e) { - const r = e instanceof Error ? e.message : String(e); - throw new Error(`Unable to access selected resource: ${r}`); - } - return e; - })(r); - })(s); - if (!n) return; - (await (async function (t) { - return i.window.withProgress( - { location: i.ProgressLocation.Window, title: t }, - async () => { - await e.generateBarrelFile(n, r.options); - }, - ); - })(r.progressTitle), - i.window.showInformationMessage(r.successMessage)); - } catch (e) { - const r = e instanceof Error ? e.message : String(e); - i.window.showErrorMessage(`Barrel Roll: ${r}`); - } - }); - } - module.exports = r; -})(); -//# sourceMappingURL=extension.js.map diff --git a/dist/extension.js.map b/dist/extension.js.map deleted file mode 100644 index d88e63f..0000000 --- a/dist/extension.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"extension.js","mappings":"mBACA,IAAIA,EAAsB,CCA1BA,EAAwB,CAACC,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXF,EAAoBI,EAAEF,EAAYC,KAASH,EAAoBI,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,MCJ3EH,EAAwB,CAACS,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFV,EAAyBC,IACH,oBAAXa,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeL,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeL,EAAS,aAAc,CAAEe,OAAO,M,qDCLvD,MAAM,EAA+BC,QAAQ,QCAvC,EAA+BA,QAAQ,UCAvCC,EAAkB,UAElBC,EAAmB,KAClB,MAAMC,EACT,YAAAC,CAAaC,EAASC,GAClB,MAAMC,EAAQ,GACRC,EAAoBC,KAAKC,iBAAiBL,GAC1CM,EAAcC,MAAMC,KAAKL,EAAkBM,QAAQC,OACzD,IAAK,MAAMC,KAAgBL,EAAa,CACpC,MAAMM,EAAQT,EAAkBjB,IAAIyB,GACpC,IAAKC,EACD,SAEJ,MAAMC,EAAcT,KAAKU,oBAAoBH,EAAcC,GACvDC,EAAYE,OAAS,GACrBb,EAAMc,QAAQH,EAEtB,CACA,OAAOX,EAAMe,KAjBL,UAkBZ,CACA,gBAAAZ,CAAiBL,GACb,MAAMkB,EAAa,IAAIC,IACvB,IAAK,MAAOR,EAAcC,KAAUZ,EAC5BO,MAAMa,QAAQR,GACdM,EAAWG,IAAIV,EAAc,CAAEW,KAAM,OAAQ3C,QAASiC,IAGtDM,EAAWG,IAAIV,EAAcC,GAGrC,OAAOM,CACX,CACA,mBAAAJ,CAAoBH,EAAcC,GAC9B,MAAmB,cAAfA,EAAMU,KACClB,KAAKmB,0BAA0BZ,GAEnCP,KAAKoB,qBAAqBb,EAAcC,EAAMjC,QACzD,CACA,yBAAA4C,CAA0BZ,GACtB,MAAMc,EAAarB,KAAKsB,cAAcf,GACtC,OAAIc,EAAWE,WAAW9B,GACf,GAEJ,CAAC,oBAAoB4B,MAChC,CACA,oBAAAD,CAAqBI,EAAUjD,GAC3B,MAAMkD,EAAiBlD,EAAQmD,OAAQC,IAASA,EAAIC,SAASnC,IAC7D,GAA8B,IAA1BgC,EAAed,OACf,MAAO,GAEX,MAAMU,EAAarB,KAAKsB,cAAcE,GACtC,OAAIH,EAAWE,WAAW9B,GACf,GAEJO,KAAK6B,yBAAyBR,EAAYI,EACrD,CACA,wBAAAI,CAAyBR,EAAY9C,GACjC,MAAMuD,EAAmBvD,EAAQqD,SAASpC,GACpCuC,EAAkBxD,EAAQyD,KAAML,GAAQA,IAAQnC,GACtD,GAAIsC,IAAqBC,EACrB,MAAO,CAAC,8BAA8BV,OAE1C,MAAMvB,EAAQ,GACd,GAAIiC,EAAiB,CACjB,MAAME,EAAe1D,EAAQmD,OAAQC,GAAQA,IAAQnC,GACrDM,EAAMc,KAAK,YAAYqB,EAAapB,KAAK,mBAAmBQ,MAChE,CAIA,OAHIS,GACAhC,EAAMc,KAAK,8BAA8BS,OAEtCvB,CACX,CACA,aAAAwB,CAAcE,GACV,IAAIH,EAAaG,EAASU,QAAQ,UAAW,IAE7C,OADAb,EAAaA,EAAWa,QAAQ,MAAO,KAChCb,CACX,EC5EG,MAAMc,EACT,cAAAC,CAAeC,GACX,MAAM9D,EAAU,GACV+D,EAAyBtC,KAAKuC,eAAeF,GAC7CG,EAAqB,8GAC3B,IAAIC,EACJ,KAAqE,QAA7DA,EAAQD,EAAmBE,KAAKJ,KACpC/D,EAAQqC,KAAK6B,EAAM,IAEvB,MAAME,EAAoB,wBAC1B,KAAoE,QAA5DF,EAAQE,EAAkBD,KAAKJ,KAAmC,CACtE,MAAMM,EAAQH,EAAM,GACfI,MAAM,KACNC,IAAKC,GAASA,EACdC,OACAH,MAAM,aACNC,IAAKG,GAAYA,EAAQD,QACzBtB,OAAQuB,GAAYA,EAAQtC,OAAS,GACrCuC,OAAS,IACTxB,OAAQqB,GAASA,EAAKpC,OAAS,GACpCpC,EAAQqC,QAAQgC,EACpB,CAIA,MAHI,sBAAsBO,KAAKb,IAC3B/D,EAAQqC,KAAK,WAEV,IAAI,IAAIwC,IAAI7E,GACvB,CACA,cAAAgE,CAAeF,GACX,IAAIgB,EAAShB,EAAQH,QAAQ,oBAAqB,IAElD,OADAmB,EAASA,EAAOnB,QAAQ,YAAa,IAC9BmB,CACX,EC/BJ,MAAM,EAA+B9D,QAAQ,eCGvC+D,EAAsB,IAAIF,IAAI,CAAC,eAAgB,SAC9C,MAAMG,EACT,wBAAMC,CAAmBC,GAErB,aADsBzD,KAAK0D,cAAcD,IAEpC/B,OAAQlB,GAAUR,KAAK2D,iBAAiBnD,IACxCsC,IAAKtC,GAAU,OAAUiD,EAAejD,EAAMuC,MACvD,CACA,uBAAMa,CAAkBH,GAEpB,aADsBzD,KAAK0D,cAAcD,IAEpC/B,OAAQlB,GAAUR,KAAK6D,uBAAuBrD,IAC9CsC,IAAKtC,GAAU,OAAUiD,EAAejD,EAAMuC,MACvD,CACA,gBAAAY,CAAiBnD,GACb,IAAKA,EAAMsD,SACP,OAAO,EAEX,MAAMC,EAnBU,aAmBIvD,EAAMuC,KACpBiB,EAAmBxD,EAAMuC,KAAKkB,SAAS,SAE7C,OADiBzD,EAAMuC,KAAKkB,SAAS,QAAUzD,EAAMuC,KAAKkB,SAAS,WAC/CF,IAAgBC,CACxC,CACA,sBAAAH,CAAuBrD,GACnB,OAAQA,EAAM0D,gBAAkBZ,EAAoBa,IAAI3D,EAAMuC,QAAUvC,EAAMuC,KAAKxB,WAAW,IAClG,CACA,cAAM6C,CAAS5C,GACX,IACI,aAAa,WAAYA,EAAU,QACvC,CACA,MAAO6C,GACH,MAAM,IAAIC,MAAM,uBAAuB9C,MAAa6C,aAAiBC,MAAQD,EAAME,QAAUC,OAAOH,KACxG,CACJ,CACA,eAAMI,CAAUjD,EAAUa,GACtB,UACU,YAAab,EAAUa,EAAS,QAC1C,CACA,MAAOgC,GACH,MAAM,IAAIC,MAAM,wBAAwB9C,MAAa6C,aAAiBC,MAAQD,EAAME,QAAUC,OAAOH,KACzG,CACJ,CACA,gBAAMK,CAAWlD,GACb,IAEI,aADM,SAAUA,IACT,CACX,CACA,MACI,OAAO,CACX,CACJ,CACA,mBAAMkC,CAAcD,GAChB,IACI,aAAa,UAAWA,EAAe,CAAEkB,eAAe,GAC5D,CACA,MAAON,GACH,MAAM,IAAIC,MAAM,6BAA6BD,aAAiBC,MAAQD,EAAME,QAAUC,OAAOH,KACjG,CACJ,ECzDJ,MAAM,EAAkB,WACjB,MAAMO,EACTC,kBACAC,aACAC,qBACA,WAAAC,CAAYH,EAAmBC,EAAcC,GACzC/E,KAAK6E,kBAAoBA,GAAqB,IAAItB,EAClDvD,KAAK8E,aAAeA,GAAgB,IAAI3C,EACxCnC,KAAK+E,qBAAuBA,GAAwB,IAAIrF,CAC5D,CACA,wBAAMuF,CAAmBC,EAAcC,GACnC,MAAMC,EAAoBpF,KAAKqF,iBAAiBF,SAC1CnF,KAAKsF,2BAA2BJ,EAAaK,OAAQH,EAC/D,CACA,gCAAME,CAA2B7B,EAAe0B,GAC5C,MAAMK,EAAiB,OAAU/B,EAAe,IAC1C,QAAEgC,EAAO,eAAEC,SAAyB1F,KAAK2F,kBAAkBlC,GAC7D0B,EAAQS,iBACF5F,KAAK6F,wBAAwBH,EAAgBP,GAEvD,MAAMvF,QAAgBI,KAAK8F,eAAerC,EAAegC,EAASC,GAC5DK,QAAyB/F,KAAK6E,kBAAkBH,WAAWc,GACjE,IAAKxF,KAAKgG,kBAAkBpG,EAASuF,EAASY,GAC1C,OAEJ,MAAME,EAAgBjG,KAAK+E,qBAAqBpF,aAAaC,EAAS6D,SAChEzD,KAAK6E,kBAAkBJ,UAAUe,EAAgBS,EAC3D,CACA,uBAAMN,CAAkBlC,GACpB,MAAOgC,EAASC,SAAwBQ,QAAQC,IAAI,CAChDnG,KAAK6E,kBAAkBrB,mBAAmBC,GAC1CzD,KAAK6E,kBAAkBjB,kBAAkBH,KAE7C,MAAO,CAAEgC,UAASC,iBACtB,CACA,6BAAMG,CAAwBH,EAAgBP,GAC1C,IAAK,MAAMiB,KAAoBV,GACN,mBAAjBP,EAAQkB,YACArG,KAAK6E,kBAAkBH,WAAW,OAAU0B,EAAkB,YAGpEpG,KAAKsF,2BAA2Bc,EAAkBjB,EAEhE,CACA,oBAAMW,CAAerC,EAAegC,EAASC,GACzC,MAAM9F,EAAU,IAAImB,IAGpB,aAFMf,KAAKsG,eAAe7C,EAAegC,EAAS7F,SAC5CI,KAAKuG,uBAAuB9C,EAAeiC,EAAgB9F,GAC1DA,CACX,CACA,oBAAM0G,CAAe7C,EAAegC,EAAS7F,GACzC,IAAK,MAAM4B,KAAYiE,EAAS,CAC5B,MAAMpD,QAAgBrC,KAAK6E,kBAAkBT,SAAS5C,GAChDjD,EAAUyB,KAAK8E,aAAa1C,eAAeC,GACjD,GAAuB,IAAnB9D,EAAQoC,OACR,SAEJ,MAAMJ,EAAe,WAAckD,EAAejC,GAClD5B,EAAQqB,IAAIV,EAAc,CAAEW,KAAM,OAAQ3C,WAC9C,CACJ,CACA,4BAAMgI,CAAuB9C,EAAeiC,EAAgB9F,GACxD,IAAK,MAAMwG,KAAoBV,EAAgB,CAC3C,MAAMc,EAAa,OAAUJ,EAAkB,GAC/C,UAAYpG,KAAK6E,kBAAkBH,WAAW8B,GAC1C,SAEJ,MAAMjG,EAAe,WAAckD,EAAe2C,GAClDxG,EAAQqB,IAAIV,EAAc,CAAEW,KAAM,aACtC,CACJ,CACA,iBAAA8E,CAAkBpG,EAASuF,EAASY,GAChC,GAAInG,EAAQ6G,KAAO,EACf,OAAO,EAEX,GAAqB,mBAAjBtB,EAAQkB,KACR,OAAON,EAEX,IAAKZ,EAAQS,UACT,MAAM,IAAItB,MAAM,uDAEpB,OAAOyB,CACX,CACA,gBAAAV,CAAiBF,GACb,MAAO,CACHS,UAAWT,GAASS,YAAa,EACjCS,KAAMlB,GAASkB,MAAQ,iBAE/B,ECzFG,SAASK,EAASC,GACrBC,QAAQC,IAAI,uCACZ,MAAMC,EAAY,IAAIlC,EAChBmC,EAAc,CAChB,CACIC,GAAI,6BACJ7B,QAAS,CAAES,WAAW,EAAOS,KAAM,kBACnCY,cAAe,oCACfC,eAAgB,oDAEpB,CACIF,GAAI,sCACJ7B,QAAS,CAAES,WAAW,EAAMS,KAAM,kBAClCY,cAAe,iDACfC,eAAgB,oDAEpB,CACIF,GAAI,2BACJ7B,QAAS,CAAES,WAAW,EAAMS,KAAM,kBAClCY,cAAe,mCACfC,eAAgB,sDAGxB,IAAK,MAAMC,KAAcJ,EAAa,CAClC,MAAMK,EAAaC,EAAsBP,EAAWK,GACpDR,EAAQW,cAAc1G,KAAKwG,EAC/B,CACJ,CACO,SAASG,IAAe,CAC/B,SAASF,EAAsBP,EAAWK,GACtC,OAAO,WAAgBK,gBAAgBL,EAAWH,GAAIS,MAAOC,IACzD,IACI,MAAMC,QAelBF,eAAsCC,GAClC,MAAME,EAAUF,SAMpBD,iBACI,MAAMI,QAAiB,SAAcC,eAAe,CAChDC,gBAAgB,EAChBC,kBAAkB,EAClBC,eAAe,EACfC,UAAW,4BAEf,GAAKL,GAAgC,IAApBA,EAASlH,OAG1B,OAAOkH,EAAS,EACpB,CAjBkCM,GAC9B,GAAKP,EAGL,OAcJH,eAAkCC,GAC9B,IACI,MAAMU,QAAa,YAAiBC,GAAGD,KAAKV,GAC5C,GAAIU,EAAKE,OAAS,WAAgBC,UAC9B,OAAOb,EAEX,GAAIU,EAAKE,OAAS,WAAgBE,KAC9B,OAAO,MAAWC,KAAK,UAAaf,EAAInC,QAEhD,CACA,MAAOlB,GACH,MAAME,EAAUF,aAAiBC,MAAQD,EAAME,QAAUC,OAAOH,GAChE,MAAM,IAAIC,MAAM,uCAAuCC,IAC3D,CACA,OAAOmD,CACX,CA7BWgB,CAAmBd,EAC9B,CArB0Ce,CAAuBjB,GACrD,IAAKC,EACD,aAgDhBF,eAA4BmB,GACxB,OAAO,SAAcC,aAAa,CAC9BC,SAAU,mBAAwBC,OAClCH,SAjDiDnB,gBACnCX,EAAU7B,mBAAmB0C,EAAiBR,EAAWhC,UAkD/E,CAnDkB0D,CAAa1B,EAAWF,eAG9B,SAAc+B,uBAAuB7B,EAAWD,eACpD,CACA,MAAO7C,GACH,MAAME,EAAUF,aAAiBC,MAAQD,EAAME,QAAUC,OAAOH,GAChE,SAAc4E,iBAAiB,gBAAgB1E,IACnD,GAER,C","sources":["../webpack/bootstrap","../webpack/runtime/define property getters","../webpack/runtime/hasOwnProperty shorthand","../webpack/runtime/make namespace object","../external node-commonjs \"path\"","../external commonjs \"vscode\"",".././src/core/services/barrel-content.builder.ts",".././src/core/services/export.parser.ts","../external node-commonjs \"fs/promises\"",".././src/core/services/file-system.service.ts",".././src/core/services/barrel-file.generator.ts",".././src/extension.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"path\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"vscode\");","const DEFAULT_KEYWORD = 'default';\nconst NEWLINE = '\\n';\nconst PARENT_DIRECTORY = '..';\nexport class BarrelContentBuilder {\n buildContent(entries, _directoryPath) {\n const lines = [];\n const normalizedEntries = this.normalizeEntries(entries);\n const sortedPaths = Array.from(normalizedEntries.keys()).sort();\n for (const relativePath of sortedPaths) {\n const entry = normalizedEntries.get(relativePath);\n if (!entry) {\n continue;\n }\n const exportLines = this.createLinesForEntry(relativePath, entry);\n if (exportLines.length > 0) {\n lines.push(...exportLines);\n }\n }\n return lines.join(NEWLINE) + NEWLINE;\n }\n normalizeEntries(entries) {\n const normalized = new Map();\n for (const [relativePath, entry] of entries) {\n if (Array.isArray(entry)) {\n normalized.set(relativePath, { kind: 'file', exports: entry });\n }\n else {\n normalized.set(relativePath, entry);\n }\n }\n return normalized;\n }\n createLinesForEntry(relativePath, entry) {\n if (entry.kind === 'directory') {\n return this.buildDirectoryExportLines(relativePath);\n }\n return this.buildFileExportLines(relativePath, entry.exports);\n }\n buildDirectoryExportLines(relativePath) {\n const modulePath = this.getModulePath(relativePath);\n if (modulePath.startsWith(PARENT_DIRECTORY)) {\n return [];\n }\n return [`export * from './${modulePath}';`];\n }\n buildFileExportLines(filePath, exports) {\n const cleanedExports = exports.filter((exp) => !exp.includes(PARENT_DIRECTORY));\n if (cleanedExports.length === 0) {\n return [];\n }\n const modulePath = this.getModulePath(filePath);\n if (modulePath.startsWith(PARENT_DIRECTORY)) {\n return [];\n }\n return this.generateExportStatements(modulePath, cleanedExports);\n }\n generateExportStatements(modulePath, exports) {\n const hasDefaultExport = exports.includes(DEFAULT_KEYWORD);\n const hasNamedExports = exports.some((exp) => exp !== DEFAULT_KEYWORD);\n if (hasDefaultExport && !hasNamedExports) {\n return [`export { default } from './${modulePath}';`];\n }\n const lines = [];\n if (hasNamedExports) {\n const namedExports = exports.filter((exp) => exp !== DEFAULT_KEYWORD);\n lines.push(`export { ${namedExports.join(', ')} } from './${modulePath}';`);\n }\n if (hasDefaultExport) {\n lines.push(`export { default } from './${modulePath}';`);\n }\n return lines;\n }\n getModulePath(filePath) {\n let modulePath = filePath.replace(/\\.tsx?$/, '');\n modulePath = modulePath.replace(/\\\\/g, '/');\n return modulePath;\n }\n}\n","export class ExportParser {\n extractExports(content) {\n const exports = [];\n const contentWithoutComments = this.removeComments(content);\n const namedExportPattern = /export\\s+(?:abstract\\s+)?(?:class|interface|type|function|const|enum|let|var)\\s+([A-Za-z_$][A-Za-z0-9_$]*)/g;\n let match;\n while ((match = namedExportPattern.exec(contentWithoutComments)) !== null) {\n exports.push(match[1]);\n }\n const exportListPattern = /export\\s*\\{([^}]+)\\}/g;\n while ((match = exportListPattern.exec(contentWithoutComments)) !== null) {\n const names = match[1]\n .split(',')\n .map((name) => name\n .trim()\n .split(/\\s+as\\s+/i)\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0)\n .pop() ?? '')\n .filter((name) => name.length > 0);\n exports.push(...names);\n }\n if (/export\\s+default\\s+/.test(contentWithoutComments)) {\n exports.push('default');\n }\n return [...new Set(exports)];\n }\n removeComments(content) {\n let result = content.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n result = result.replace(/\\/\\/.*$/gm, '');\n return result;\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"fs/promises\");","import * as fs from 'fs/promises';\nimport * as path from 'path';\nconst INDEX_FILE_NAME = 'index.ts';\nconst IGNORED_DIRECTORIES = new Set(['node_modules', '.git']);\nexport class FileSystemService {\n async getTypeScriptFiles(directoryPath) {\n const entries = await this.readDirectory(directoryPath);\n return entries\n .filter((entry) => this.isTypeScriptFile(entry))\n .map((entry) => path.join(directoryPath, entry.name));\n }\n async getSubdirectories(directoryPath) {\n const entries = await this.readDirectory(directoryPath);\n return entries\n .filter((entry) => this.isTraversableDirectory(entry))\n .map((entry) => path.join(directoryPath, entry.name));\n }\n isTypeScriptFile(entry) {\n if (!entry.isFile()) {\n return false;\n }\n const isIndexFile = entry.name === INDEX_FILE_NAME;\n const isDefinitionFile = entry.name.endsWith('.d.ts');\n const isTsFile = entry.name.endsWith('.ts') || entry.name.endsWith('.tsx');\n return isTsFile && !isIndexFile && !isDefinitionFile;\n }\n isTraversableDirectory(entry) {\n return (entry.isDirectory() && !IGNORED_DIRECTORIES.has(entry.name) && !entry.name.startsWith('.'));\n }\n async readFile(filePath) {\n try {\n return await fs.readFile(filePath, 'utf-8');\n }\n catch (error) {\n throw new Error(`Failed to read file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n async writeFile(filePath, content) {\n try {\n await fs.writeFile(filePath, content, 'utf-8');\n }\n catch (error) {\n throw new Error(`Failed to write file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n async fileExists(filePath) {\n try {\n await fs.access(filePath);\n return true;\n }\n catch {\n return false;\n }\n }\n async readDirectory(directoryPath) {\n try {\n return await fs.readdir(directoryPath, { withFileTypes: true });\n }\n catch (error) {\n throw new Error(`Failed to read directory: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n}\n","import * as path from 'path';\nimport { BarrelContentBuilder } from './barrel-content.builder';\nimport { ExportParser } from './export.parser';\nimport { FileSystemService } from './file-system.service';\nconst INDEX_FILE_NAME = 'index.ts';\nexport class BarrelFileGenerator {\n fileSystemService;\n exportParser;\n barrelContentBuilder;\n constructor(fileSystemService, exportParser, barrelContentBuilder) {\n this.fileSystemService = fileSystemService || new FileSystemService();\n this.exportParser = exportParser || new ExportParser();\n this.barrelContentBuilder = barrelContentBuilder || new BarrelContentBuilder();\n }\n async generateBarrelFile(directoryUri, options) {\n const normalizedOptions = this.normalizeOptions(options);\n await this.generateBarrelFileFromPath(directoryUri.fsPath, normalizedOptions);\n }\n async generateBarrelFileFromPath(directoryPath, options) {\n const barrelFilePath = path.join(directoryPath, INDEX_FILE_NAME);\n const { tsFiles, subdirectories } = await this.readDirectoryInfo(directoryPath);\n if (options.recursive) {\n await this.processChildDirectories(subdirectories, options);\n }\n const entries = await this.collectEntries(directoryPath, tsFiles, subdirectories);\n const hasExistingIndex = await this.fileSystemService.fileExists(barrelFilePath);\n if (!this.shouldWriteBarrel(entries, options, hasExistingIndex)) {\n return;\n }\n const barrelContent = this.barrelContentBuilder.buildContent(entries, directoryPath);\n await this.fileSystemService.writeFile(barrelFilePath, barrelContent);\n }\n async readDirectoryInfo(directoryPath) {\n const [tsFiles, subdirectories] = await Promise.all([\n this.fileSystemService.getTypeScriptFiles(directoryPath),\n this.fileSystemService.getSubdirectories(directoryPath),\n ]);\n return { tsFiles, subdirectories };\n }\n async processChildDirectories(subdirectories, options) {\n for (const subdirectoryPath of subdirectories) {\n if (options.mode === 'updateExisting' &&\n !(await this.fileSystemService.fileExists(path.join(subdirectoryPath, INDEX_FILE_NAME)))) {\n continue;\n }\n await this.generateBarrelFileFromPath(subdirectoryPath, options);\n }\n }\n async collectEntries(directoryPath, tsFiles, subdirectories) {\n const entries = new Map();\n await this.addFileEntries(directoryPath, tsFiles, entries);\n await this.addSubdirectoryEntries(directoryPath, subdirectories, entries);\n return entries;\n }\n async addFileEntries(directoryPath, tsFiles, entries) {\n for (const filePath of tsFiles) {\n const content = await this.fileSystemService.readFile(filePath);\n const exports = this.exportParser.extractExports(content);\n if (exports.length === 0) {\n continue;\n }\n const relativePath = path.relative(directoryPath, filePath);\n entries.set(relativePath, { kind: 'file', exports });\n }\n }\n async addSubdirectoryEntries(directoryPath, subdirectories, entries) {\n for (const subdirectoryPath of subdirectories) {\n const barrelPath = path.join(subdirectoryPath, INDEX_FILE_NAME);\n if (!(await this.fileSystemService.fileExists(barrelPath))) {\n continue;\n }\n const relativePath = path.relative(directoryPath, subdirectoryPath);\n entries.set(relativePath, { kind: 'directory' });\n }\n }\n shouldWriteBarrel(entries, options, hasExistingIndex) {\n if (entries.size > 0) {\n return true;\n }\n if (options.mode === 'updateExisting') {\n return hasExistingIndex;\n }\n if (!options.recursive) {\n throw new Error('No TypeScript files found in the selected directory');\n }\n return hasExistingIndex;\n }\n normalizeOptions(options) {\n return {\n recursive: options?.recursive ?? false,\n mode: options?.mode ?? 'createOrUpdate',\n };\n }\n}\n","import * as path from 'path';\nimport * as vscode from 'vscode';\nimport { BarrelFileGenerator, } from './core/services/barrel-file.generator';\nexport function activate(context) {\n console.log('Barrel Roll extension is now active');\n const generator = new BarrelFileGenerator();\n const descriptors = [\n {\n id: 'barrel-roll.generateBarrel',\n options: { recursive: false, mode: 'createOrUpdate' },\n progressTitle: 'Barrel Roll: Generating barrel...',\n successMessage: 'Barrel Roll: barrel file generated successfully.',\n },\n {\n id: 'barrel-roll.generateBarrelRecursive',\n options: { recursive: true, mode: 'createOrUpdate' },\n progressTitle: 'Barrel Roll: Generating barrels recursively...',\n successMessage: 'Barrel Roll: barrel files generated recursively.',\n },\n {\n id: 'barrel-roll.updateBarrel',\n options: { recursive: true, mode: 'updateExisting' },\n progressTitle: 'Barrel Roll: Updating barrels...',\n successMessage: 'Barrel Roll: barrel files sanitized successfully.',\n },\n ];\n for (const descriptor of descriptors) {\n const disposable = registerBarrelCommand(generator, descriptor);\n context.subscriptions.push(disposable);\n }\n}\nexport function deactivate() { }\nfunction registerBarrelCommand(generator, descriptor) {\n return vscode.commands.registerCommand(descriptor.id, async (uri) => {\n try {\n const targetDirectory = await resolveTargetDirectory(uri);\n if (!targetDirectory) {\n return;\n }\n await withProgress(descriptor.progressTitle, async () => {\n await generator.generateBarrelFile(targetDirectory, descriptor.options);\n });\n vscode.window.showInformationMessage(descriptor.successMessage);\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n vscode.window.showErrorMessage(`Barrel Roll: ${message}`);\n }\n });\n}\nasync function resolveTargetDirectory(uri) {\n const initial = uri ?? (await promptForDirectory());\n if (!initial) {\n return undefined;\n }\n return ensureDirectoryUri(initial);\n}\nasync function promptForDirectory() {\n const selected = await vscode.window.showOpenDialog({\n canSelectFiles: false,\n canSelectFolders: true,\n canSelectMany: false,\n openLabel: 'Select folder to barrel',\n });\n if (!selected || selected.length === 0) {\n return undefined;\n }\n return selected[0];\n}\nasync function ensureDirectoryUri(uri) {\n try {\n const stat = await vscode.workspace.fs.stat(uri);\n if (stat.type === vscode.FileType.Directory) {\n return uri;\n }\n if (stat.type === vscode.FileType.File) {\n return vscode.Uri.file(path.dirname(uri.fsPath));\n }\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Unable to access selected resource: ${message}`);\n }\n return uri;\n}\nasync function withProgress(title, task) {\n return vscode.window.withProgress({\n location: vscode.ProgressLocation.Window,\n title,\n }, task);\n}\n"],"names":["__webpack_require__","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","require","DEFAULT_KEYWORD","PARENT_DIRECTORY","BarrelContentBuilder","buildContent","entries","_directoryPath","lines","normalizedEntries","this","normalizeEntries","sortedPaths","Array","from","keys","sort","relativePath","entry","exportLines","createLinesForEntry","length","push","join","normalized","Map","isArray","set","kind","buildDirectoryExportLines","buildFileExportLines","modulePath","getModulePath","startsWith","filePath","cleanedExports","filter","exp","includes","generateExportStatements","hasDefaultExport","hasNamedExports","some","namedExports","replace","ExportParser","extractExports","content","contentWithoutComments","removeComments","namedExportPattern","match","exec","exportListPattern","names","split","map","name","trim","segment","pop","test","Set","result","IGNORED_DIRECTORIES","FileSystemService","getTypeScriptFiles","directoryPath","readDirectory","isTypeScriptFile","getSubdirectories","isTraversableDirectory","isFile","isIndexFile","isDefinitionFile","endsWith","isDirectory","has","readFile","error","Error","message","String","writeFile","fileExists","withFileTypes","BarrelFileGenerator","fileSystemService","exportParser","barrelContentBuilder","constructor","generateBarrelFile","directoryUri","options","normalizedOptions","normalizeOptions","generateBarrelFileFromPath","fsPath","barrelFilePath","tsFiles","subdirectories","readDirectoryInfo","recursive","processChildDirectories","collectEntries","hasExistingIndex","shouldWriteBarrel","barrelContent","Promise","all","subdirectoryPath","mode","addFileEntries","addSubdirectoryEntries","barrelPath","size","activate","context","console","log","generator","descriptors","id","progressTitle","successMessage","descriptor","disposable","registerBarrelCommand","subscriptions","deactivate","registerCommand","async","uri","targetDirectory","initial","selected","showOpenDialog","canSelectFiles","canSelectFolders","canSelectMany","openLabel","promptForDirectory","stat","fs","type","Directory","File","file","ensureDirectoryUri","resolveTargetDirectory","title","withProgress","location","Window","showInformationMessage","showErrorMessage"],"sourceRoot":""} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs index 06f8062..580a3c6 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -10,6 +10,7 @@ import tsParser from '@typescript-eslint/parser'; import _import from 'eslint-plugin-import'; import jest from 'eslint-plugin-jest'; import prettier from 'eslint-plugin-prettier'; +import simpleImportSort from 'eslint-plugin-simple-import-sort'; import sonarjs from 'eslint-plugin-sonarjs'; import globals from 'globals'; @@ -64,6 +65,7 @@ export default [ plugins: { '@typescript-eslint': typescriptEslint, import: _import, + 'simple-import-sort': simpleImportSort, sonarjs, }, settings: { @@ -113,26 +115,9 @@ export default [ '@typescript-eslint/no-duplicate-type-constituents': 'error', // Import sorting and organization - 'import/order': [ - 'error', - { - groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'], - 'newlines-between': 'always', - alphabetize: { - order: 'asc', - caseInsensitive: true, - }, - }, - ], - 'sort-imports': [ - 'error', - { - ignoreCase: true, - ignoreDeclarationSort: true, - ignoreMemberSort: false, - memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'], - }, - ], + 'import/order': 'off', + 'simple-import-sort/imports': 'error', + 'simple-import-sort/exports': 'error', // Custom overrides camelcase: 'off', @@ -175,6 +160,8 @@ export default [ '@typescript-eslint/unbound-method': 'off', '@typescript-eslint/require-await': 'off', 'sonarjs/publicly-writable-directories': 'off', + 'simple-import-sort/imports': 'off', + 'simple-import-sort/exports': 'off', }, }, @@ -206,6 +193,8 @@ export default [ 'jest/expect-expect': 'off', complexity: 'off', 'sonarjs/cognitive-complexity': 'off', + 'simple-import-sort/imports': 'off', + 'simple-import-sort/exports': 'off', }, }, diff --git a/package-lock.json b/package-lock.json index 7d73f4b..2cc6a06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,24 +13,22 @@ }, "devDependencies": { "@jest/globals": "^29.7.0", - "@rollup/plugin-node-resolve": "^16.0.0", - "@rollup/plugin-terser": "^0.4.4", - "@rollup/plugin-typescript": "^12.1.2", "@types/glob": "^8.1.0", "@types/jest": "^29.5.14", "@types/mocha": "^10.0.1", "@types/node": "^22.x", "@types/vscode": "^1.80.0", - "@typescript-eslint/eslint-plugin": "^8.23.0", - "@typescript-eslint/parser": "^8.23.0", + "@typescript-eslint/eslint-plugin": "^8.24.0", + "@typescript-eslint/parser": "^8.24.0", "@vscode/test-electron": "^2.3.4", "cross-env": "^10.1.0", "dependency-cruiser": "^17.1.0", - "eslint": "^9.20.0", - "eslint-import-resolver-typescript": "^3.7.0", + "eslint": "^9.21.0", + "eslint-import-resolver-typescript": "^3.8.0", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jest": "^28.11.0", "eslint-plugin-prettier": "^5.2.3", + "eslint-plugin-simple-import-sort": "^12.1.0", "eslint-plugin-sonarjs": "^3.0.5", "eslint-plugin-unused-imports": "^4.2.0", "glob": "^10.3.3", @@ -40,7 +38,6 @@ "make-coverage-badge": "^1.2.0", "mocha": "^10.2.0", "prettier": "^3.5.0", - "rollup": "^4.34.6", "ts-jest": "^29.2.5", "ts-loader": "^9.4.4", "ts-morph": "^27.0.2", @@ -1687,425 +1684,6 @@ "url": "https://opencollective.com/pkgr" } }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz", - "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-terser": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", - "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "serialize-javascript": "^6.0.1", - "smob": "^1.0.0", - "terser": "^5.17.4" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-typescript": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.4.tgz", - "integrity": "sha512-s5Hx+EtN60LMlDBvl5f04bEiFZmAepk27Q+mr85L/00zPDn1jtzlTV6FWn81MaIwqfWzKxmOJrBWHU6vtQyedQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.1.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.14.0||^3.0.0||^4.0.0", - "tslib": "*", - "typescript": ">=3.7.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - }, - "tslib": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", - "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", - "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", - "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", - "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", - "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", - "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", - "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", - "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", - "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", - "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", - "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", - "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", - "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", - "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", - "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", - "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", - "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", - "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", - "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", - "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", - "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", - "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", - "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -2468,13 +2046,6 @@ "undici-types": "~6.21.0" } }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/sarif": { "version": "2.1.7", "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", @@ -5777,6 +5348,16 @@ } } }, + "node_modules/eslint-plugin-simple-import-sort": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz", + "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, "node_modules/eslint-plugin-sonarjs": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-3.0.5.tgz", @@ -7386,13 +6967,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true, - "license": "MIT" - }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -11021,48 +10595,6 @@ "node": ">=0.10.0" } }, - "node_modules/rollup": { - "version": "4.52.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", - "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.4", - "@rollup/rollup-android-arm64": "4.52.4", - "@rollup/rollup-darwin-arm64": "4.52.4", - "@rollup/rollup-darwin-x64": "4.52.4", - "@rollup/rollup-freebsd-arm64": "4.52.4", - "@rollup/rollup-freebsd-x64": "4.52.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", - "@rollup/rollup-linux-arm-musleabihf": "4.52.4", - "@rollup/rollup-linux-arm64-gnu": "4.52.4", - "@rollup/rollup-linux-arm64-musl": "4.52.4", - "@rollup/rollup-linux-loong64-gnu": "4.52.4", - "@rollup/rollup-linux-ppc64-gnu": "4.52.4", - "@rollup/rollup-linux-riscv64-gnu": "4.52.4", - "@rollup/rollup-linux-riscv64-musl": "4.52.4", - "@rollup/rollup-linux-s390x-gnu": "4.52.4", - "@rollup/rollup-linux-x64-gnu": "4.52.4", - "@rollup/rollup-linux-x64-musl": "4.52.4", - "@rollup/rollup-openharmony-arm64": "4.52.4", - "@rollup/rollup-win32-arm64-msvc": "4.52.4", - "@rollup/rollup-win32-ia32-msvc": "4.52.4", - "@rollup/rollup-win32-x64-gnu": "4.52.4", - "@rollup/rollup-win32-x64-msvc": "4.52.4", - "fsevents": "~2.3.2" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -11508,13 +11040,6 @@ "integrity": "sha512-MseHyi2+E/hBRqdOi5COy6wZ7j7DxXRz9NkseavNYSvvWC06D8a5cidVZX3tcG5eCW3NIyVU4zT63hw0Q486jw==", "license": "MIT" }, - "node_modules/smob": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", - "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", - "dev": true, - "license": "MIT" - }, "node_modules/sonic-boom": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", diff --git a/package.json b/package.json index 9cc761e..d60d99e 100644 --- a/package.json +++ b/package.json @@ -63,26 +63,24 @@ "description": "Automatically export types, functions, constants, and classes through barrel files", "devDependencies": { "@jest/globals": "^29.7.0", - "@rollup/plugin-node-resolve": "^16.0.0", - "@rollup/plugin-terser": "^0.4.4", - "@rollup/plugin-typescript": "^12.1.2", "@types/glob": "^8.1.0", "@types/jest": "^29.5.14", "@types/mocha": "^10.0.1", "@types/node": "^22.x", "@types/vscode": "^1.80.0", - "@typescript-eslint/eslint-plugin": "^8.23.0", - "@typescript-eslint/parser": "^8.23.0", + "@typescript-eslint/eslint-plugin": "^8.24.0", + "@typescript-eslint/parser": "^8.24.0", "@vscode/test-electron": "^2.3.4", "cross-env": "^10.1.0", "dependency-cruiser": "^17.1.0", - "eslint": "^9.20.0", - "eslint-import-resolver-typescript": "^3.7.0", + "eslint": "^9.21.0", + "eslint-import-resolver-typescript": "^3.8.0", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jest": "^28.11.0", "eslint-plugin-prettier": "^5.2.3", "eslint-plugin-sonarjs": "^3.0.5", "eslint-plugin-unused-imports": "^4.2.0", + "eslint-plugin-simple-import-sort": "^12.1.0", "glob": "^10.3.3", "jest": "^29.7.0", "jscpd": "^4.0.5", @@ -90,7 +88,6 @@ "make-coverage-badge": "^1.2.0", "mocha": "^10.2.0", "prettier": "^3.5.0", - "rollup": "^4.34.6", "ts-jest": "^29.2.5", "ts-loader": "^9.4.4", "ts-morph": "^27.0.2", diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index f6805ae..0000000 --- a/rollup.config.js +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import nodeResolve from '@rollup/plugin-node-resolve'; -import typescript from '@rollup/plugin-typescript'; -import terser from '@rollup/plugin-terser'; - -/** - * @typedef {Object} RollupWarning - * @property {string} code - * @property {string[]} [ids] - */ - -const config = { - input: 'src/index.ts', - external: (id) => { - // Keep all pino* as external for smaller bundle - return id.startsWith('pino'); - }, - /** - * @param {RollupWarning} warning - * @param {(warning: RollupWarning) => void} warn - */ - onwarn: (warning, warn) => { - // Ignore circular dependency warnings from third-party modules - if ( - warning.code === 'CIRCULAR_DEPENDENCY' && - warning.ids?.some((id) => id.includes('node_modules')) - ) { - return; - } - warn(warning); - }, - output: { - file: 'out/index.mjs', - format: 'es', - esModule: true, - sourcemap: false, - compact: true, - minifyInternalExports: true, - }, - plugins: [ - typescript({ - tsconfig: './tsconfig.json', - }), - nodeResolve({ - preferBuiltins: true, - exportConditions: ['node'], - modulesOnly: true, - }), - terser({ - format: { - comments: false, - }, - compress: { - drop_console: false, // Keep console for runtime logging - drop_debugger: true, - pure_funcs: ['console.debug'], - }, - }), - ], -}; - -export default config; diff --git a/src/core/services/barrel-file.generator.ts b/src/core/services/barrel-file.generator.ts index cec9337..7f82d73 100644 --- a/src/core/services/barrel-file.generator.ts +++ b/src/core/services/barrel-file.generator.ts @@ -1,5 +1,4 @@ import * as path from 'path'; - import type { Uri } from 'vscode'; import { BarrelContentBuilder, BarrelEntry } from './barrel-content.builder'; diff --git a/src/extension.ts b/src/extension.ts index a9cde2a..8f31438 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,5 +1,4 @@ import * as path from 'path'; - import * as vscode from 'vscode'; import { diff --git a/src/logging/config.ts b/src/logging/config.ts index db55c14..1d7e18e 100644 --- a/src/logging/config.ts +++ b/src/logging/config.ts @@ -18,7 +18,6 @@ import * as pino from 'pino'; import type { IEnvironmentVariables } from '../types/env.js'; - import { IPinoLoggerConfig } from './pino/types.js'; /** diff --git a/src/logging/index.ts b/src/logging/index.ts index bbd60af..ad4eb74 100644 --- a/src/logging/index.ts +++ b/src/logging/index.ts @@ -16,8 +16,8 @@ */ // Export types -export * from './types.js'; export * from './pino/types.js'; +export * from './types.js'; // Export loggers export * from './loggers/index.js'; diff --git a/src/logging/loggers/factory.ts b/src/logging/loggers/factory.ts index 3aebed1..f5e79de 100644 --- a/src/logging/loggers/factory.ts +++ b/src/logging/loggers/factory.ts @@ -19,7 +19,6 @@ import pino from 'pino'; import { PinoLogger } from '../pino/logger.js'; import { LogLevel } from '../types.js'; - import { CompositeLogger } from './composite.js'; /** diff --git a/src/test/runTest.ts b/src/test/runTest.ts index 8dc4804..9cdb824 100644 --- a/src/test/runTest.ts +++ b/src/test/runTest.ts @@ -1,9 +1,8 @@ +import { runTests } from '@vscode/test-electron'; import * as os from 'os'; import * as path from 'path'; import { fileURLToPath } from 'url'; -import { runTests } from '@vscode/test-electron'; - async function main(): Promise { try { const shouldSkipTests = shouldSkipVscodeTests(); diff --git a/webpack.config.cjs b/webpack.config.cjs index 5addf1e..c4b3eaa 100644 --- a/webpack.config.cjs +++ b/webpack.config.cjs @@ -8,6 +8,7 @@ const path = require('path'); const config = { target: 'node', entry: './src/extension.ts', + mode: 'production', output: { path: path.resolve(__dirname, 'out'), filename: 'extension.js', @@ -20,6 +21,9 @@ const config = { }, resolve: { extensions: ['.ts', '.js'], + extensionAlias: { + '.js': ['.ts', '.js'], + }, }, module: { rules: [ From d1d96055f5faff99b570ca7a6919f0ab251b8aa1 Mon Sep 17 00:00:00 2001 From: coderrob Date: Sun, 19 Oct 2025 20:13:22 -0500 Subject: [PATCH 09/20] refactor: remove unused logger and math utility files --- test-project/src/utils/logger.ts | 7 ------- test-project/src/utils/math.ts | 7 ------- 2 files changed, 14 deletions(-) delete mode 100644 test-project/src/utils/logger.ts delete mode 100644 test-project/src/utils/math.ts diff --git a/test-project/src/utils/logger.ts b/test-project/src/utils/logger.ts deleted file mode 100644 index 6d3fbd8..0000000 --- a/test-project/src/utils/logger.ts +++ /dev/null @@ -1,7 +0,0 @@ -export class Logger { - log(message: string): void { - console.log(`[LOG] ${message}`); - } -} - -export const PI = 3.14159; diff --git a/test-project/src/utils/math.ts b/test-project/src/utils/math.ts deleted file mode 100644 index 341e651..0000000 --- a/test-project/src/utils/math.ts +++ /dev/null @@ -1,7 +0,0 @@ -export function add(a: number, b: number): number { - return a + b; -} - -export function multiply(a: number, b: number): number { - return a * b; -} From e1db6f7e6d20ad82bb0cb2c8c949d68cdc6f4311 Mon Sep 17 00:00:00 2001 From: coderrob Date: Tue, 21 Oct 2025 15:49:03 -0500 Subject: [PATCH 10/20] refactor: remove logging implementations and types - Deleted the following logger implementations: MetricsLogger, MockLogger, NoopLogger. - Removed related types and interfaces from the logging module. - Updated PinoLogger to handle logging without relying on removed implementations. - Adjusted tests to reflect changes in export handling and logging behavior. - Introduced a test harness for improved testing capabilities. --- .vscode/extensions.json | 5 +- .vscode/launch.json | 13 +- .vscode/tasks.json | 5 +- badges/coverage.svg | 2 +- package.json | 17 +- .../services/barrel-content.builder.test.ts | 125 +++++- .../services/barrel-file.generator.test.ts | 132 +++--- .../core/services/export.parser.test.ts | 58 ++- .../core/services/file-system.service.test.ts | 70 ++-- src/__tests__/filters/log-filters.test.ts | 144 ------- .../loggers/composite.logger.test.ts | 179 -------- src/__tests__/loggers/filtered.logger.test.ts | 382 ------------------ .../loggers/logger-config.resolver.test.ts | 181 --------- src/__tests__/loggers/logger.factory.test.ts | 39 -- src/__tests__/loggers/metrics.logger.test.ts | 134 ------ src/__tests__/loggers/mock.logger.test.ts | 179 -------- src/__tests__/loggers/noop.logger.test.ts | 96 ----- src/__tests__/loggers/pino.logger.test.ts | 171 -------- src/core/services/barrel-content.builder.ts | 84 +++- src/core/services/barrel-file.generator.ts | 32 +- src/core/services/export.parser.ts | 121 ++++-- src/extension.ts | 14 +- src/logging/config.ts | 153 ------- src/logging/filters/index.ts | 19 - src/logging/filters/log-filters.ts | 100 ----- src/logging/index.ts | 16 +- src/logging/loggers/composite.ts | 173 -------- src/logging/loggers/factory.ts | 78 ---- src/logging/loggers/filtered.ts | 219 ---------- src/logging/loggers/index.ts | 26 -- src/logging/loggers/metrics.ts | 261 ------------ src/logging/loggers/mock.ts | 186 --------- src/logging/loggers/noop.ts | 111 ----- src/logging/pino/index.ts | 4 - src/logging/pino/logger.ts | 48 ++- src/logging/pino/types.ts | 38 -- src/logging/types.ts | 249 ------------ src/test-utils/testHarness.ts | 195 +++++++++ src/test/suite/barrel-content.builder.test.ts | 23 +- src/test/suite/barrel-file.generator.test.ts | 6 +- src/test/suite/export.parser.test.ts | 30 +- 41 files changed, 725 insertions(+), 3393 deletions(-) delete mode 100644 src/__tests__/filters/log-filters.test.ts delete mode 100644 src/__tests__/loggers/composite.logger.test.ts delete mode 100644 src/__tests__/loggers/filtered.logger.test.ts delete mode 100644 src/__tests__/loggers/logger-config.resolver.test.ts delete mode 100644 src/__tests__/loggers/logger.factory.test.ts delete mode 100644 src/__tests__/loggers/metrics.logger.test.ts delete mode 100644 src/__tests__/loggers/mock.logger.test.ts delete mode 100644 src/__tests__/loggers/noop.logger.test.ts delete mode 100644 src/__tests__/loggers/pino.logger.test.ts delete mode 100644 src/logging/config.ts delete mode 100644 src/logging/filters/index.ts delete mode 100644 src/logging/filters/log-filters.ts delete mode 100644 src/logging/loggers/composite.ts delete mode 100644 src/logging/loggers/factory.ts delete mode 100644 src/logging/loggers/filtered.ts delete mode 100644 src/logging/loggers/index.ts delete mode 100644 src/logging/loggers/metrics.ts delete mode 100644 src/logging/loggers/mock.ts delete mode 100644 src/logging/loggers/noop.ts delete mode 100644 src/logging/pino/types.ts delete mode 100644 src/logging/types.ts create mode 100644 src/test-utils/testHarness.ts diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 7efca3f..1d7ac85 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,6 +1,3 @@ { - "recommendations": [ - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode" - ] + "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"] } diff --git a/.vscode/launch.json b/.vscode/launch.json index 226c739..107ac44 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,13 +5,8 @@ "name": "Run Extension", "type": "extensionHost", "request": "launch", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}" - ], - "outFiles": [ - "${workspaceFolder}/out/**/*.js", - "${workspaceFolder}/dist/**/*.js" - ], + "args": ["--extensionDevelopmentPath=${workspaceFolder}"], + "outFiles": ["${workspaceFolder}/out/**/*.js", "${workspaceFolder}/dist/**/*.js"], "preLaunchTask": "${defaultBuildTask}" }, { @@ -22,9 +17,7 @@ "--extensionDevelopmentPath=${workspaceFolder}", "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" ], - "outFiles": [ - "${workspaceFolder}/out/test/**/*.js" - ], + "outFiles": ["${workspaceFolder}/out/test/**/*.js"], "preLaunchTask": "npm: watch-tests" } ] diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 372b4d8..ff464f1 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -25,10 +25,7 @@ }, { "label": "tasks: watch-tests", - "dependsOn": [ - "npm: watch", - "npm: watch-tests" - ], + "dependsOn": ["npm: watch", "npm: watch-tests"], "problemMatcher": [] } ] diff --git a/badges/coverage.svg b/badges/coverage.svg index 228afd6..a1823ef 100644 --- a/badges/coverage.svg +++ b/badges/coverage.svg @@ -1 +1 @@ -Coverage: 94.16%Coverage94.16% \ No newline at end of file +Coverage: 84.88%Coverage84.88% \ No newline at end of file diff --git a/package.json b/package.json index d60d99e..4403f54 100644 --- a/package.json +++ b/package.json @@ -12,15 +12,11 @@ "commands": [ { "command": "barrel-roll.generateBarrel", - "title": "Barrel Roll: Generate/Update index.ts" + "title": "Barrel Roll: Update Barrel Directory" }, { "command": "barrel-roll.generateBarrelRecursive", - "title": "Barrel Roll: Generate/Update index.ts (Recursive)" - }, - { - "command": "barrel-roll.updateBarrel", - "title": "Barrel Roll: Update Existing index.ts Files" + "title": "Barrel Roll: Update Barrel Directory (Recursive)" } ], "menus": { @@ -32,10 +28,6 @@ { "command": "barrel-roll.generateBarrelRecursive", "when": "true" - }, - { - "command": "barrel-roll.updateBarrel", - "when": "true" } ], "explorer/context": [ @@ -48,11 +40,6 @@ "command": "barrel-roll.generateBarrelRecursive", "group": "navigation@2", "when": "explorerResourceIsFolder" - }, - { - "command": "barrel-roll.updateBarrel", - "group": "navigation@3", - "when": "explorerResourceIsFolder" } ] } diff --git a/src/__tests__/core/services/barrel-content.builder.test.ts b/src/__tests__/core/services/barrel-content.builder.test.ts index 7f483be..104cc03 100644 --- a/src/__tests__/core/services/barrel-content.builder.test.ts +++ b/src/__tests__/core/services/barrel-content.builder.test.ts @@ -1,24 +1,109 @@ -import { BarrelContentBuilder, BarrelEntry } from '../../../core/services/barrel-content.builder'; +import { + BarrelContentBuilder, + BarrelEntry, + BarrelEntryKind, + BarrelExportKind, +} from '../../../core/services/barrel-content.builder'; describe('BarrelContentBuilder', () => { - it('builds export statements for files and nested directories', () => { - const builder = new BarrelContentBuilder(); - const entries = new Map(); - - entries.set('alpha.ts', { kind: 'file', exports: ['Alpha'] }); - entries.set('beta.ts', { kind: 'file', exports: ['Bravo', 'default'] }); - entries.set('nested', { kind: 'directory' }); - - const source = builder.buildContent(entries, ''); - - expect(source).toBe( - [ - "export { Alpha } from './alpha';", - "export { Bravo } from './beta';", - "export { default } from './beta';", - "export * from './nested';", - '', - ].join('\n'), - ); + let builder: BarrelContentBuilder; + + beforeEach(() => { + builder = new BarrelContentBuilder(); + }); + + describe('buildContent', () => { + it('should build export statements for files and nested directories', () => { + const entries = new Map(); + + entries + .set('alpha.ts', { + kind: BarrelEntryKind.File, + exports: [{ kind: BarrelExportKind.Value, name: 'Alpha' }], + }) + .set('beta.ts', { + kind: BarrelEntryKind.File, + exports: [ + { kind: BarrelExportKind.Type, name: 'Bravo' }, + { kind: BarrelExportKind.Default }, + ], + }) + .set('nested', { kind: BarrelEntryKind.Directory }); + + const source = builder.buildContent(entries, ''); + + expect(source).toBe( + [ + "export { Alpha } from './alpha';", + "export type { Bravo } from './beta';", + "export { default } from './beta';", + "export * from './nested';", + '', + ].join('\n'), + ); + }); + + // Table-driven tests omit per-case descriptions; add standalone tests when a case needs custom messaging. + const buildContentCases: Array<{ entries: Map; expected: string }> = [ + { + entries: new Map([ + [ + 'gamma.ts', + { + kind: BarrelEntryKind.File, + exports: [{ kind: BarrelExportKind.Value, name: 'Gamma' }], + }, + ], + ]), + expected: "export { Gamma } from './gamma';", + }, + { + entries: new Map([ + [ + 'types.ts', + { + kind: BarrelEntryKind.File, + exports: [{ kind: BarrelExportKind.Type, name: 'Types' }], + }, + ], + ]), + expected: "export type { Types } from './types';", + }, + ]; + + it.each(buildContentCases)('should build expected output %#', ({ entries, expected }) => { + const result = builder.buildContent(entries, ''); + + expect(result.trim()).toBe(expected); + }); + + it('should build output for legacy entry arrays', () => { + const entries = new Map([['delta.ts', ['Delta', 'default']]]); + + const result = builder.buildContent(entries, ''); + + expect(result.trim()).toBe( + "export { Delta } from './delta';\nexport { default } from './delta';", + ); + }); + + const parentDirectoryCases: Array> = [ + new Map([['../outside', { kind: BarrelEntryKind.Directory }]]), + new Map([ + [ + '../outside.ts', + { + kind: BarrelEntryKind.File, + exports: [{ kind: BarrelExportKind.Value, name: '../Outside' }], + }, + ], + ]), + ]; + + it.each(parentDirectoryCases)('should ignore parent-directory entries %#', (entries) => { + const result = builder.buildContent(entries, ''); + + expect(result).toBe('\n'); + }); }); }); diff --git a/src/__tests__/core/services/barrel-file.generator.test.ts b/src/__tests__/core/services/barrel-file.generator.test.ts index 118df72..2a817d1 100644 --- a/src/__tests__/core/services/barrel-file.generator.test.ts +++ b/src/__tests__/core/services/barrel-file.generator.test.ts @@ -17,81 +17,95 @@ describe('BarrelFileGenerator', () => { await fs.rm(tmpDir, { recursive: true, force: true }); }); - it('generates recursive barrel files for nested directories', async () => { - const nestedDir = path.join(tmpDir, 'nested'); - const deeperDir = path.join(nestedDir, 'deeper'); + describe('generateBarrelFile', () => { + it('should generate recursive barrel files for nested directories', async () => { + const nestedDir = path.join(tmpDir, 'nested'); + const deeperDir = path.join(nestedDir, 'deeper'); - await fs.mkdir(deeperDir, { recursive: true }); + await fs.mkdir(deeperDir, { recursive: true }); - await fs.writeFile(path.join(tmpDir, 'alpha.ts'), 'export const alpha = 1;'); - await fs.writeFile( - path.join(nestedDir, 'bravo.ts'), - ` + await fs.writeFile(path.join(tmpDir, 'alpha.ts'), 'export const alpha = 1;'); + await fs.writeFile( + path.join(nestedDir, 'bravo.ts'), + ` export interface Bravo {} export default function bravo() {} `, - 'utf-8', - ); - await fs.writeFile( - path.join(deeperDir, 'charlie.ts'), - ` + 'utf-8', + ); + await fs.writeFile( + path.join(deeperDir, 'charlie.ts'), + ` export { default as charlie } from './impl'; `, - 'utf-8', - ); - await fs.writeFile( - path.join(deeperDir, 'impl.ts'), - 'export default function impl() {}', - 'utf-8', - ); - - const generator = new BarrelFileGenerator(); - const rootUri = { fsPath: tmpDir } as unknown as Uri; - await generator.generateBarrelFile(rootUri, { recursive: true }); - - const rootIndex = await fs.readFile(path.join(tmpDir, 'index.ts'), 'utf-8'); - const nestedIndex = await fs.readFile(path.join(nestedDir, 'index.ts'), 'utf-8'); - const deeperIndex = await fs.readFile(path.join(deeperDir, 'index.ts'), 'utf-8'); - - expect(rootIndex).toBe( - ["export { alpha } from './alpha';", "export * from './nested';", ''].join('\n'), - ); - - expect(nestedIndex).toBe( - [ - "export { Bravo } from './bravo';", - "export { default } from './bravo';", - "export * from './deeper';", + 'utf-8', + ); + await fs.writeFile( + path.join(deeperDir, 'impl.ts'), + 'export default function impl() {}', + 'utf-8', + ); + + const generator = new BarrelFileGenerator(); + const rootUri = { fsPath: tmpDir } as unknown as Uri; + await generator.generateBarrelFile(rootUri, { recursive: true }); + + const rootIndex = await fs.readFile(path.join(tmpDir, 'index.ts'), 'utf-8'); + const nestedIndex = await fs.readFile(path.join(nestedDir, 'index.ts'), 'utf-8'); + const deeperIndex = await fs.readFile(path.join(deeperDir, 'index.ts'), 'utf-8'); + + expect(rootIndex).toBe( + ["export { alpha } from './alpha';", "export * from './nested';", ''].join('\n'), + ); + + expect(nestedIndex).toBe( + [ + "export type { Bravo } from './bravo';", + "export { default } from './bravo';", + "export * from './deeper';", + '', + ].join('\n'), + ); + const expectedDeeperIndex = [ + "export { charlie } from './charlie';", + "export { default } from './impl';", '', - ].join('\n'), - ); + ].join('\n'); - expect(deeperIndex).toBe( - ["export { charlie } from './charlie';", "export { default } from './impl';", ''].join('\n'), - ); - }); + expect(deeperIndex).toBe(expectedDeeperIndex); + }); - it('sanitizes existing barrels when updating', async () => { - const generator = new BarrelFileGenerator(); - const rootUri = { fsPath: tmpDir } as unknown as Uri; + it('should sanitize existing barrels when updating', async () => { + const generator = new BarrelFileGenerator(); + const rootUri = { fsPath: tmpDir } as unknown as Uri; - await fs.writeFile(path.join(tmpDir, 'index.ts'), "export * from '../outside';", 'utf-8'); + await fs.writeFile(path.join(tmpDir, 'index.ts'), "export * from '../outside';", 'utf-8'); - await generator.generateBarrelFile(rootUri, { mode: 'updateExisting' }); + await generator.generateBarrelFile(rootUri, { mode: 'updateExisting' }); - const rootIndex = await fs.readFile(path.join(tmpDir, 'index.ts'), 'utf-8'); + const rootIndex = await fs.readFile(path.join(tmpDir, 'index.ts'), 'utf-8'); - expect(rootIndex).toBe('\n'); - }); + expect(rootIndex).toBe('\n'); + }); + + it('should skip creating barrels when updating non-existent ones', async () => { + const generator = new BarrelFileGenerator(); + const nestedDir = path.join(tmpDir, 'missing'); + await fs.mkdir(nestedDir); + + const nestedUri = { fsPath: nestedDir } as unknown as Uri; + await generator.generateBarrelFile(nestedUri, { mode: 'updateExisting' }); - it('skips creating barrels when updating non-existent ones', async () => { - const generator = new BarrelFileGenerator(); - const nestedDir = path.join(tmpDir, 'missing'); - await fs.mkdir(nestedDir); + await expect(fs.stat(path.join(nestedDir, 'index.ts'))).rejects.toThrow(); + }); - const nestedUri = { fsPath: nestedDir } as unknown as Uri; - await generator.generateBarrelFile(nestedUri, { mode: 'updateExisting' }); + it('should throw when no TypeScript files are present and recursion is disabled', async () => { + const generator = new BarrelFileGenerator(); + const emptyDirUri = { fsPath: tmpDir } as unknown as Uri; - await expect(fs.stat(path.join(nestedDir, 'index.ts'))).rejects.toThrow(); + await expect(generator.generateBarrelFile(emptyDirUri)).rejects.toThrow( + 'No TypeScript files found in the selected directory', + ); + }); }); }); diff --git a/src/__tests__/core/services/export.parser.test.ts b/src/__tests__/core/services/export.parser.test.ts index 0905f28..feb6344 100644 --- a/src/__tests__/core/services/export.parser.test.ts +++ b/src/__tests__/core/services/export.parser.test.ts @@ -1,17 +1,65 @@ import { ExportParser } from '../../../core/services/export.parser'; describe('ExportParser', () => { - it('captures named, default, and aliased exports', () => { - const parser = new ExportParser(); - const source = ` + let parser: ExportParser; + + beforeEach(() => { + parser = new ExportParser(); + }); + + describe('extractExports', () => { + it('should capture named, default, and aliased exports', () => { + const source = ` export const alpha = 1; export function bravo() {} export { charlie as delta, echo }; export default class Foxtrot {} + export interface Golf {} + export { type Hotel } `; - const result = parser.extractExports(source); + const result = parser.extractExports(source); + + expect(result).toEqual( + expect.arrayContaining([ + { name: 'alpha', typeOnly: false }, + { name: 'bravo', typeOnly: false }, + { name: 'delta', typeOnly: false }, + { name: 'echo', typeOnly: false }, + { name: 'default', typeOnly: false }, + { name: 'Golf', typeOnly: true }, + { name: 'Hotel', typeOnly: true }, + ]), + ); + expect(result).toHaveLength(7); + }); + + it('should return an empty array when no exports exist', () => { + const result = parser.extractExports('const unused = 1;'); + + expect(result).toEqual([]); + }); + + const extractCases: Array<{ source: string; expected: { name: string; typeOnly: boolean } }> = [ + { + source: 'export default function alpha() {}', + expected: { name: 'default', typeOnly: false }, + }, + { + source: 'export type { Bravo }', + expected: { name: 'Bravo', typeOnly: true }, + }, + { + source: 'export const charlie = 3;', + expected: { name: 'charlie', typeOnly: false }, + }, + ]; + + // Table-driven tests follow the convention of omitting human-readable titles; prefer standalone tests when unique naming is needed. + it.each(extractCases)('should capture simple export pattern %#', ({ source, expected }) => { + const result = parser.extractExports(source); - expect(result.sort()).toEqual(['alpha', 'bravo', 'delta', 'echo', 'default'].sort()); + expect(result).toContainEqual(expected); + }); }); }); diff --git a/src/__tests__/core/services/file-system.service.test.ts b/src/__tests__/core/services/file-system.service.test.ts index ed72e6f..969ded0 100644 --- a/src/__tests__/core/services/file-system.service.test.ts +++ b/src/__tests__/core/services/file-system.service.test.ts @@ -53,21 +53,27 @@ describe('FileSystemService', () => { expect(mockFs.readdir).toHaveBeenCalledWith(directoryPath, { withFileTypes: true }); }); - it.each<[string, Dirent, boolean]>([ - ['include .ts files', createFileEntry('alpha.ts'), true], - ['include .tsx files', createFileEntry('component.tsx'), true], - ['exclude index.ts', createFileEntry('index.ts'), false], - ['exclude definition files', createFileEntry('types.d.ts'), false], - ['exclude non-TypeScript extensions', createFileEntry('main.js'), false], - ['exclude directory entries', createDirectoryEntry('nested'), false], - ])('should %s', async (_description: string, entry: Dirent, shouldInclude: boolean) => { - mockFs.readdir.mockResolvedValue([entry] as never); - - const result = await service.getTypeScriptFiles(directoryPath); - - const expectedPath = path.join(directoryPath, entry.name); - expect(result).toEqual(shouldInclude ? [expectedPath] : []); - }); + const typeScriptEntryCases: Array<{ entry: Dirent; shouldInclude: boolean }> = [ + { entry: createFileEntry('alpha.ts'), shouldInclude: true }, + { entry: createFileEntry('component.tsx'), shouldInclude: true }, + { entry: createFileEntry('index.ts'), shouldInclude: false }, + { entry: createFileEntry('types.d.ts'), shouldInclude: false }, + { entry: createFileEntry('main.js'), shouldInclude: false }, + { entry: createDirectoryEntry('nested'), shouldInclude: false }, + ]; + + // Data-table cases omit natural language labels per team convention; add individual tests when additional context is needed. + it.each(typeScriptEntryCases)( + 'should handle TypeScript entry filtering %#', + async ({ entry, shouldInclude }) => { + mockFs.readdir.mockResolvedValue([entry] as never); + + const result = await service.getTypeScriptFiles(directoryPath); + + const expectedPath = path.join(directoryPath, entry.name); + expect(result).toEqual(shouldInclude ? [expectedPath] : []); + }, + ); it('should throw error if directory read fails', async () => { mockFs.readdir.mockRejectedValue(new Error('Read error')); @@ -96,19 +102,24 @@ describe('FileSystemService', () => { expect(mockFs.readdir).toHaveBeenCalledWith(directoryPath, { withFileTypes: true }); }); - it.each<[string, Dirent, boolean]>([ - ['include standard directory names', createDirectoryEntry('components'), true], - ['exclude node_modules directory', createDirectoryEntry('node_modules'), false], - ['exclude dot-prefixed directories', createDirectoryEntry('.git'), false], - ['exclude files', createFileEntry('readme.md'), false], - ])('should %s', async (_description: string, entry: Dirent, shouldInclude: boolean) => { - mockFs.readdir.mockResolvedValue([entry] as never); + const subdirectoryCases: Array<{ entry: Dirent; shouldInclude: boolean }> = [ + { entry: createDirectoryEntry('components'), shouldInclude: true }, + { entry: createDirectoryEntry('node_modules'), shouldInclude: false }, + { entry: createDirectoryEntry('.git'), shouldInclude: false }, + { entry: createFileEntry('readme.md'), shouldInclude: false }, + ]; - const result = await service.getSubdirectories(directoryPath); + it.each(subdirectoryCases)( + 'should handle subdirectory filtering %#', + async ({ entry, shouldInclude }) => { + mockFs.readdir.mockResolvedValue([entry] as never); - const expectedPath = path.join(directoryPath, entry.name); - expect(result).toEqual(shouldInclude ? [expectedPath] : []); - }); + const result = await service.getSubdirectories(directoryPath); + + const expectedPath = path.join(directoryPath, entry.name); + expect(result).toEqual(shouldInclude ? [expectedPath] : []); + }, + ); it('should throw error if directory read fails', async () => { mockFs.readdir.mockRejectedValue(new Error('Read error')); @@ -157,10 +168,9 @@ describe('FileSystemService', () => { }); describe('fileExists', () => { - it.each<[string, boolean]>([ - ['return true when access succeeds', true], - ['return false when access fails', false], - ])('should %s', async (_description: string, expected: boolean) => { + const fileExistsCases = [true, false] as const; + + it.each(fileExistsCases)('should evaluate file existence %#', async (expected) => { const filePath = expected ? '/path/to/file.ts' : '/invalid/path'; if (expected) { diff --git a/src/__tests__/filters/log-filters.test.ts b/src/__tests__/filters/log-filters.test.ts deleted file mode 100644 index 4186391..0000000 --- a/src/__tests__/filters/log-filters.test.ts +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { LogFilters, LogLevel } from '../../logging/index.js'; - -describe('LogFilters', () => { - describe('levelFilter', () => { - it('should allow logs at or above the minimum level', () => { - const filter = LogFilters.levelFilter(LogLevel.WARNING); - - expect(filter(LogLevel.ERROR, 'test message')).toBe(true); - expect(filter(LogLevel.WARNING, 'test message')).toBe(true); - expect(filter(LogLevel.INFO, 'test message')).toBe(false); - expect(filter(LogLevel.DEBUG, 'test message')).toBe(false); - }); - - it('should handle unknown log levels as INFO level', () => { - const filter = LogFilters.levelFilter(LogLevel.WARNING); - - expect(filter('unknown', 'test message')).toBe(false); // INFO level (1) < WARNING level (2) - }); - - it('should allow all logs when minimum level is DEBUG', () => { - const filter = LogFilters.levelFilter(LogLevel.DEBUG); - - expect(filter(LogLevel.DEBUG, 'test message')).toBe(true); - expect(filter(LogLevel.INFO, 'test message')).toBe(true); - expect(filter(LogLevel.WARNING, 'test message')).toBe(true); - expect(filter(LogLevel.ERROR, 'test message')).toBe(true); - }); - }); - - describe('excludePattern', () => { - it('should exclude messages matching string pattern', () => { - const filter = LogFilters.excludePattern('error'); - - expect(filter(LogLevel.ERROR, 'This is an error message')).toBe(false); - expect(filter(LogLevel.INFO, 'This is a normal message')).toBe(true); - }); - - it('should exclude messages matching RegExp pattern', () => { - const filter = LogFilters.excludePattern(/error/i); - - expect(filter(LogLevel.ERROR, 'This is an ERROR message')).toBe(false); - expect(filter(LogLevel.INFO, 'This is a normal message')).toBe(true); - }); - - it('should handle messages without pattern match', () => { - const filter = LogFilters.excludePattern('error'); - - expect(filter(LogLevel.INFO, 'This is a success message')).toBe(true); - }); - }); - - describe('includePattern', () => { - it('should include only messages matching string pattern', () => { - const filter = LogFilters.includePattern('important'); - - expect(filter(LogLevel.INFO, 'This is an important message')).toBe(true); - expect(filter(LogLevel.ERROR, 'This is a normal error')).toBe(false); - }); - - it('should include only messages matching RegExp pattern', () => { - const filter = LogFilters.includePattern(/important/i); - - expect(filter(LogLevel.INFO, 'This is an IMPORTANT message')).toBe(true); - expect(filter(LogLevel.ERROR, 'This is a normal error')).toBe(false); - }); - }); - - describe('metadataFilter', () => { - it('should filter based on metadata predicate', () => { - const filter = LogFilters.metadataFilter((metadata) => metadata?.priority === 'high'); - - expect(filter(LogLevel.INFO, 'message', { priority: 'high' })).toBe(true); - expect(filter(LogLevel.ERROR, 'message', { priority: 'low' })).toBe(false); - expect(filter(LogLevel.WARNING, 'message')).toBe(false); - }); - - it('should handle undefined metadata', () => { - const filter = LogFilters.metadataFilter((metadata) => !metadata); - - expect(filter(LogLevel.INFO, 'message')).toBe(true); - expect(filter(LogLevel.ERROR, 'message', { some: 'data' })).toBe(false); - }); - }); - - describe('rateLimit', () => { - beforeEach(() => { - jest.useFakeTimers(); - }); - - afterEach(() => { - jest.useRealTimers(); - }); - - it('should allow logs within rate limit', () => { - const filter = LogFilters.rateLimit(2); - - expect(filter(LogLevel.INFO, 'message')).toBe(true); - expect(filter(LogLevel.INFO, 'message')).toBe(true); - expect(filter(LogLevel.INFO, 'message')).toBe(false); - }); - - it('should reset count after one second', () => { - const filter = LogFilters.rateLimit(1); - - expect(filter(LogLevel.INFO, 'message')).toBe(true); - expect(filter(LogLevel.INFO, 'message')).toBe(false); - - // Advance time by 1 second - jest.advanceTimersByTime(1000); - - expect(filter(LogLevel.INFO, 'message')).toBe(true); - }); - - it('should allow unlimited logs when rate is high', () => { - const filter = LogFilters.rateLimit(100); - - for (let i = 0; i < 10; i++) { - expect(filter(LogLevel.INFO, 'message')).toBe(true); - } - }); - - it('should handle zero rate limit', () => { - const filter = LogFilters.rateLimit(0); - - expect(filter(LogLevel.INFO, 'message')).toBe(false); - }); - }); -}); diff --git a/src/__tests__/loggers/composite.logger.test.ts b/src/__tests__/loggers/composite.logger.test.ts deleted file mode 100644 index 4b162ca..0000000 --- a/src/__tests__/loggers/composite.logger.test.ts +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import { - CompositeLogger, - ILogger, - ILogMetadata, - LogLevel, - MockLogger, -} from '../../logging/index.js'; - -describe('CompositeLogger', () => { - let mockLogger1: MockLogger; - let mockLogger2: MockLogger; - let compositeLogger: CompositeLogger; - - afterEach(() => { - jest.clearAllMocks(); - }); - - beforeEach(() => { - mockLogger1 = new MockLogger(); - mockLogger2 = new MockLogger(); - compositeLogger = new CompositeLogger([mockLogger1, mockLogger2]); - }); - - describe('constructor', () => { - it('should be a CompositeLogger instance', () => { - expect(compositeLogger).toBeInstanceOf(CompositeLogger); - expect(typeof compositeLogger.info).toBe('function'); - expect(typeof compositeLogger.error).toBe('function'); - expect(typeof compositeLogger.addLogger).toBe('function'); - }); - - it('should handle empty logger list', () => { - const emptyComposite = new CompositeLogger([]); - - // Should not throw - expect(() => { - emptyComposite.info('test'); - emptyComposite.error('error'); - }).not.toThrow(); - }); - }); - - describe('info', () => { - it('should delegate info calls to all loggers', () => { - console.log('Testing CompositeLogger info delegation'); - const metadata: ILogMetadata = { title: 'Composite Test' }; - compositeLogger.info('test message', metadata); - - expect(mockLogger1.calls).toHaveLength(1); - expect(mockLogger2.calls).toHaveLength(1); - expect(mockLogger1.calls[0]).toMatchObject({ - level: LogLevel.INFO, - message: 'test message', - metadata, - }); - expect(mockLogger2.calls[0]).toMatchObject({ - level: LogLevel.INFO, - message: 'test message', - metadata, - }); - }); - }); - - describe('error', () => { - it('should delegate error calls to all loggers', () => { - compositeLogger.error('error message'); - - expect(mockLogger1.calls).toHaveLength(1); - expect(mockLogger2.calls).toHaveLength(1); - expect(mockLogger1.calls[0].level).toBe(LogLevel.ERROR); - expect(mockLogger2.calls[0].level).toBe(LogLevel.ERROR); - }); - }); - - describe('group', () => { - it('should handle group operations', async () => { - const result = await compositeLogger.group('test group', async () => { - compositeLogger.info('inside group'); - return 'success'; - }); - - expect(result).toBe('success'); - // Check that group operations were recorded - expect(mockLogger1.calls.some((call) => call.level === LogLevel.GROUP)).toBe(true); - const infoMessages = mockLogger2.getCallsForLevel(LogLevel.INFO).map((call) => call.message); - expect(infoMessages).toContain('Starting group: test group'); - expect(infoMessages).toContain('Completed group: test group'); - }); - - it('should handle group operation with logger failures', async () => { - const failingLogger: jest.Mocked = { - info: jest.fn(), - debug: jest.fn(), - warn: jest.fn(), - error: jest.fn(), - setFailed: jest.fn(), - group: jest.fn().mockImplementation(() => { - throw new Error('Group failed'); - }) as jest.MockedFunction, - }; - - const compositeWithFailing = new CompositeLogger([failingLogger, mockLogger1]); - - const result = await compositeWithFailing.group('test group', async () => 'result'); - expect(result).toBe('result'); // Should succeed with the working logger - }); - }); - - describe('addLogger', () => { - it('should allow adding and removing loggers', () => { - const mockLogger3 = new MockLogger(); - - compositeLogger.addLogger(mockLogger3); - compositeLogger.info('message after adding'); - - expect(mockLogger1.calls).toHaveLength(1); - expect(mockLogger2.calls).toHaveLength(1); - expect(mockLogger3.calls).toHaveLength(1); - - compositeLogger.removeLogger(mockLogger2); - compositeLogger.info('message after removing'); - - expect(mockLogger1.calls).toHaveLength(2); - expect(mockLogger2.calls).toHaveLength(1); // No new calls - expect(mockLogger3.calls).toHaveLength(2); - }); - }); - - describe('debug', () => { - it('should delegate debug calls to all loggers', () => { - compositeLogger.debug('debug message'); - - expect(mockLogger1.calls).toHaveLength(1); - expect(mockLogger2.calls).toHaveLength(1); - expect(mockLogger1.calls[0].level).toBe(LogLevel.DEBUG); - expect(mockLogger2.calls[0].level).toBe(LogLevel.DEBUG); - }); - }); - - describe('warn', () => { - it('should delegate warning calls to all loggers', () => { - const metadata = { component: 'test' }; - compositeLogger.warn('warning message', metadata); - - expect(mockLogger1.calls).toHaveLength(1); - expect(mockLogger2.calls).toHaveLength(1); - expect(mockLogger1.calls[0].level).toBe(LogLevel.WARNING); - expect(mockLogger2.calls[0].level).toBe(LogLevel.WARNING); - }); - }); - - describe('setFailed', () => { - it('should delegate setFailed calls to all loggers', () => { - compositeLogger.setFailed('action failed'); - - expect(mockLogger1.calls).toHaveLength(1); - expect(mockLogger2.calls).toHaveLength(1); - expect(mockLogger1.calls[0].level).toBe(LogLevel.FAILED); - expect(mockLogger2.calls[0].level).toBe(LogLevel.FAILED); - }); - }); -}); diff --git a/src/__tests__/loggers/filtered.logger.test.ts b/src/__tests__/loggers/filtered.logger.test.ts deleted file mode 100644 index 7e3ca41..0000000 --- a/src/__tests__/loggers/filtered.logger.test.ts +++ /dev/null @@ -1,382 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { FilteredLogger, LogFilters, LogLevel, MockLogger } from '../../logging/index.js'; - -describe('FilteredLogger', () => { - let mockLogger: MockLogger; - let filteredLogger: FilteredLogger; - - afterEach(() => { - jest.clearAllMocks(); - }); - - beforeEach(() => { - mockLogger = new MockLogger(); - filteredLogger = new FilteredLogger(mockLogger); - }); - - describe('constructor', () => { - it('should create FilteredLogger with default filters', () => { - expect(filteredLogger).toBeInstanceOf(FilteredLogger); - }); - - it('should create FilteredLogger with provided filters', () => { - const filters = [LogFilters.levelFilter(LogLevel.WARNING)]; - const logger = new FilteredLogger(mockLogger, filters); - - expect(logger).toBeInstanceOf(FilteredLogger); - }); - - it('should create FilteredLogger with sampling strategy', () => { - const sampling = { rate: 0.5 }; - const logger = new FilteredLogger(mockLogger, [], sampling); - - expect(logger).toBeInstanceOf(FilteredLogger); - }); - }); - - describe('info', () => { - it('should log info messages when no filters', () => { - filteredLogger.info('test message'); - - expect(mockLogger.getLastCall()).toEqual({ - level: LogLevel.INFO, - message: 'test message', - timestamp: expect.any(Date), - }); - }); - - it('should log info messages with metadata when no filters', () => { - const metadata = { userId: 123 }; - filteredLogger.info('test message', metadata); - - expect(mockLogger.getLastCall()).toEqual({ - level: LogLevel.INFO, - message: 'test message', - metadata, - timestamp: expect.any(Date), - }); - }); - - it('should filter out info messages below level filter', () => { - const logger = new FilteredLogger(mockLogger, [LogFilters.levelFilter(LogLevel.WARNING)]); - - logger.info('test message'); - - expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(0); - }); - - it('should filter out info messages matching exclude pattern', () => { - const logger = new FilteredLogger(mockLogger, [LogFilters.excludePattern('secret')]); - - logger.info('This contains secret data'); - - expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(0); - }); - }); - - describe('debug', () => { - it('should log debug messages when no filters', () => { - filteredLogger.debug('debug message'); - - expect(mockLogger.getLastCall()).toEqual({ - level: LogLevel.DEBUG, - message: 'debug message', - timestamp: expect.any(Date), - }); - }); - - it('should filter out debug messages below level filter', () => { - const logger = new FilteredLogger(mockLogger, [LogFilters.levelFilter(LogLevel.INFO)]); - - logger.debug('debug message'); - - expect(mockLogger.getCallsForLevel(LogLevel.DEBUG)).toHaveLength(0); - }); - }); - - describe('warning', () => { - it('should log warning messages when no filters', () => { - filteredLogger.warn('warning message'); - - expect(mockLogger.getLastCall()).toEqual({ - level: LogLevel.WARNING, - message: 'warning message', - timestamp: expect.any(Date), - }); - }); - - it('should log warning messages with metadata when no filters', () => { - const metadata = { component: 'test' }; - filteredLogger.warn('warning message', metadata); - - expect(mockLogger.getLastCall()).toEqual({ - level: LogLevel.WARNING, - message: 'warning message', - metadata, - timestamp: expect.any(Date), - }); - }); - }); - - describe('error', () => { - it('should log error messages when no filters', () => { - filteredLogger.error('error message'); - - expect(mockLogger.getLastCall()).toEqual({ - level: LogLevel.ERROR, - message: 'error message', - timestamp: expect.any(Date), - }); - }); - - it('should log error messages with metadata when no filters', () => { - const metadata = { error: 'test error' }; - filteredLogger.error('error message', metadata); - - expect(mockLogger.getLastCall()).toEqual({ - level: LogLevel.ERROR, - message: 'error message', - metadata, - timestamp: expect.any(Date), - }); - }); - }); - - describe('setFailed', () => { - it('should always log failed messages regardless of filters', () => { - const logger = new FilteredLogger(mockLogger, [LogFilters.levelFilter(LogLevel.ERROR)]); - - logger.setFailed('failure message'); - - expect(mockLogger.getLastCall()).toEqual({ - level: LogLevel.FAILED, - message: 'failure message', - timestamp: expect.any(Date), - }); - }); - - it('should log failed messages with metadata', () => { - const metadata = { severity: 'critical' }; - filteredLogger.setFailed('failure message', metadata); - - expect(mockLogger.getLastCall()).toEqual({ - level: LogLevel.FAILED, - message: 'failure message', - metadata, - timestamp: expect.any(Date), - }); - }); - }); - - describe('group', () => { - it('should delegate group operations to wrapped logger', async () => { - const mockFn = jest.fn, []>().mockResolvedValue('result'); - - const result = await filteredLogger.group('test group', mockFn); - - expect(result).toBe('result'); - expect(mockFn).toHaveBeenCalled(); - }); - }); - - describe('addFilter', () => { - it('should add filters to the logger', () => { - const filter = LogFilters.levelFilter(LogLevel.WARNING); - - filteredLogger.addFilter(filter); - - // Test that the filter is applied - filteredLogger.info('info message'); - expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(0); - }); - }); - - describe('clearFilters', () => { - it('should remove all filters', () => { - const filter = LogFilters.levelFilter(LogLevel.WARNING); - filteredLogger.addFilter(filter); - - filteredLogger.clearFilters(); - - // Test that filters are cleared - filteredLogger.info('info message'); - expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(1); - }); - }); - - describe('setSampling', () => { - it('should update sampling strategy', () => { - const sampling = { rate: 0.5 }; - filteredLogger.setSampling(sampling); - - // Test that sampling is applied (this is tested more thoroughly in sampling tests) - expect(() => filteredLogger.setSampling(undefined)).not.toThrow(); - }); - }); - - describe('sampling', () => { - beforeEach(() => { - jest.spyOn(Math, 'random').mockReturnValue(0.3); // 30% - below 50% rate - }); - - afterEach(() => { - jest.spyOn(Math, 'random').mockRestore(); - }); - - it('should apply rate-based sampling', () => { - const logger = new FilteredLogger(mockLogger, [], { rate: 0.5 }); - - logger.info('test message'); - - // Should pass due to random <= rate (0.3 <= 0.5) - expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(1); - }); - - it('should allow logs when random value is below rate', () => { - jest.spyOn(Math, 'random').mockReturnValue(0.4); // 40% - below 50% rate, should pass - const logger = new FilteredLogger(mockLogger, [], { rate: 0.5 }); - - logger.info('test message'); - - expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(1); - }); - - it('should allow logs when random value is above rate threshold', () => { - jest.spyOn(Math, 'random').mockReturnValue(0.6); // 60% - above 50% rate, should fail - const logger = new FilteredLogger(mockLogger, [], { rate: 0.5 }); - - logger.info('test message'); - - expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(0); - }); - }); - - describe('window-based sampling', () => { - beforeEach(() => { - jest.useFakeTimers(); - }); - - afterEach(() => { - jest.useRealTimers(); - }); - - it('should limit logs per window', () => { - const logger = new FilteredLogger(mockLogger, [], { - rate: 1.0, // Allow all logs through rate sampling - maxPerWindow: 2, - windowMs: 1000, - }); - - logger.info('message 1'); - logger.info('message 2'); - logger.info('message 3'); // Should be filtered - - expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(2); - }); - - it('should reset window after time expires', () => { - const originalDateNow = Date.now; - const mockNow = jest.fn(); - mockNow.mockReturnValue(1000); // Initial time - Date.now = mockNow as any; - - const logger = new FilteredLogger(mockLogger, [], { - rate: 1.0, // Allow all logs through rate sampling - maxPerWindow: 1, - windowMs: 1000, - }); - - logger.info('message 1'); - expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(1); - - mockNow.mockReturnValue(2001); // After window expires (1000 + 1000 + 1) - - logger.info('message 2'); // Should be allowed after window reset - expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(2); - - Date.now = originalDateNow; - }); - }); - - describe('custom sampling strategy', () => { - it('should use custom shouldSample function', () => { - const customSampling = { - rate: 1.0, // Required by interface - shouldSample: jest.fn().mockReturnValue(false) as any, - }; - const logger = new FilteredLogger(mockLogger, [], customSampling); - - logger.info('test message'); - - expect(customSampling.shouldSample).toHaveBeenCalledWith( - LogLevel.INFO, - 'test message', - undefined, - ); - expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(0); - }); - - it('should use custom shouldSample function with metadata', () => { - const customSampling = { - rate: 1.0, // Required by interface - shouldSample: jest.fn().mockReturnValue(true) as any, - }; - const logger = new FilteredLogger(mockLogger, [], customSampling); - const metadata = { test: true }; - - logger.warn('warning message', metadata); - - expect(customSampling.shouldSample).toHaveBeenCalledWith( - LogLevel.WARNING, - 'warning message', - metadata, - ); - expect(mockLogger.getCallsForLevel(LogLevel.WARNING)).toHaveLength(1); - }); - }); - - describe('complex filtering scenarios', () => { - it('should apply multiple filters (all must pass)', () => { - const filters = [ - LogFilters.levelFilter(LogLevel.INFO), - LogFilters.includePattern('important'), - ]; - const logger = new FilteredLogger(mockLogger, filters); - - logger.info('This is an important message'); // Should pass - logger.info('This is a normal message'); // Should fail pattern filter - logger.debug('This is an important debug'); // Should fail level filter - - expect(mockLogger.getCallsForLevel(LogLevel.INFO)).toHaveLength(1); - }); - - it('should combine filtering and sampling', () => { - jest.spyOn(Math, 'random').mockReturnValue(0.4); // Below rate threshold (0.4 <= 0.5) - - const filters = [LogFilters.levelFilter(LogLevel.WARNING)]; - const sampling = { rate: 0.5 }; - const logger = new FilteredLogger(mockLogger, filters, sampling); - - logger.warn('warning message'); // Should pass both filter and sampling - - expect(mockLogger.getCallsForLevel(LogLevel.WARNING)).toHaveLength(1); - - jest.spyOn(Math, 'random').mockRestore(); - }); - }); -}); diff --git a/src/__tests__/loggers/logger-config.resolver.test.ts b/src/__tests__/loggers/logger-config.resolver.test.ts deleted file mode 100644 index 4cb55f4..0000000 --- a/src/__tests__/loggers/logger-config.resolver.test.ts +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import { IPinoLoggerConfig, LoggerConfigResolver, LogLevel } from '../../logging/index.js'; -import type { IEnvironmentVariables } from '../../types/env.js'; - -describe('LoggerConfigResolver', () => { - describe('resolve', () => { - it('should resolve default configuration for development', () => { - const mockEnv: IEnvironmentVariables = { - NODE_ENV: 'development', - npm_package_version: '1.0.0', - }; - - const config = LoggerConfigResolver.resolve({}, mockEnv); - - expect(config.level).toBe(LogLevel.INFO); - expect(config.prettyPrint).toBe(true); - expect(config.enableCore).toBe(false); - expect(config.enablePino).toBe(true); - expect(config.base).toHaveProperty('service', 'github-action'); - expect(config.base).toHaveProperty('version', '1.0.0'); - }); - - it('should resolve configuration for CI environment', () => { - const mockEnv: IEnvironmentVariables = { - NODE_ENV: 'production', - GITHUB_ACTIONS: 'true', - GITHUB_REPOSITORY: 'owner/repo', - GITHUB_WORKFLOW: 'CI', - GITHUB_RUN_ID: '123', - GITHUB_REF: 'refs/heads/main', - GITHUB_SHA: 'abc123', - npm_package_version: '1.0.0', - }; - - const config = LoggerConfigResolver.resolve({}, mockEnv); - - expect(config.enableCore).toBe(true); - expect(config.base).toHaveProperty('repository', 'owner/repo'); - expect(config.base).toHaveProperty('workflow', 'CI'); - expect(config.base).toHaveProperty('runId', '123'); - expect(config.base).toHaveProperty('ref', 'refs/heads/main'); - expect(config.base).toHaveProperty('sha', 'abc123'); - }); - - it('should resolve production configuration', () => { - const mockEnv: IEnvironmentVariables = { - NODE_ENV: 'production', - LOG_FILE: '/tmp/app.log', - }; - - const config = LoggerConfigResolver.resolve({}, mockEnv); - - expect(config.prettyPrint).toBe(false); - expect(config.transport).toBeDefined(); - expect(config.transport).toHaveProperty('target', 'pino/file'); - }); - - it('should apply overrides', () => { - const mockEnv: IEnvironmentVariables = {}; - const overrides: Partial = { - level: LogLevel.DEBUG, - enableCore: true, - base: { custom: 'value' }, - }; - - const config = LoggerConfigResolver.resolve(overrides, mockEnv); - - expect(config.level).toBe(LogLevel.DEBUG); - expect(config.enableCore).toBe(true); - expect(config.base).toHaveProperty('custom', 'value'); - }); - - it('should respect LOG_LEVEL environment variable', () => { - const mockEnv: IEnvironmentVariables = { - LOG_LEVEL: LogLevel.WARNING, - }; - - const config = LoggerConfigResolver.resolve({}, mockEnv); - - expect(config.level).toBe(LogLevel.WARNING); - }); - }); - - describe('toPinoOptions', () => { - it('should create Pino options from config', () => { - const config: IPinoLoggerConfig = { - level: LogLevel.DEBUG, - base: { service: 'test' }, - transport: { - target: 'pino-pretty', - options: { colorize: true }, - }, - }; - - const pinoOptions = LoggerConfigResolver.toPinoOptions(config); - - expect(pinoOptions.level).toBe(LogLevel.DEBUG); - expect(pinoOptions.base).toEqual({ service: 'test' }); - expect(pinoOptions.transport).toBeDefined(); - }); - - it('should handle minimal config for Pino options', () => { - const config: IPinoLoggerConfig = { - level: LogLevel.INFO, - }; - - const pinoOptions = LoggerConfigResolver.toPinoOptions(config); - - expect(pinoOptions.level).toBe(LogLevel.INFO); - expect(pinoOptions.base).toEqual({}); - }); - - it('should handle config with undefined base for Pino options', () => { - const config: IPinoLoggerConfig = { - level: LogLevel.WARNING as any, - base: undefined, - }; - - const pinoOptions = LoggerConfigResolver.toPinoOptions(config); - - expect(pinoOptions.level).toBe(LogLevel.WARNING); - expect(pinoOptions.base).toEqual({}); - }); - - it('should handle config with null base for Pino options', () => { - const config: IPinoLoggerConfig = { - level: LogLevel.ERROR as any, - base: null as any, - }; - - const pinoOptions = LoggerConfigResolver.toPinoOptions(config); - - expect(pinoOptions.level).toBe(LogLevel.ERROR); - expect(pinoOptions.base).toEqual({}); - }); - }); - - describe('GitHub Actions environment', () => { - it('should resolve configuration for GitHub Actions environment', () => { - const mockEnv: IEnvironmentVariables = { - GITHUB_ACTIONS: 'true', - GITHUB_RUN_ID: '12345', - GITHUB_SHA: 'abc123', - GITHUB_REF: 'refs/heads/main', - GITHUB_REPOSITORY: 'owner/repo', - npm_package_version: '1.0.0', - }; - - const config = LoggerConfigResolver.resolve({}, mockEnv); - - expect(config.level).toBe(LogLevel.INFO); - expect(config.prettyPrint).toBe(false); - expect(config.enableCore).toBe(true); - expect(config.enablePino).toBe(true); - expect(config.base).toEqual({ - service: 'github-action', - version: '1.0.0', - runId: '12345', - sha: 'abc123', - ref: 'refs/heads/main', - repository: 'owner/repo', - }); - }); - }); -}); diff --git a/src/__tests__/loggers/logger.factory.test.ts b/src/__tests__/loggers/logger.factory.test.ts deleted file mode 100644 index b4c431c..0000000 --- a/src/__tests__/loggers/logger.factory.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import { - CompositeLogger, - createCompositeLogger, - createPinoLogger, - PinoLogger, -} from '../../logging/index.js'; - -describe('Factory Functions', () => { - afterEach(() => { - jest.clearAllMocks(); - }); - - it('should create composite logger with default configuration', () => { - const logger = createCompositeLogger(); - expect(logger).toBeInstanceOf(CompositeLogger); - }); - - it('should create pino logger with default configuration', () => { - const logger = createPinoLogger(); - expect(logger).toBeInstanceOf(PinoLogger); - }); -}); diff --git a/src/__tests__/loggers/metrics.logger.test.ts b/src/__tests__/loggers/metrics.logger.test.ts deleted file mode 100644 index 6b806d0..0000000 --- a/src/__tests__/loggers/metrics.logger.test.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { ILogMetadata, LogLevel, MetricsLogger, MockLogger } from '../../logging/index.js'; - -describe('MetricsLogger', () => { - let mockLogger: MockLogger; - let metricsLogger: MetricsLogger; - let metricsCallback: jest.Mock; - - afterEach(() => { - jest.clearAllMocks(); - }); - - beforeEach(() => { - mockLogger = new MockLogger(); - metricsCallback = jest.fn(); - metricsLogger = new MetricsLogger(mockLogger, metricsCallback); - }); - - describe('info', () => { - it('should record metrics for info logs', () => { - metricsLogger.info('test message'); - - const metrics = metricsLogger.getMetrics(); - expect(metrics.totalLogs).toBe(1); - expect(metrics.infoLogs).toBe(1); - expect(metrics.logsByLevel[LogLevel.INFO]).toBe(1); - expect(metricsCallback).toHaveBeenCalledTimes(2); - }); - }); - - describe('debug', () => { - it('should record metrics for debug logs', () => { - metricsLogger.debug('debug message'); - - const metrics = metricsLogger.getMetrics(); - expect(metrics.totalLogs).toBe(1); - expect(metrics.debugLogs).toBe(1); - expect(metrics.logsByLevel[LogLevel.DEBUG]).toBe(1); - }); - }); - - describe('warning', () => { - it('should record metrics for warning logs', () => { - const metadata: ILogMetadata = { title: 'Warning' }; - metricsLogger.warn('warning message', metadata); - - const metrics = metricsLogger.getMetrics(); - expect(metrics.totalLogs).toBe(1); - expect(metrics.warnings).toBe(1); - expect(metrics.warningLogs).toBe(1); - expect(metrics.logsByLevel[LogLevel.WARNING]).toBe(1); - }); - }); - - describe('error', () => { - it('should record metrics for error logs', () => { - metricsLogger.error('error message'); - - const metrics = metricsLogger.getMetrics(); - expect(metrics.totalLogs).toBe(1); - expect(metrics.errors).toBe(1); - expect(metrics.errorLogs).toBe(1); - expect(metrics.logsByLevel[LogLevel.ERROR]).toBe(1); - }); - }); - - describe('setFailed', () => { - it('should record metrics for failed logs', () => { - metricsLogger.setFailed('failure message'); - - const metrics = metricsLogger.getMetrics(); - expect(metrics.totalLogs).toBe(1); - expect(metrics.failedLogs).toBe(1); - expect(metrics.logsByLevel[LogLevel.FAILED]).toBe(1); - }); - }); - - describe('group', () => { - it('should record grouped operations', async () => { - const mockFn = jest.fn, []>().mockResolvedValue('result'); - await metricsLogger.group('test group', mockFn); - - const metrics = metricsLogger.getMetrics(); - expect(metrics.groupedOperations).toBe(1); - }); - }); - - describe('getMetrics', () => { - it('should calculate average log size', () => { - metricsLogger.info('short'); - metricsLogger.info('this is a longer message'); - - const metrics = metricsLogger.getMetrics(); - expect(metrics.averageLogSize).toBeGreaterThan(0); - expect(metrics.totalLogs).toBe(2); - }); - - it('should track uptime', () => { - // Add a small delay to ensure uptime > 0 - const startTime = Date.now(); - while (Date.now() - startTime < 1) { - // Busy wait for 1ms - } - const metrics = metricsLogger.getMetrics(); - expect(metrics.uptime).toBeGreaterThan(0); - }); - - it('should provide metrics snapshot', () => { - metricsLogger.info('test'); - const metrics = metricsLogger.getMetrics(); - - expect(metrics).toHaveProperty('totalLogs', 1); - expect(metrics).toHaveProperty('logsByLevel'); - expect(metrics).toHaveProperty('uptime'); - expect(metrics).toHaveProperty('lastUpdated'); - }); - - it('should handle metadata in metrics', () => { - const metadata: ILogMetadata = { title: 'Test', file: 'test.ts' }; - metricsLogger.info('message', metadata); - - const metrics = metricsLogger.getMetrics(); - expect(metrics.averageLogSize).toBeGreaterThan(6); // "message" + metadata size - }); - }); - - describe('startMetricsReporting', () => { - // Test removed due to memory leak issue - }); - - it('should delegate to wrapped logger', () => { - metricsLogger.info('test message'); - expect(() => mockLogger.assertCalled(LogLevel.INFO, 'test message')).not.toThrow(); - }); -}); diff --git a/src/__tests__/loggers/mock.logger.test.ts b/src/__tests__/loggers/mock.logger.test.ts deleted file mode 100644 index cc4f1be..0000000 --- a/src/__tests__/loggers/mock.logger.test.ts +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import { LogLevel, MockLogger } from '../../logging/index.js'; - -describe('MockLogger', () => { - let mockLogger: MockLogger; - - afterEach(() => { - jest.clearAllMocks(); - }); - - beforeEach(() => { - mockLogger = new MockLogger(); - }); - - describe('info', () => { - it('should record info calls', () => { - mockLogger.info('test info message'); - expect(mockLogger.calls).toHaveLength(1); - expect(mockLogger.calls[0]).toMatchObject({ - level: LogLevel.INFO, - message: 'test info message', - }); - }); - }); - - describe('debug', () => { - it('should record debug calls', () => { - mockLogger.debug('test debug message'); - expect(mockLogger.calls).toHaveLength(1); - expect(mockLogger.calls[0]).toMatchObject({ - level: LogLevel.DEBUG, - message: 'test debug message', - }); - }); - }); - - describe('warning', () => { - it('should record warning calls with metadata', () => { - const metadata = { title: 'Warning' }; - mockLogger.warn('test warning', metadata); - expect(mockLogger.calls).toHaveLength(1); - expect(mockLogger.calls[0]).toMatchObject({ - level: LogLevel.WARNING, - message: 'test warning', - metadata, - }); - }); - }); - - describe('error', () => { - it('should record error calls', () => { - mockLogger.error('test error'); - expect(mockLogger.calls).toHaveLength(1); - expect(mockLogger.calls[0]).toMatchObject({ - level: LogLevel.ERROR, - message: 'test error', - }); - }); - }); - - describe('setFailed', () => { - it('should record setFailed calls', () => { - mockLogger.setFailed('test failure'); - expect(mockLogger.calls).toHaveLength(1); - expect(mockLogger.calls[0]).toMatchObject({ - level: LogLevel.FAILED, - message: 'test failure', - }); - }); - }); - - describe('group', () => { - it('should handle group operations successfully', async () => { - const mockFn = jest.fn, []>().mockResolvedValue('success'); - const result = await mockLogger.group('test group', mockFn); - - expect(result).toBe('success'); - expect(mockLogger.calls).toHaveLength(2); - expect(mockLogger.calls[0].message).toBe('START: test group'); - expect(mockLogger.calls[1].message).toBe('END: test group'); - }); - - it('should handle group operations with errors', async () => { - const mockFn = jest.fn, []>().mockRejectedValue(new Error('test error')); - - await expect(mockLogger.group('test group', mockFn)).rejects.toThrow('test error'); - - expect(mockLogger.calls).toHaveLength(2); - expect(mockLogger.calls[0].message).toBe('START: test group'); - expect(mockLogger.calls[1].message).toBe('ERROR: test group'); - }); - }); - - describe('getCallsForLevel', () => { - it('should get calls for specific level', () => { - mockLogger.info('info1'); - mockLogger.debug('debug1'); - mockLogger.info('info2'); - - const infoCalls = mockLogger.getCallsForLevel(LogLevel.INFO); - expect(infoCalls).toHaveLength(2); - expect(infoCalls[0].message).toBe('info1'); - expect(infoCalls[1].message).toBe('info2'); - }); - }); - - describe('getLastCall', () => { - it('should get last call', () => { - mockLogger.info('first'); - mockLogger.debug('last'); - - const lastCall = mockLogger.getLastCall(); - expect(lastCall?.message).toBe('last'); - expect(lastCall?.level).toBe(LogLevel.DEBUG); - }); - }); - - describe('clear', () => { - it('should clear calls', () => { - mockLogger.info('test'); - expect(mockLogger.calls).toHaveLength(1); - - mockLogger.clear(); - expect(mockLogger.calls).toHaveLength(0); - }); - }); - - describe('assertCalled', () => { - it('should assert called with string message', () => { - mockLogger.info('expected message'); - expect(() => mockLogger.assertCalled(LogLevel.INFO, 'expected')).not.toThrow(); - }); - - it('should assert called with regex message', () => { - mockLogger.info('expected message'); - expect(() => mockLogger.assertCalled(LogLevel.INFO, /expected/)).not.toThrow(); - }); - - it('should throw when asserting called but not called', () => { - expect(() => mockLogger.assertCalled(LogLevel.INFO)).toThrow('Expected info to be called'); - }); - - it('should throw when asserting called with message but wrong message', () => { - mockLogger.info('wrong message'); - expect(() => mockLogger.assertCalled(LogLevel.INFO, 'expected')).toThrow( - 'Expected info to be called with message matching "expected"', - ); - }); - }); - - describe('assertNotCalled', () => { - it('should assert not called', () => { - expect(() => mockLogger.assertNotCalled(LogLevel.INFO)).not.toThrow(); - }); - - it('should throw when asserting not called but was called', () => { - mockLogger.info('test'); - expect(() => mockLogger.assertNotCalled(LogLevel.INFO)).toThrow( - 'Expected info not to be called', - ); - }); - }); -}); diff --git a/src/__tests__/loggers/noop.logger.test.ts b/src/__tests__/loggers/noop.logger.test.ts deleted file mode 100644 index e1e0d47..0000000 --- a/src/__tests__/loggers/noop.logger.test.ts +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NoopLogger } from '../../logging/index.js'; - -describe('NoopLogger', () => { - let logger: NoopLogger; - - afterEach(() => { - jest.clearAllMocks(); - }); - - beforeEach(() => { - logger = new NoopLogger(); - }); - - describe('properties', () => { - it('should have correct default properties', () => { - expect(logger.level).toBe('silent'); - expect(logger.levelVal).toBe(100); - expect(logger.msgPrefix).toBe(''); - }); - }); - - describe('logging methods', () => { - it('should call info without error', () => { - expect(() => logger.info('test')).not.toThrow(); - expect(() => logger.info('test', { key: 'value' })).not.toThrow(); - }); - - it('should call debug without error', () => { - expect(() => logger.debug('test')).not.toThrow(); - expect(() => logger.debug('test', { key: 'value' })).not.toThrow(); - }); - - it('should call warning without error', () => { - expect(() => logger.warn('test')).not.toThrow(); - expect(() => logger.warn('test', { key: 'value' })).not.toThrow(); - }); - - it('should call error without error', () => { - expect(() => logger.error('test')).not.toThrow(); - expect(() => logger.error('test', { key: 'value' })).not.toThrow(); - }); - - it('should call fatal without error', () => { - expect(() => logger.fatal('test')).not.toThrow(); - expect(() => logger.fatal('test', { key: 'value' })).not.toThrow(); - }); - - it('should call trace without error', () => { - expect(() => logger.trace('test')).not.toThrow(); - expect(() => logger.trace('test', { key: 'value' })).not.toThrow(); - }); - }); - - describe('child', () => { - it('should return a new NoopLogger instance', () => { - const childLogger = logger.child({}); - expect(childLogger).toBeInstanceOf(NoopLogger); - expect(childLogger).not.toBe(logger); - }); - }); - - describe('setFailed', () => { - it('should call setFailed without error', () => { - expect(() => logger.setFailed('test')).not.toThrow(); - expect(() => logger.setFailed('test', { key: 'value' })).not.toThrow(); - }); - }); - - describe('group', () => { - it('should execute the function and return its result', async () => { - const result = await logger.group('test', async () => 'success'); - expect(result).toBe('success'); - }); - - it('should handle synchronous functions', async () => { - const result = await logger.group('test', () => Promise.resolve('sync')); - expect(result).toBe('sync'); - }); - }); -}); diff --git a/src/__tests__/loggers/pino.logger.test.ts b/src/__tests__/loggers/pino.logger.test.ts deleted file mode 100644 index d9139a8..0000000 --- a/src/__tests__/loggers/pino.logger.test.ts +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import type { OutputChannel } from 'vscode'; - -import { LogLevel, PinoLogger } from '../../logging/index.js'; - -type MockOutputChannel = OutputChannel & { - append: jest.Mock; - appendLine: jest.Mock; - clear: jest.Mock; - replace: jest.Mock; - show: jest.Mock; - hide: jest.Mock; - dispose: jest.Mock; -}; - -const createMockOutputChannel = (): MockOutputChannel => - ({ - name: 'Test Channel', - append: jest.fn(), - appendLine: jest.fn(), - clear: jest.fn(), - replace: jest.fn(), - show: jest.fn(), - hide: jest.fn(), - dispose: jest.fn(), - }) as unknown as MockOutputChannel; - -describe('PinoLogger', () => { - let logger: PinoLogger; - - afterEach(() => { - jest.clearAllMocks(); - PinoLogger.configureOutputChannel(undefined); - }); - - beforeEach(() => { - logger = new PinoLogger({ - level: LogLevel.INFO, - base: { service: 'test' }, - }); - }); - - describe('constructor', () => { - it('should create logger instance', () => { - expect(logger).toBeDefined(); - expect(typeof logger.isLoggerAvailable).toBe('function'); - }); - }); - - describe('info', () => { - it('should log info messages', () => { - expect(() => logger.info('test message')).not.toThrow(); - }); - - it('should handle metadata in logs', () => { - const metadata = { userId: 123, action: 'login' }; - expect(() => logger.info('user logged in', metadata)).not.toThrow(); - }); - }); - - describe('debug', () => { - it('should log debug messages', () => { - expect(() => logger.debug('debug message')).not.toThrow(); - }); - }); - - describe('group', () => { - it('should handle group operations with child logger', async () => { - const result = await logger.group('test group', async () => { - logger.info('inside group'); - return 'success'; - }); - expect(result).toBe('success'); - }); - - it('should handle group operation errors', async () => { - await expect( - logger.group('failing group', async () => { - throw new Error('group failed'); - }), - ).rejects.toThrow('group failed'); - }); - }); - - describe('warning', () => { - it('should handle warning calls', () => { - logger.warn('warning message'); - logger.warn('warning with metadata', { component: 'test' }); - // Test passes if no exception is thrown - expect(true).toBe(true); - }); - }); - - describe('isLoggerAvailable', () => { - it('should report logger availability', () => { - expect(logger.isLoggerAvailable()).toBe(true); - }); - }); - - describe('output channel integration', () => { - it('should append info logs to the configured output channel', () => { - const outputChannel = createMockOutputChannel(); - PinoLogger.configureOutputChannel(outputChannel); - const channelLogger = new PinoLogger({ level: LogLevel.INFO }); - - channelLogger.info('I am a banana.', { fruit: 'banana' }); - - expect(outputChannel.appendLine).toHaveBeenCalledTimes(1); - const [loggedLine] = outputChannel.appendLine.mock.calls[0]; - expect(loggedLine).toContain('[INFO] I am a banana.'); - expect(loggedLine).toContain('"fruit":"banana"'); - }); - - it('should record group lifecycle events in the output channel', async () => { - const outputChannel = createMockOutputChannel(); - PinoLogger.configureOutputChannel(outputChannel); - const channelLogger = new PinoLogger({ level: LogLevel.INFO }); - - await expect( - channelLogger.group('citrus-run', async () => { - throw new Error('group failed'); - }), - ).rejects.toThrow('group failed'); - - const recordedMessages = outputChannel.appendLine.mock.calls.map(([call]) => call as string); - expect(recordedMessages).toEqual( - expect.arrayContaining([ - expect.stringContaining('Starting group: citrus-run'), - expect.stringContaining('Failed in group: citrus-run'), - ]), - ); - }); - }); - - it('should handle error logging', () => { - const error = new Error('test error'); - expect(() => logger.error('error occurred', { error: error.message })).not.toThrow(); - }); - - it('should handle setFailed calls', () => { - expect(() => logger.setFailed('action failed')).not.toThrow(); - }); - - it('should respect log levels', () => { - const debugLogger = new PinoLogger({ - level: LogLevel.ERROR, - }); - - expect(() => { - debugLogger.debug('should not log'); - debugLogger.info('should not log'); - debugLogger.error('should log'); - }).not.toThrow(); - }); -}); diff --git a/src/core/services/barrel-content.builder.ts b/src/core/services/barrel-content.builder.ts index d6aac1e..55b0c60 100644 --- a/src/core/services/barrel-content.builder.ts +++ b/src/core/services/barrel-content.builder.ts @@ -2,13 +2,37 @@ const DEFAULT_KEYWORD = 'default'; const NEWLINE = '\n'; const PARENT_DIRECTORY = '..'; +export enum BarrelExportKind { + Value = 'value', + Type = 'type', + Default = 'default', +} + +export enum BarrelEntryKind { + File = 'file', + Directory = 'directory', +} + +export type BarrelExport = + | { + kind: BarrelExportKind.Value; + name: string; + } + | { + kind: BarrelExportKind.Type; + name: string; + } + | { + kind: BarrelExportKind.Default; + }; + export type BarrelEntry = | { - kind: 'file'; - exports: string[]; + kind: BarrelEntryKind.File; + exports: BarrelExport[]; } | { - kind: 'directory'; + kind: BarrelEntryKind.Directory; }; /** @@ -50,7 +74,10 @@ export class BarrelContentBuilder { for (const [relativePath, entry] of entries) { if (Array.isArray(entry)) { - normalized.set(relativePath, { kind: 'file', exports: entry }); + normalized.set(relativePath, { + kind: BarrelEntryKind.File, + exports: entry.map((name) => this.toLegacyExport(name)), + }); } else { normalized.set(relativePath, entry); } @@ -59,6 +86,14 @@ export class BarrelContentBuilder { return normalized; } + private toLegacyExport(name: string): BarrelExport { + if (name === DEFAULT_KEYWORD) { + return { kind: BarrelExportKind.Default }; + } + + return { kind: BarrelExportKind.Value, name }; + } + /** * Creates export lines for a given entry. * @param relativePath The entry path @@ -66,7 +101,7 @@ export class BarrelContentBuilder { * @returns export lines for the entry */ private createLinesForEntry(relativePath: string, entry: BarrelEntry): string[] { - if (entry.kind === 'directory') { + if (entry.kind === BarrelEntryKind.Directory) { return this.buildDirectoryExportLines(relativePath); } @@ -92,9 +127,10 @@ export class BarrelContentBuilder { * @param exports The exports from the file * @returns The export statement(s) */ - private buildFileExportLines(filePath: string, exports: string[]): string[] { - // Filter out exports that reference parent folders (shouldn't happen at this stage but defensive) - const cleanedExports = exports.filter((exp) => !exp.includes(PARENT_DIRECTORY)); + private buildFileExportLines(filePath: string, exports: BarrelExport[]): string[] { + const cleanedExports = exports.filter((exp) => + exp.kind === BarrelExportKind.Default ? true : !exp.name.includes(PARENT_DIRECTORY), + ); if (cleanedExports.length === 0) { return []; @@ -117,23 +153,35 @@ export class BarrelContentBuilder { * @param exports The exports * @returns The export statement(s) */ - private generateExportStatements(modulePath: string, exports: string[]): string[] { - const hasDefaultExport = exports.includes(DEFAULT_KEYWORD); - const hasNamedExports = exports.some((exp) => exp !== DEFAULT_KEYWORD); + private generateExportStatements(modulePath: string, exports: BarrelExport[]): string[] { + const lines: string[] = []; - if (hasDefaultExport && !hasNamedExports) { - // Only default export - return [`export { default } from './${modulePath}';`]; + const valueExports = exports + .filter( + (exp): exp is Extract => + exp.kind === BarrelExportKind.Value, + ) + .map((exp) => exp.name); + const typeExports = exports + .filter( + (exp): exp is Extract => + exp.kind === BarrelExportKind.Type, + ) + .map((exp) => exp.name); + const hasDefaultExport = exports.some((exp) => exp.kind === BarrelExportKind.Default); + + if (valueExports.length > 0) { + lines.push(`export { ${valueExports.join(', ')} } from './${modulePath}';`); } - const lines: string[] = []; - if (hasNamedExports) { - const namedExports = exports.filter((exp) => exp !== DEFAULT_KEYWORD); - lines.push(`export { ${namedExports.join(', ')} } from './${modulePath}';`); + if (typeExports.length > 0) { + lines.push(`export type { ${typeExports.join(', ')} } from './${modulePath}';`); } + if (hasDefaultExport) { lines.push(`export { default } from './${modulePath}';`); } + return lines; } diff --git a/src/core/services/barrel-file.generator.ts b/src/core/services/barrel-file.generator.ts index 7f82d73..973da65 100644 --- a/src/core/services/barrel-file.generator.ts +++ b/src/core/services/barrel-file.generator.ts @@ -1,11 +1,18 @@ import * as path from 'path'; import type { Uri } from 'vscode'; -import { BarrelContentBuilder, BarrelEntry } from './barrel-content.builder'; -import { ExportParser } from './export.parser'; +import { + BarrelContentBuilder, + BarrelEntry, + BarrelEntryKind, + BarrelExport, + BarrelExportKind, +} from './barrel-content.builder'; +import { ExportParser, ParsedExport } from './export.parser'; import { FileSystemService } from './file-system.service'; const INDEX_FILE_NAME = 'index.ts'; +const DEFAULT_EXPORT_NAME = 'default'; export type BarrelGenerationMode = 'createOrUpdate' | 'updateExisting'; @@ -114,13 +121,14 @@ export class BarrelFileGenerator { ): Promise { for (const filePath of tsFiles) { const content = await this.fileSystemService.readFile(filePath); - const exports = this.exportParser.extractExports(content); + const parsedExports = this.exportParser.extractExports(content); + const exports = this.normalizeParsedExports(parsedExports); if (exports.length === 0) { continue; } const relativePath = path.relative(directoryPath, filePath); - entries.set(relativePath, { kind: 'file', exports }); + entries.set(relativePath, { kind: BarrelEntryKind.File, exports }); } } @@ -136,7 +144,7 @@ export class BarrelFileGenerator { } const relativePath = path.relative(directoryPath, subdirectoryPath); - entries.set(relativePath, { kind: 'directory' }); + entries.set(relativePath, { kind: BarrelEntryKind.Directory }); } } @@ -166,4 +174,18 @@ export class BarrelFileGenerator { mode: options?.mode ?? 'createOrUpdate', }; } + + private normalizeParsedExports(exports: ParsedExport[]): BarrelExport[] { + return exports.map((exp) => { + if (exp.name === DEFAULT_EXPORT_NAME) { + return { kind: BarrelExportKind.Default } as BarrelExport; + } + + if (exp.typeOnly) { + return { kind: BarrelExportKind.Type, name: exp.name } as BarrelExport; + } + + return { kind: BarrelExportKind.Value, name: exp.name } as BarrelExport; + }); + } } diff --git a/src/core/services/export.parser.ts b/src/core/services/export.parser.ts index 6ad22dd..f60696c 100644 --- a/src/core/services/export.parser.ts +++ b/src/core/services/export.parser.ts @@ -1,3 +1,10 @@ +const DEFAULT_EXPORT_NAME = 'default'; + +export interface ParsedExport { + name: string; + typeOnly: boolean; +} + /** * Service responsible for parsing TypeScript exports. */ @@ -14,45 +21,21 @@ export class ExportParser { * @param content The TypeScript file content * @returns Array of export names */ - extractExports(content: string): string[] { - const exports: string[] = []; - - // Remove comments to avoid false matches + extractExports(content: string): ParsedExport[] { + const exportMap = new Map(); const contentWithoutComments = this.removeComments(content); - // Pattern for named exports (export class, interface, type, function, const, enum, let, var) - const namedExportPattern = - /export\s+(?:abstract\s+)?(?:class|interface|type|function|const|enum|let|var)\s+([A-Za-z_$][A-Za-z0-9_$]*)/g; - let match; - - while ((match = namedExportPattern.exec(contentWithoutComments)) !== null) { - exports.push(match[1]); - } + this.collectNamedExports(contentWithoutComments, exportMap); + const hasListDefault = this.collectNamedExportLists(contentWithoutComments, exportMap); - // Pattern for export { name1, name2 } - const exportListPattern = /export\s*\{([^}]+)\}/g; - while ((match = exportListPattern.exec(contentWithoutComments)) !== null) { - const names = match[1] - .split(',') - .map( - (name) => - name - .trim() - .split(/\s+as\s+/i) - .map((segment) => segment.trim()) - .filter((segment) => segment.length > 0) - .pop() ?? '', - ) - .filter((name) => name.length > 0); - exports.push(...names); - } + const hasDefaultExport = hasListDefault || /export\s+default\s+/.test(contentWithoutComments); - // Check for default export - if (/export\s+default\s+/.test(contentWithoutComments)) { - exports.push('default'); + const result = Array.from(exportMap.values()); + if (hasDefaultExport) { + result.push({ name: DEFAULT_EXPORT_NAME, typeOnly: false }); } - return [...new Set(exports)]; // Remove duplicates + return result; } /** @@ -67,4 +50,76 @@ export class ExportParser { result = result.replace(/\/\/.*$/gm, ''); return result; } + + private collectNamedExports(content: string, exportMap: Map): void { + const namedExportPattern = + /export\s+(?:abstract\s+)?(class|interface|type|function|const|enum|let|var)\s+([A-Za-z_$][A-Za-z0-9_$]*)/g; + let match: RegExpExecArray | null; + + while ((match = namedExportPattern.exec(content)) !== null) { + const keyword = match[1]; + const identifier = match[2]; + const typeOnly = keyword === 'interface' || keyword === 'type'; + this.recordNamedExport(exportMap, identifier, typeOnly); + } + } + + private collectNamedExportLists(content: string, exportMap: Map): boolean { + const exportListPattern = /export\s*(type\s+)?\{([^}]+)\}/g; + let match: RegExpExecArray | null; + let hasDefault = false; + + while ((match = exportListPattern.exec(content)) !== null) { + const entries = this.parseExportListEntries(match[2], Boolean(match[1])); + + for (const { name, typeOnly } of entries) { + if (name.toLowerCase() === DEFAULT_EXPORT_NAME) { + hasDefault = true; + continue; + } + + this.recordNamedExport(exportMap, name, typeOnly); + } + } + + return hasDefault; + } + + private parseExportListEntries( + rawList: string, + typeModifierPresent: boolean, + ): Array<{ name: string; typeOnly: boolean }> { + return rawList + .split(',') + .map((segment) => segment.trim()) + .filter((segment) => segment.length > 0) + .map((segment) => { + const tokens = segment + .split(/\s+as\s+/i) + .map((token) => token.trim()) + .filter((token) => token.length > 0); + + const sourceToken = tokens[0] ?? ''; + const aliasToken = tokens[tokens.length - 1] ?? ''; + + const typeOnly = typeModifierPresent || /^type\s+/i.test(sourceToken); + const cleanedName = typeOnly ? aliasToken.replace(/^type\s+/i, '') : aliasToken; + + return { name: cleanedName, typeOnly }; + }) + .filter((entry): entry is { name: string; typeOnly: boolean } => + Boolean(entry?.name?.length), + ); + } + + private recordNamedExport(map: Map, name: string, typeOnly: boolean): void { + const existing = map.get(name); + + if (!existing) { + map.set(name, { name, typeOnly }); + return; + } + + map.set(name, { name, typeOnly: existing.typeOnly && typeOnly }); + } } diff --git a/src/extension.ts b/src/extension.ts index 8f31438..e1aae81 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -28,20 +28,14 @@ export function activate(context: vscode.ExtensionContext) { { id: 'barrel-roll.generateBarrel', options: { recursive: false, mode: 'createOrUpdate' }, - progressTitle: 'Barrel Roll: Generating barrel...', - successMessage: 'Barrel Roll: barrel file generated successfully.', + progressTitle: 'Barrel Roll: Updating barrel...', + successMessage: 'Barrel Roll: index.ts updated.', }, { id: 'barrel-roll.generateBarrelRecursive', options: { recursive: true, mode: 'createOrUpdate' }, - progressTitle: 'Barrel Roll: Generating barrels recursively...', - successMessage: 'Barrel Roll: barrel files generated recursively.', - }, - { - id: 'barrel-roll.updateBarrel', - options: { recursive: true, mode: 'updateExisting' }, - progressTitle: 'Barrel Roll: Updating barrels...', - successMessage: 'Barrel Roll: barrel files sanitized successfully.', + progressTitle: 'Barrel Roll: Updating barrels recursively...', + successMessage: 'Barrel Roll: index.ts files updated recursively.', }, ]; diff --git a/src/logging/config.ts b/src/logging/config.ts deleted file mode 100644 index 1d7e18e..0000000 --- a/src/logging/config.ts +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import * as pino from 'pino'; - -import type { IEnvironmentVariables } from '../types/env.js'; -import { IPinoLoggerConfig } from './pino/types.js'; - -/** - * Environment-based configuration resolver - */ -export class LoggerConfigResolver { - /** - * Resolve configuration from environment variables and defaults - * @param overrides - Partial configuration to override defaults - * @param env - Environment variables (defaults to process.env for production use) - */ - static resolve( - overrides: Partial = {}, - env: IEnvironmentVariables = process.env as IEnvironmentVariables, - ): IPinoLoggerConfig { - const config = this.createBaseConfig(env); - this.applyEnvironmentSpecificSettings(config, env); - return { ...config, ...overrides }; - } - - /** - * Create the base configuration with common settings - * @param env - Environment variables - * @return Base IPinoLoggerConfig object - */ - private static createBaseConfig(env: IEnvironmentVariables): IPinoLoggerConfig { - const isGitHubActions = Boolean(env.GITHUB_ACTIONS); - - return { - level: (env.LOG_LEVEL as pino.LevelWithSilent) || 'info', - prettyPrint: this.isDevelopment(env), - enableCore: isGitHubActions, - enablePino: true, - base: { - service: 'github-action', - version: env.npm_package_version || '1.0.0', - ...(isGitHubActions && this.getGitHubMetadata(env)), - }, - }; - } - - /** - * Apply environment-specific transport settings - * @param config - The configuration object to modify - * @param env - Environment variables - */ - private static applyEnvironmentSpecificSettings( - config: IPinoLoggerConfig, - env: IEnvironmentVariables, - ) { - if (this.isProduction(env)) { - config.transport = this.createProductionTransport(env); - } else if (this.isDevelopment(env)) { - config.transport = this.createDevelopmentTransport(); - } - } - - /** - * Check if running in development environment - * @param env - Environment variables - * @return True if in development mode, false otherwise - */ - private static isDevelopment(env: IEnvironmentVariables): boolean { - return env.NODE_ENV === 'development'; - } - - /** - * Check if running in production environment - * @param env - Environment variables - */ - private static isProduction(env: IEnvironmentVariables): boolean { - return env.NODE_ENV === 'production'; - } - - /** - * Get GitHub Actions metadata for logging - * @param env - Environment variables - * @return Object with GitHub metadata - */ - private static getGitHubMetadata(env: IEnvironmentVariables) { - return { - repository: env.GITHUB_REPOSITORY, - workflow: env.GITHUB_WORKFLOW, - runId: env.GITHUB_RUN_ID, - ref: env.GITHUB_REF, - sha: env.GITHUB_SHA, - }; - } - - /** - * Create transport configuration for production - * @param env - Environment variables - * @return Transport options for production logging - */ - private static createProductionTransport(env: IEnvironmentVariables) { - return { - target: 'pino/file', - options: { - destination: env.LOG_FILE || './logs/app.log', - mkdir: true, - }, - }; - } - - /** - * Create transport configuration for development - * @return Transport options for development logging - */ - private static createDevelopmentTransport() { - return { - target: 'pino-pretty', - options: { - colorize: true, - translateTime: 'yyyy-mm-dd HH:MM:ss', - ignore: 'pid,hostname', - singleLine: false, - }, - }; - } - - /** - * Create Pino options from resolved config - * @param config - The resolved IPinoLoggerConfig - * @returns Pino LoggerOptions object - */ - static toPinoOptions(config: IPinoLoggerConfig): pino.LoggerOptions { - return { - level: config.level || 'info', - transport: config.transport, - base: config.base || {}, - }; - } -} diff --git a/src/logging/filters/index.ts b/src/logging/filters/index.ts deleted file mode 100644 index 562e4e9..0000000 --- a/src/logging/filters/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// Log filtering utilities -export * from './log-filters.js'; diff --git a/src/logging/filters/log-filters.ts b/src/logging/filters/log-filters.ts deleted file mode 100644 index 2af309e..0000000 --- a/src/logging/filters/log-filters.ts +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import { ILogMetadata, LogFilter, LogLevel } from '../types.js'; - -/** - * Common log filters - */ -export class LogFilters { - private static readonly LEVEL_VALUES: Record = { - [LogLevel.GROUP]: -1, - [LogLevel.DEBUG]: 0, - [LogLevel.INFO]: 1, - [LogLevel.WARNING]: 2, - [LogLevel.ERROR]: 3, - [LogLevel.FAILED]: 4, - }; - - /** - * Filter out logs below a certain level - * @param minLevel - The minimum log level to allow. - * @return A LogFilter function that filters out logs below the specified level. - */ - static levelFilter(minLevel: LogLevel): LogFilter { - const minLevelValue = this.LEVEL_VALUES[minLevel]; - - return (level: string) => { - const levelValue = this.LEVEL_VALUES[level as keyof typeof this.LEVEL_VALUES] ?? 1; - return levelValue >= minLevelValue; - }; - } - - /** - * Exclude logs that match a pattern - * @param pattern - The string or RegExp pattern to match against log messages. - * @return A LogFilter function that excludes messages matching the pattern. - */ - static excludePattern(pattern: string | RegExp): LogFilter { - const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern; - return (_, message) => !regex.test(message); - } - - /** - * Only include logs that match a pattern - * @param pattern - The string or RegExp pattern to match against log messages. - * @return A LogFilter function that includes only messages matching the pattern. - */ - static includePattern(pattern: string | RegExp): LogFilter { - const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern; - return (_, message) => regex.test(message); - } - - /** - * Filter based on metadata properties - * @param predicate - A function that takes metadata and returns true to include the log, false to exclude it. - * @return A LogFilter function that filters logs based on the provided predicate. - */ - static metadataFilter(predicate: (metadata?: ILogMetadata) => boolean): LogFilter { - return (_, __, metadata) => predicate(metadata); - } - - /** - * Rate limiting filter (simple implementation) - * @param maxPerSecond - Maximum number of logs allowed per second. - * @return A LogFilter function that limits the rate of logs. - */ - static rateLimit(maxPerSecond: number): LogFilter { - let lastReset = Date.now(); - let count = 0; - - return () => { - const now = Date.now(); - if (now - lastReset >= 1000) { - lastReset = now; - count = 0; - } - - if (count >= maxPerSecond) { - return false; - } - - count++; - return true; - }; - } -} diff --git a/src/logging/index.ts b/src/logging/index.ts index ad4eb74..24c4c26 100644 --- a/src/logging/index.ts +++ b/src/logging/index.ts @@ -15,18 +15,4 @@ * */ -// Export types -export * from './pino/types.js'; -export * from './types.js'; - -// Export loggers -export * from './loggers/index.js'; - -// Export Pino logger -export * from './pino/index.js'; - -// Export filters -export * from './filters/index.js'; - -// Export config -export { LoggerConfigResolver } from './config.js'; +export { PinoLogger } from './pino/logger.js'; diff --git a/src/logging/loggers/composite.ts b/src/logging/loggers/composite.ts deleted file mode 100644 index e7cdcf8..0000000 --- a/src/logging/loggers/composite.ts +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import { ILogger, ILogMetadata } from '../types.js'; - -/** - * CompositeLogger that delegates logging calls to multiple logger providers. - * This allows for logging to multiple destinations simultaneously (e.g., console and file). - */ -export class CompositeLogger implements ILogger { - private loggers: ILogger[]; - - constructor(loggers: ILogger[]) { - this.loggers = loggers; - } - - /** - * Logs an informational message to all registered loggers. - * @param message - The message to log. - * @param metadata - Optional metadata to include with the log. - */ - info(message: string, metadata?: ILogMetadata): void { - this.loggers.forEach((logger) => logger.info(message, metadata)); - } - - /** - * Logs a debug message to all registered loggers. - * @param message - The message to log. - */ - debug(message: string): void { - this.loggers.forEach((logger) => logger.debug(message)); - } - - /** - * Logs a warning message to all registered loggers. - * @param message - The message to log. - * @param metadata - Optional metadata to include with the log. - */ - warn(message: string, metadata?: ILogMetadata): void { - this.loggers.forEach((logger) => logger.warn(message, metadata)); - } - - /** - * Logs an error message to all registered loggers. - * @param message - The message to log. - * @param metadata - Optional metadata to include with the log. - */ - error(message: string, metadata?: ILogMetadata): void { - this.loggers.forEach((logger) => logger.error(message, metadata)); - } - - /** - * Sets the action as failed in all registered loggers. - * @param message - The failure message. - * @param metadata - Optional metadata to include with the failure. - */ - setFailed(message: string, metadata?: ILogMetadata): void { - this.loggers.forEach((logger) => logger.setFailed(message, metadata)); - } - - /** - * Executes a grouped operation with all registered loggers. - * Each logger's group wraps the function execution individually. - * @param name - The name of the group. - * @param fn - The function to execute within the group. - * @returns A promise that resolves when all group operations complete. - */ - async group(name: string, fn: () => Promise): Promise { - if (this.loggers.length === 0) { - return fn(); - } - - if (this.loggers.length === 1) { - return this.loggers[0].group(name, fn); - } - - const executeOnce = this.createSingleExecution(name, fn); - let lastError: unknown; - - for (let index = 0; index < this.loggers.length; index++) { - const logger = this.loggers[index]; - - try { - return await logger.group(name, () => executeOnce(index)); - } catch (error) { - lastError = error; - this.logGroupFailure(index, error); - } - } - - throw this.normalizeGroupError(name, lastError); - } - - private createSingleExecution(name: string, fn: () => Promise) { - let execution: Promise | undefined; - - return async (executingIndex: number): Promise => { - if (!execution) { - const otherLoggers = this.loggers.filter((_, index) => index !== executingIndex); - execution = (async () => { - this.emitGroupStart(otherLoggers, name); - try { - const result = await fn(); - this.emitGroupCompletion(otherLoggers, name); - return result; - } catch (error) { - this.emitGroupFailure(otherLoggers, name, error); - throw error; - } - })(); - } - - return execution; - }; - } - - private emitGroupStart(loggers: ILogger[], name: string): void { - loggers.forEach((logger) => logger.info(`Starting group: ${name}`)); - } - - private emitGroupCompletion(loggers: ILogger[], name: string): void { - loggers.forEach((logger) => logger.info(`Completed group: ${name}`)); - } - - private emitGroupFailure(loggers: ILogger[], name: string, error: unknown): void { - loggers.forEach((logger) => logger.error(`Failed in group: ${name}`, { error })); - } - - private logGroupFailure(index: number, error: unknown): void { - console.warn(`Logger ${index} failed in group operation:`, error); - } - - private normalizeGroupError(name: string, error: unknown): Error { - if (error instanceof Error) { - return error; - } - - return new Error(`Group '${name}' failed with unknown error.`); - } - - /** - * Add a new logger to the composite. - * @param logger - The logger to add - */ - addLogger(logger: ILogger): void { - this.loggers.push(logger); - } - - /** - * Remove a logger from the composite. - * @param logger - The logger to remove - */ - removeLogger(logger: ILogger): void { - const index = this.loggers.indexOf(logger); - if (index > -1) { - this.loggers.splice(index, 1); - } - } -} diff --git a/src/logging/loggers/factory.ts b/src/logging/loggers/factory.ts deleted file mode 100644 index f5e79de..0000000 --- a/src/logging/loggers/factory.ts +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import pino from 'pino'; - -import { PinoLogger } from '../pino/logger.js'; -import { LogLevel } from '../types.js'; -import { CompositeLogger } from './composite.js'; - -/** - * Factory function to create a CompositeLogger with CoreLogger and PinoLogger. - * @param pinoOptions - Optional Pino configuration options - * @returns A CompositeLogger instance with both CoreLogger and PinoLogger - */ -export function createCompositeLogger(pinoOptions?: pino.LoggerOptions): CompositeLogger { - const pinoLogger = new PinoLogger(pinoOptions); - return new CompositeLogger([pinoLogger]); -} - -/** - * Factory function to create a PinoLogger with default configuration. - * @returns A PinoLogger instance configured for production environment - * - * @example - * ```typescript - * const logger = createPinoLogger(); - * logger.info('Starting application'); - * ``` - */ -export function createPinoLogger(): PinoLogger { - return new PinoLogger({ - level: process.env.LOG_LEVEL || LogLevel.INFO, - transport: getDefaultTransport(), - base: getDefaultBase(), - }); -} - -/** - * Get the default transport configuration based on environment - * @returns Transport options for development, undefined for production - */ -function getDefaultTransport() { - return process.env.NODE_ENV !== 'production' - ? { - target: 'pino-pretty', - options: { - colorize: true, - translateTime: 'yyyy-mm-dd HH:MM:ss', - ignore: 'pid,hostname', - }, - } - : undefined; -} - -/** - * Get the default base configuration - * @returns Base metadata including service name and version - */ -function getDefaultBase() { - return { - service: 'github-action', - version: process.env.npm_package_version || '1.0.0', - }; -} diff --git a/src/logging/loggers/filtered.ts b/src/logging/loggers/filtered.ts deleted file mode 100644 index cca6bbd..0000000 --- a/src/logging/loggers/filtered.ts +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import { ILogger, ILogMetadata, ISamplingStrategy, LogFilter, LogLevel } from '../types.js'; - -/** - * Logger wrapper that applies filtering and sampling - */ -export class FilteredLogger implements ILogger { - private logCounts = new Map(); - - constructor( - private wrappedLogger: ILogger, - private filters: LogFilter[] = [], - private sampling?: ISamplingStrategy, - ) {} - - /** - * Logs an informational message if it passes all filters. - * @param message - The message to log. - * @param metadata - Optional metadata to include with the log. - */ - info(message: string, metadata?: ILogMetadata): void { - this.logIfAllowed(LogLevel.INFO, message, metadata, () => - metadata ? this.wrappedLogger.info(message, metadata) : this.wrappedLogger.info(message), - ); - } - - /** - * Logs a debug message if it passes all filters. - * @param message - The message to log. - */ - debug(message: string): void { - this.logIfAllowed(LogLevel.DEBUG, message, undefined, () => this.wrappedLogger.debug(message)); - } - - /** - * Logs a warning message if it passes all filters. - * @param message - The message to log. - * @param metadata - Optional metadata to include with the log. - */ - warn(message: string, metadata?: ILogMetadata): void { - this.logIfAllowed(LogLevel.WARNING, message, metadata, () => - metadata ? this.wrappedLogger.warn(message, metadata) : this.wrappedLogger.warn(message), - ); - } - - /** - * Logs an error message if it passes all filters. - * @param message - The message to log. - * @param metadata - Optional metadata to include with the log. - */ - error(message: string, metadata?: ILogMetadata): void { - this.logIfAllowed(LogLevel.ERROR, message, metadata, () => - metadata ? this.wrappedLogger.error(message, metadata) : this.wrappedLogger.error(message), - ); - } - - /** - * Logs a failure message (always logged, regardless of filters). - * @param message - The failure message. - * @param metadata - Optional metadata to include with the failure. - */ - setFailed(message: string, metadata?: ILogMetadata): void { - // Always log failures regardless of filtering - this.wrappedLogger.setFailed(message, metadata); - } - - /** - * Executes a grouped operation (not filtered). - * @param name - The name of the group. - * @param fn - The function to execute within the group. - * @returns A promise that resolves when the group operation completes. - */ - async group(name: string, fn: () => Promise): Promise { - return this.wrappedLogger.group(name, fn); - } - - /** - * Add a new filter - * @param filter - The filter function to add - */ - addFilter(filter: LogFilter): void { - this.filters.push(filter); - } - - /** - * Remove all filters - */ - clearFilters(): void { - this.filters = []; - } - - /** - * Update sampling strategy - * @param strategy - The new sampling strategy - */ - setSampling(strategy: ISamplingStrategy | undefined): void { - this.sampling = strategy; - } - - /** - * Determines if a log entry should be logged based on filters and sampling. - * @param level - The log level. - * @param message - The log message. - * @param metadata - Optional metadata associated with the log. - * @returns True if the log should be recorded, false otherwise. - */ - private shouldLog(level: LogLevel, message: string, metadata?: ILogMetadata): boolean { - // Apply filters - return false immediately if any filter fails - for (const filter of this.filters) { - if (!filter(level, message, metadata)) { - return false; - } - } - - // No sampling configured = allow all logs - if (!this.sampling) { - return true; - } - - return this.sampling.shouldSample - ? this.sampling.shouldSample(level, message, metadata) - : this.shouldSample(level); - } - - /** - * Determines if a log entry should be sampled based on rate and window constraints. - * @param level - The log level. - * @returns True if the log should be recorded, false otherwise. - */ - private shouldSample(level: LogLevel): boolean { - if (!this.passesRateSampling()) { - return false; - } - - const logCount = this.getOrCreateLogCount(level, Date.now(), this.sampling?.windowMs || 60000); - - if (!this.passesWindowSampling(logCount)) { - return false; - } - - logCount.count++; - return true; - } - - /** - * Determines if a log entry passes rate-based sampling. - * @returns True if the log passes rate sampling, false otherwise. - */ - private passesRateSampling(): boolean { - if (!this.sampling?.rate) { - return true; - } - // eslint-disable-next-line sonarjs/pseudo-random - return Math.random() <= this.sampling.rate; - } - - /** - * Determines if a log entry passes window-based sampling constraints. - * @param logCount - The current log count and window start time. - * @returns True if the log passes window sampling, false otherwise. - */ - private passesWindowSampling(logCount: { count: number; windowStart: number }): boolean { - return !(this.sampling?.maxPerWindow && logCount.count >= this.sampling.maxPerWindow); - } - - /** - * Logs a message if it passes filtering and sampling checks. - * @param level - The log level. - * @param message - The log message. - * @param metadata - Optional metadata associated with the log. - * @param logAction - The action to perform if the log is allowed. - */ - private logIfAllowed( - level: LogLevel, - message: string, - metadata: ILogMetadata | undefined, - logAction: () => void, - ): void { - if (this.shouldLog(level, message, metadata)) { - logAction(); - } - } - - /** - * Retrieves or initializes the log count for a given key and time window. - * @param key - The key representing the log level or category. - * @param now - The current timestamp. - * @param windowMs - The duration of the time window in milliseconds. - * @returns The log count object containing the count and window start time. - */ - private getOrCreateLogCount( - key: string, - now: number, - windowMs: number, - ): { count: number; windowStart: number } { - let logCount = this.logCounts.get(key); - if (!logCount || now - logCount.windowStart > windowMs) { - logCount = { count: 0, windowStart: now }; - this.logCounts.set(key, logCount); - } - return logCount; - } -} diff --git a/src/logging/loggers/index.ts b/src/logging/loggers/index.ts deleted file mode 100644 index 882690d..0000000 --- a/src/logging/loggers/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// Core logger implementations -export { CompositeLogger } from './composite.js'; -export { FilteredLogger } from './filtered.js'; -export { MetricsLogger } from './metrics.js'; -export { MockLogger } from './mock.js'; -export { NoopLogger } from './noop.js'; - -// Factory functions -export { createCompositeLogger, createPinoLogger } from './factory.js'; diff --git a/src/logging/loggers/metrics.ts b/src/logging/loggers/metrics.ts deleted file mode 100644 index 328d646..0000000 --- a/src/logging/loggers/metrics.ts +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import { ILogger, ILoggerMetrics, ILogMetadata, LogLevel } from '../types.js'; - -/** - * Logger wrapper that collects metrics and telemetry - */ -export class MetricsLogger implements ILogger { - private startTime = Date.now(); - private metrics: ILoggerMetrics = { - totalLogs: 0, - logsByLevel: {}, - errors: 0, - warnings: 0, - logRate: 0, - lastUpdated: Date.now(), - infoLogs: 0, - debugLogs: 0, - warningLogs: 0, - errorLogs: 0, - failedLogs: 0, - groupedOperations: 0, - logsPerMinute: 0, - peakLogsPerMinute: 0, - averageLogSize: 0, - uptime: 0, - }; - private totalLogSize = 0; - - constructor( - private wrappedLogger: ILogger, - private metricsCallback?: (metrics: ILoggerMetrics) => void, - ) {} - - /** - * Logs an informational message and updates metrics. - * @param message - The message to log. - * @param metadata - Optional metadata to include with the log. - */ - info(message: string, metadata?: ILogMetadata): void { - this.recordLog('info', message, metadata); - this.wrappedLogger.info(message, metadata); - } - - /** - * Logs a debug message and updates metrics. - * @param message - The message to log. - */ - debug(message: string): void { - this.recordLog('debug', message); - this.wrappedLogger.debug(message); - } - - /** - * Logs a warning message and updates metrics. - * @param message - The message to log. - * @param metadata - Optional metadata to include with the log. - */ - warn(message: string, metadata?: ILogMetadata): void { - this.recordLog('warning', message, metadata); - this.wrappedLogger.warn(message, metadata); - } - - /** - * Logs an error message and updates metrics. - * @param message - The message to log. - * @param metadata - Optional metadata to include with the log. - */ - error(message: string, metadata?: ILogMetadata): void { - this.recordLog('error', message, metadata); - this.wrappedLogger.error(message, metadata); - } - - /** - * Logs a failure message and updates metrics. - * @param message - The failure message. - * @param metadata - Optional metadata to include with the failure. - */ - setFailed(message: string, metadata?: ILogMetadata): void { - this.recordLog(LogLevel.FAILED, message, metadata); - this.wrappedLogger.setFailed(message, metadata); - } - - /** - * Executes a grouped operation and tracks metrics. - * @param name - The name of the group. - * @param fn - The function to execute within the group. - * @returns A promise that resolves when the group operation completes. - */ - async group(name: string, fn: () => Promise): Promise { - this.metrics.groupedOperations++; - this.updateMetrics(); - return this.wrappedLogger.group(name, fn); - } - - /** - * Get current metrics snapshot - * @returns A copy of the current metrics - */ - getMetrics(): ILoggerMetrics { - this.updateMetrics(); - return { ...this.metrics }; - } - - /** - * Start periodic metrics reporting - * @param intervalMs - Reporting interval in milliseconds (default: 60000ms) - * @returns A function to stop the periodic reporting - */ - startMetricsReporting(intervalMs: number = 60000): () => void { - const interval = setInterval(() => { - // This would typically send metrics somewhere, but for now just update - this.updateMetrics(); - }, intervalMs); - - return () => clearInterval(interval); - } - - /** - * Records a log entry and updates metrics accordingly. - * @param level - The log level (e.g., 'info', 'error'). - * @param message - The log message. - * @param metadata - Optional metadata associated with the log. - */ - private recordLog(level: string, message?: string, metadata?: ILogMetadata): void { - this.incrementTotalLogs(); - this.updateLogsByLevel(level); - this.updateLogSize(message, metadata); - this.updateLevelMetrics(level); - this.updateLogTimestamps(); - } - - /** - * Increment the total logs counter. - */ - private incrementTotalLogs(): void { - this.metrics.totalLogs++; - } - - /** - * Update the logs by level counter. - */ - private updateLogsByLevel(level: string): void { - this.metrics.logsByLevel[level] = (this.metrics.logsByLevel[level] || 0) + 1; - } - - /** - * Update the total log size. - */ - private updateLogSize(message?: string, metadata?: ILogMetadata): void { - const logSize = (message?.length || 0) + (metadata ? JSON.stringify(metadata).length : 0); - this.totalLogSize += logSize; - } - - /** - * Update timestamp metrics for logging. - */ - private updateLogTimestamps(): void { - const now = Date.now(); - if (!this.metrics.firstLogTime) { - this.metrics.firstLogTime = now; - } - this.metrics.lastLogTime = now; - this.updateMetrics(); - } - - /** - * Updates metrics specific to the log level. - * @param level - The log level. - */ - private updateLevelMetrics(level: string): void { - const metricMap: Record void> = { - [LogLevel.INFO]: () => this.metrics.infoLogs++, - [LogLevel.DEBUG]: () => this.metrics.debugLogs++, - [LogLevel.WARNING]: () => { - this.metrics.warnings++; - this.metrics.warningLogs++; - }, - [LogLevel.ERROR]: () => { - this.metrics.errors++; - this.metrics.errorLogs++; - }, - [LogLevel.FAILED]: () => this.metrics.failedLogs++, - }; - - const updateFn = metricMap[level as LogLevel]; - if (updateFn) { - updateFn(); - } - } - - /** - * Updates overall metrics such as uptime, log rates, and averages. - */ - private updateMetrics(): void { - const now = Date.now(); - this.updateTimestamps(now); - this.updateUptime(now); - this.updateAverageLogSize(); - this.updateLogRates(now); - - // Call the metrics callback if provided - this.metricsCallback?.(this.metrics); - } - - /** - * Update timestamp-related metrics - */ - private updateTimestamps(now: number): void { - this.metrics.lastUpdated = now; - } - - /** - * Update uptime metric - */ - private updateUptime(now: number): void { - this.metrics.uptime = now - this.startTime; - } - - /** - * Update average log size metric - */ - private updateAverageLogSize(): void { - if (this.metrics.totalLogs > 0) { - this.metrics.averageLogSize = this.totalLogSize / this.metrics.totalLogs; - } - } - - /** - * Update log rate metrics - */ - private updateLogRates(now: number): void { - if (!this.metrics.firstLogTime) { - return; - } - - const durationMinutes = (now - this.metrics.firstLogTime) / (1000 * 60); - if (durationMinutes > 0) { - this.metrics.logsPerMinute = this.metrics.totalLogs / durationMinutes; - this.metrics.peakLogsPerMinute = Math.max( - this.metrics.peakLogsPerMinute, - this.metrics.logsPerMinute, - ); - } - } -} diff --git a/src/logging/loggers/mock.ts b/src/logging/loggers/mock.ts deleted file mode 100644 index 07fe0bf..0000000 --- a/src/logging/loggers/mock.ts +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import { ILogCall, ILogger, ILogMetadata, LogLevel } from '../types.js'; - -/** - * Mock logger implementation for testing purposes. - * Captures all log calls for verification in tests. - */ -export class MockLogger implements ILogger { - public calls: ILogCall[] = []; - - /** - * Records an informational log call for testing. - * @param message - The message to log. - * @param metadata - Optional metadata to include with the log. - */ - info(message: string, metadata?: ILogMetadata): void { - this.calls.push({ - level: LogLevel.INFO, - message, - metadata, - timestamp: new Date(), - }); - } - - /** - * Records a debug log call for testing. - * @param message - The message to log. - */ - debug(message: string): void { - this.calls.push({ level: LogLevel.DEBUG, message, timestamp: new Date() }); - } - - /** - * Records a warning log call for testing. - * @param message - The message to log. - * @param metadata - Optional metadata to include with the log. - */ - warn(message: string, metadata?: ILogMetadata): void { - this.calls.push({ - level: LogLevel.WARNING, - message, - metadata, - timestamp: new Date(), - }); - } - - /** - * Records an error log call for testing. - * @param message - The message to log. - * @param metadata - Optional metadata to include with the log. - */ - error(message: string, metadata?: ILogMetadata): void { - this.calls.push({ - level: LogLevel.ERROR, - message, - metadata, - timestamp: new Date(), - }); - } - - /** - * Records a failed log call for testing. - * @param message - The message to log. - * @param metadata - Optional metadata to include with the log. - */ - setFailed(message: string, metadata?: ILogMetadata): void { - this.calls.push({ - level: LogLevel.FAILED, - message, - metadata, - timestamp: new Date(), - }); - } - - /** - * Groups multiple log calls together. - * @param name - The name of the group. - * @param fn - The function containing the log calls to group. - */ - async group(name: string, fn: () => Promise): Promise { - const startCall: ILogCall = { - level: LogLevel.GROUP, - message: `START: ${name}`, - timestamp: new Date(), - }; - this.calls.push(startCall); - - try { - const result = await fn(); - this.calls.push({ - level: LogLevel.GROUP, - message: `END: ${name}`, - timestamp: new Date(), - }); - return result; - } catch (error) { - this.calls.push({ - level: LogLevel.GROUP, - message: `ERROR: ${name}`, - metadata: { error }, - timestamp: new Date(), - }); - throw error; - } - } - - /** - * Get all calls for a specific log level. - * @param level - The log level to filter by. - * @returns Array of log calls for the specified level. - */ - getCallsForLevel(level: LogLevel): ILogCall[] { - return this.calls.filter((call) => call.level === level); - } - - /** - * Get the last call made to the logger. - * @returns The last log call or undefined if no calls were made. - */ - getLastCall(): ILogCall | undefined { - return this.calls[this.calls.length - 1]; - } - - /** - * Clear all recorded calls. - */ - clear(): void { - this.calls = []; - } - - /** - * Assert that a specific call was made. - * @param level - The expected log level. - * @param message - Optional message or regex pattern to match. - * @throws Error if the assertion fails. - */ - assertCalled(level: LogLevel, message?: string | RegExp): void { - const calls = this.getCallsForLevel(level); - if (calls.length === 0) { - throw new Error(`Expected ${level} to be called, but it wasn't`); - } - - if (message !== undefined) { - const matchingCalls = - typeof message === 'string' - ? calls.filter((call) => call.message.includes(message)) - : calls.filter((call) => message.test(call.message)); - - if (matchingCalls.length === 0) { - throw new Error( - `Expected ${level} to be called with message matching "${message}", but it wasn't`, - ); - } - } - } - - /** - * Assert that no calls were made to a specific level. - * @param level - The log level to check. - * @throws Error if the assertion fails. - */ - assertNotCalled(level: LogLevel): void { - const calls = this.getCallsForLevel(level); - if (calls.length > 0) { - throw new Error( - `Expected ${level} not to be called, but it was called ${calls.length} times`, - ); - } - } -} diff --git a/src/logging/loggers/noop.ts b/src/logging/loggers/noop.ts deleted file mode 100644 index 5136fee..0000000 --- a/src/logging/loggers/noop.ts +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import { ILogger, ILogMetadata } from '../types.js'; - -/** - * No-op logger implementation that mimics pino.Logger interface. - * Useful as a fallback when Pino logger initialization fails. - */ -export class NoopLogger implements ILogger { - // Pino.Logger properties - level = 'silent'; - levelVal = 100; - msgPrefix = ''; - - /** - * Logs an info message (no-op). - * @param _message - Message to log as failure. - * @param _metadata - Optional metadata for the failure. - */ - info(_message: string, _metadata?: ILogMetadata): void { - /* No-op */ - } - - /** - * Logs a debug message (no-op). - * @param _message - Message to log as failure. - * @param _metadata - Optional metadata for the failure. - */ - debug(_message: string, _metadata?: ILogMetadata): void { - /* No-op */ - } - - /** - * Logs a warning message (no-op). - * @param _message - Message to log as failure. - * @param _metadata - Optional metadata for the failure. - */ - warn(_message: string, _metadata?: ILogMetadata): void { - /* No-op */ - } - - /** - * Logs an error message (no-op). - * @param _message - Message to log as failure. - * @param _metadata - Optional metadata for the failure. - */ - error(_message: string, _metadata?: ILogMetadata): void { - /* No-op */ - } - - /** - * Logs a fatal message (no-op). - * @param _message - Message to log as failure. - * @param _metadata - Optional metadata for the failure. - */ - fatal(_message: string, _metadata?: ILogMetadata): void { - /* No-op */ - } - - /** - * Logs a trace message (no-op). - * @param _message - Message to log as failure. - * @param _metadata - Optional metadata for the failure. - */ - trace(_message: string, _metadata?: ILogMetadata): void { - /* No-op */ - } - - /** - * Creates a child logger (returns self for no-op behavior). - * @param _obj - Child logger configuration. - * @returns A new NoopLogger instance. - */ - child(_obj: unknown): NoopLogger { - return new NoopLogger(); - } - - /** - * Creates a child logger with bindings (returns self for no-op behavior). - * @param _message - Message to log as failure. - * @param _metadata - Optional metadata for the failure. - */ - setFailed(_message: string, _metadata?: ILogMetadata): void { - /* No-op */ - } - - /** - * Executes a grouped operation (no-op). - * @param _name - Name of the group. - * @param _fn - Function to execute within the group. - * @returns The result of the function execution. - */ - group(_name: string, _fn: () => Promise): Promise { - return _fn(); - } -} diff --git a/src/logging/pino/index.ts b/src/logging/pino/index.ts index dcee10b..8894250 100644 --- a/src/logging/pino/index.ts +++ b/src/logging/pino/index.ts @@ -15,8 +15,4 @@ * */ -// Pino logger implementation export { PinoLogger } from './logger.js'; - -// Pino-specific types -export * from './types.js'; diff --git a/src/logging/pino/logger.ts b/src/logging/pino/logger.ts index 7c555ab..c73dc63 100644 --- a/src/logging/pino/logger.ts +++ b/src/logging/pino/logger.ts @@ -18,15 +18,15 @@ import pino from 'pino'; import type { OutputChannel } from 'vscode'; -import { NoopLogger } from '../loggers/noop.js'; -import { ILogger, ILogMetadata } from '../types.js'; +type LogMetadata = Record; /** - * Implementation of ILogger that uses Pino for structured logging. + * Minimal structured logger used by the extension. Falls back to a no-op implementation if pino + * fails to initialise in the host environment. */ -export class PinoLogger implements ILogger { +export class PinoLogger { private logger: pino.Logger; - private isAvailable: boolean = true; + private isAvailable = true; private static sharedOutputChannel?: OutputChannel; @@ -48,8 +48,7 @@ export class PinoLogger implements ILogger { } catch (error) { this.isAvailable = false; console.warn('Pino logger initialization failed:', error); - // Create a fallback null logger - this.logger = new NoopLogger() as unknown as pino.Logger; + this.logger = createFallbackLogger(); } } @@ -74,7 +73,7 @@ export class PinoLogger implements ILogger { * @param message - The message to log. * @param metadata - Optional metadata to include with the log. */ - info(message: string, metadata?: ILogMetadata): void { + info(message: string, metadata?: LogMetadata): void { this.logger.info(metadata || {}, message); this.appendToOutputChannel('INFO', message, metadata); } @@ -93,7 +92,7 @@ export class PinoLogger implements ILogger { * @param message - The message to log. * @param metadata - Optional metadata to include with the log. */ - warn(message: string, metadata?: ILogMetadata): void { + warn(message: string, metadata?: LogMetadata): void { this.logger.warn(metadata || {}, message); this.appendToOutputChannel('WARN', message, metadata); } @@ -103,7 +102,7 @@ export class PinoLogger implements ILogger { * @param message - The message to log. * @param metadata - Optional metadata to include with the log. */ - error(message: string, metadata?: ILogMetadata): void { + error(message: string, metadata?: LogMetadata): void { this.logger.error(metadata || {}, message); this.appendToOutputChannel('ERROR', message, metadata); } @@ -113,7 +112,7 @@ export class PinoLogger implements ILogger { * @param message - The failure message. * @param metadata - Optional metadata to include with the failure. */ - setFailed(message: string, metadata?: ILogMetadata): void { + setFailed(message: string, metadata?: LogMetadata): void { this.logger.fatal(metadata || {}, `Action failed: ${message}`); this.appendToOutputChannel('FATAL', `Action failed: ${message}`, metadata); } @@ -125,11 +124,9 @@ export class PinoLogger implements ILogger { * @returns A promise that resolves when the group operation completes. */ async group(name: string, fn: () => Promise): Promise { - // Create a child logger for the group context const childLogger = this.logger.child({ group: name }); const originalLogger = this.logger; - // Temporarily replace the logger with the child logger this.logger = childLogger; childLogger.info(`Starting group: ${name}`); this.appendToOutputChannel('GROUP', `Starting group: ${name}`); @@ -146,16 +143,11 @@ export class PinoLogger implements ILogger { }); throw error; } finally { - // Restore the original logger this.logger = originalLogger; } } - private appendToOutputChannel( - level: string, - message: string, - metadata?: Record, - ): void { + private appendToOutputChannel(level: string, message: string, metadata?: LogMetadata): void { const channel = PinoLogger.sharedOutputChannel; if (!channel) { return; @@ -168,7 +160,7 @@ export class PinoLogger implements ILogger { channel.appendLine(line); } - private formatMetadata(metadata?: Record): string | undefined { + private formatMetadata(metadata?: LogMetadata): string | undefined { if (!metadata || Object.keys(metadata).length === 0) { return undefined; } @@ -205,3 +197,19 @@ export class PinoLogger implements ILogger { } } } + +function createFallbackLogger(): pino.Logger { + const noop = (..._args: unknown[]) => { + /* no-op */ + }; + + const fallback: Record = {}; + fallback.info = noop; + fallback.debug = noop; + fallback.warn = noop; + fallback.error = noop; + fallback.fatal = noop; + fallback.child = () => fallback; + + return fallback as unknown as pino.Logger; +} diff --git a/src/logging/pino/types.ts b/src/logging/pino/types.ts deleted file mode 100644 index adf974d..0000000 --- a/src/logging/pino/types.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import * as pino from 'pino'; - -/** - * Configuration options for logger setup - */ -export interface IPinoLoggerConfig { - /** Log level for Pino logger */ - level?: pino.LevelWithSilent; - /** Enable pretty printing in development */ - prettyPrint?: boolean; - /** Custom Pino transport configuration */ - transport?: pino.TransportSingleOptions | pino.TransportMultiOptions; - /** Base metadata to include in all logs */ - base?: Record; - /** Enable Core console logger */ - enableCore?: boolean; - /** Enable Pino logger (structured logging) */ - enablePino?: boolean; - /** Custom log destination (file path, stream, etc.) */ - destination?: string | NodeJS.WritableStream; -} diff --git a/src/logging/types.ts b/src/logging/types.ts deleted file mode 100644 index 08f0b14..0000000 --- a/src/logging/types.ts +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/** - * Supported log levels - */ -export enum LogLevel { - DEBUG = 'debug', - INFO = 'info', - WARNING = 'warning', - ERROR = 'error', - FAILED = 'failed', - GROUP = 'group', -} - -/** - * Log filter function type - */ -export type LogFilter = ( - level: string, - message: string, - metadata?: Record, -) => boolean; - -/** - * Sampling strategy interface for controlling log sampling - */ -export interface ISamplingStrategy { - /** - * Determines if a log should be sampled - * @param level - Log level - * @param message - Log message - * @param metadata - Optional metadata - * @returns true if the log should be included, false if filtered out - */ - shouldSample?(level: LogLevel, message: string, metadata?: ILogMetadata): boolean; - - /** Sample rate (0.0 to 1.0) */ - rate: number; - /** Maximum logs per time window */ - maxPerWindow?: number; - /** Time window in milliseconds */ - windowMs?: number; -} - -/** - * Represents a single log call captured by the - * mock logger - */ -export interface ILogCall { - /** - * The log level - */ - level: LogLevel; - - /** - * The log message - */ - message: string; - - /** - * Optional metadata associated with the log - */ - metadata?: ILogMetadata; - - /** - * Timestamp when the log was captured - */ - timestamp: Date; -} - -/** - * Metadata associated with log messages, useful for - * enhanced logging with contextual information. - */ -export interface ILogMetadata { - /** - * A title for the annotation. - * */ - title?: string; - /** - * The path of the file for which the annotation - * should be created. - */ - file?: string; - /** - * The start line for the annotation. - */ - startLine?: number; - /** - * The end line for the annotation. Defaults to - * `startLine` when `startLine` is provided. - */ - endLine?: number; - /** - * The start column for the annotation. Cannot be sent - * when `startLine` and `endLine` are different values. - */ - startColumn?: number; - /** - * The end column for the annotation. Cannot be sent when - * `startLine` and `endLine` are different values. - * - * Defaults to `startColumn` when `startColumn` is provided. - */ - endColumn?: number; - /** - * Additional custom metadata fields for structured logging - */ - [key: string]: unknown; -} - -/** - * Logger metrics and statistics - */ -export interface ILoggerMetrics { - /** - * Total number of logs processed - */ - totalLogs: number; - /** - * Logs grouped by level - */ - logsByLevel: Record; - /** - * Number of error log - */ - errors: number; - /** - * Number of warning logs - */ - warnings: number; - /** - * Average logs per second - */ - logRate: number; - /** - * Timestamp when metrics were last updated - */ - lastUpdated: number; - /** - * Number of info level logs - */ - infoLogs: number; - /** - * Number of debug level logs - */ - debugLogs: number; - /** - * Number of warning level logs - */ - warningLogs: number; - /** - * Number of error level logs - */ - errorLogs: number; - /** - * Number of failed logs - */ - failedLogs: number; - /** - * Number of grouped operations - */ - groupedOperations: number; - /** - * Timestamp of first log - */ - firstLogTime?: number; - /** - * Timestamp of last log - */ - lastLogTime?: number; - /** - * Average logs per minute - */ - logsPerMinute: number; - /** - * Peak logs per minute - */ - peakLogsPerMinute: number; - /** - * Average size of log messages - */ - averageLogSize: number; - /** - * Uptime in milliseconds - */ - uptime: number; -} - -/** - * Interface for logging operations. - */ -export interface ILogger { - /** - * Logs an informational message. - * @param message - The message to log. - * @param metadata - Optional metadata to include with the log. - */ - info(message: string, metadata?: ILogMetadata): void; - - /** - * Logs a debug message. - * @param message - The message to log. - */ - debug(message: string): void; - - /** - * Logs a warning message. - * @param message - The message to log. - * @param metadata - Optional metadata to include with the log. - */ - warn(message: string, metadata?: ILogMetadata): void; - - /** - * Logs an error message. - * @param message - The message to log. - * @param metadata - Optional metadata to include with the log. - */ - error(message: string, metadata?: ILogMetadata): void; - - /** - * Sets the action as failed with the given message. - * @param message - The failure message. - * @param metadata - Optional metadata to include with the failure. - */ - setFailed(message: string, metadata?: ILogMetadata): void; - - /** - * Logs a group of messages. - * @param name - The name of the group. - * @param fn - The function to execute within the group. - */ - group(name: string, fn: () => Promise): Promise; -} diff --git a/src/test-utils/testHarness.ts b/src/test-utils/testHarness.ts new file mode 100644 index 0000000..c7d887f --- /dev/null +++ b/src/test-utils/testHarness.ts @@ -0,0 +1,195 @@ +import { + after as nodeAfter, + afterEach as nodeAfterEach, + before as nodeBefore, + beforeEach as nodeBeforeEach, + describe as nodeDescribe, + it as nodeIt, + mock as nodeMock, + test as nodeTest, +} from 'node:test'; + +import expectImport from 'expect'; + +type AnyFunction = (...args: any[]) => any; + +type MockState = { + calls: unknown[][]; + results: Array<{ type: 'return'; value?: unknown } | { type: 'throw'; error: unknown }>; +}; + +type JestLikeMock = ((...args: any[]) => any) & { + mock: MockState; + mockClear(): JestLikeMock; + mockReset(): JestLikeMock; + mockRestore(): JestLikeMock; + mockImplementation(impl: AnyFunction): JestLikeMock; + mockImplementationOnce(impl: AnyFunction): JestLikeMock; + mockReturnValue(value: unknown): JestLikeMock; + mockReturnValueOnce(value: unknown): JestLikeMock; + mockResolvedValue(value: unknown): JestLikeMock; + mockResolvedValueOnce(value: unknown): JestLikeMock; + mockRejectedValue(error: unknown): JestLikeMock; + mockRejectedValueOnce(error: unknown): JestLikeMock; + __restore?: () => void; +}; + +const activeMocks = new Set(); + +function recordCall(state: MockState, args: unknown[], invoke: () => unknown): unknown { + state.calls.push(args); + try { + const value = invoke(); + state.results.push({ type: 'return', value }); + return value; + } catch (error) { + state.results.push({ type: 'throw', error }); + throw error; + } +} + +function createState(): MockState { + return { calls: [], results: [] }; +} + +function createJestMock(implementation: AnyFunction = () => undefined): JestLikeMock { + let defaultImpl: AnyFunction = implementation; + const onceQueue: AnyFunction[] = []; + const state = createState(); + + const handler = function (this: unknown, ...args: unknown[]) { + return recordCall(state, args, () => { + const nextImpl = onceQueue.shift() ?? defaultImpl; + return nextImpl.apply(this, args); + }); + }; + + const nodeMockFn = nodeMock.fn(handler) as unknown as JestLikeMock; + + nodeMockFn.mock = state; + + nodeMockFn.mockClear = () => { + state.calls.length = 0; + state.results.length = 0; + return nodeMockFn; + }; + + nodeMockFn.mockReset = () => { + onceQueue.length = 0; + defaultImpl = implementation; + nodeMockFn.mockClear(); + return nodeMockFn; + }; + + nodeMockFn.mockRestore = () => { + nodeMockFn.mockReset(); + nodeMockFn.__restore?.(); + activeMocks.delete(nodeMockFn); + return nodeMockFn; + }; + + nodeMockFn.mockImplementation = (impl: AnyFunction) => { + defaultImpl = impl; + return nodeMockFn; + }; + + nodeMockFn.mockImplementationOnce = (impl: AnyFunction) => { + onceQueue.push(impl); + return nodeMockFn; + }; + + nodeMockFn.mockReturnValue = (value: unknown) => { + defaultImpl = () => value; + return nodeMockFn; + }; + + nodeMockFn.mockReturnValueOnce = (value: unknown) => { + onceQueue.push(() => value); + return nodeMockFn; + }; + + nodeMockFn.mockResolvedValue = (value: unknown) => { + defaultImpl = () => Promise.resolve(value); + return nodeMockFn; + }; + + nodeMockFn.mockResolvedValueOnce = (value: unknown) => { + onceQueue.push(() => Promise.resolve(value)); + return nodeMockFn; + }; + + nodeMockFn.mockRejectedValue = (error: unknown) => { + defaultImpl = () => Promise.reject(error); + return nodeMockFn; + }; + + nodeMockFn.mockRejectedValueOnce = (error: unknown) => { + onceQueue.push(() => Promise.reject(error)); + return nodeMockFn; + }; + + activeMocks.add(nodeMockFn); + + return nodeMockFn; +} + +function spyOn(object: Record, property: keyof typeof object): JestLikeMock { + const original = object[property] as AnyFunction; + const spy = createJestMock(function (this: unknown, ...args: unknown[]) { + return original.apply(this ?? object, args); + }); + + const wrapper = function (this: unknown, ...args: unknown[]) { + return spy.apply(this, args); + }; + + object[property] = wrapper; + + spy.__restore = () => { + object[property] = original; + }; + + return spy; +} + +function clearAllMocks(): void { + activeMocks.forEach((mockFn) => { + mockFn.mockClear(); + }); +} + +function resetAllMocks(): void { + activeMocks.forEach((mockFn) => { + mockFn.mockReset(); + }); +} + +function restoreAllMocks(): void { + activeMocks.forEach((mockFn) => { + mockFn.mockRestore(); + }); +} + +const jest = { + fn: (implementation?: AnyFunction) => createJestMock(implementation), + spyOn, + clearAllMocks, + resetAllMocks, + restoreAllMocks, +}; + +const expect = expectImport; + +export { + nodeAfter as after, + nodeAfterEach as afterEach, + nodeBefore as before, + nodeBeforeEach as beforeEach, + nodeDescribe as describe, + expect, + nodeIt as it, + jest, + nodeTest as test, +}; + +export type JestMockFunction = JestLikeMock; diff --git a/src/test/suite/barrel-content.builder.test.ts b/src/test/suite/barrel-content.builder.test.ts index 5ae8224..172af2b 100644 --- a/src/test/suite/barrel-content.builder.test.ts +++ b/src/test/suite/barrel-content.builder.test.ts @@ -1,6 +1,11 @@ import * as assert from 'assert'; -import { BarrelContentBuilder } from '../../core/services/barrel-content.builder.js'; +import { + BarrelContentBuilder, + BarrelEntryKind, + BarrelExportKind, + type BarrelEntry, +} from '../../core/services/barrel-content.builder.js'; suite('BarrelContentBuilder Test Suite', () => { let builder: BarrelContentBuilder; @@ -39,10 +44,20 @@ suite('BarrelContentBuilder Test Suite', () => { assert.strictEqual(content, "export { default } from './myFile';\n"); }); - test('Should handle default and named exports together', () => { - const exportsByFile = new Map([['myFile.ts', ['default', 'MyClass']]]); - const content = builder.buildContent(exportsByFile, '/some/path'); + test('Should handle default, type, and named exports together', () => { + const entries = new Map(); + entries.set('myFile.ts', { + kind: BarrelEntryKind.File, + exports: [ + { kind: BarrelExportKind.Default }, + { kind: BarrelExportKind.Type, name: 'MyInterface' }, + { kind: BarrelExportKind.Value, name: 'MyClass' }, + ], + }); + + const content = builder.buildContent(entries, '/some/path'); assert.ok(content.includes("export { MyClass } from './myFile';")); + assert.ok(content.includes("export type { MyInterface } from './myFile';")); assert.ok(content.includes("export { default } from './myFile';")); }); diff --git a/src/test/suite/barrel-file.generator.test.ts b/src/test/suite/barrel-file.generator.test.ts index 433139b..efcb502 100644 --- a/src/test/suite/barrel-file.generator.test.ts +++ b/src/test/suite/barrel-file.generator.test.ts @@ -45,9 +45,9 @@ suite('BarrelFileGenerator Test Suite', () => { const content = await fs.readFile(barrelPath, 'utf-8'); // Verify the barrel file contains expected exports - assert.ok(content.includes('MyClass')); + assert.ok(content.includes('export { MyClass } from')); assert.ok(content.includes('myConst')); - assert.ok(content.includes('MyInterface')); + assert.ok(content.includes('export type { MyInterface }')); assert.ok(content.includes('myFunction')); assert.ok(content.includes("from './file1'")); assert.ok(content.includes("from './file2'")); @@ -103,7 +103,7 @@ suite('BarrelFileGenerator Test Suite', () => { const content = await fs.readFile(barrelPath, 'utf-8'); // Verify the barrel file contains exports from file1 but not the old index.ts content - assert.ok(content.includes('MyClass')); + assert.ok(content.includes('export { MyClass } from')); assert.ok(!content.includes('IndexClass')); }); }); diff --git a/src/test/suite/export.parser.test.ts b/src/test/suite/export.parser.test.ts index 4275686..200ce9c 100644 --- a/src/test/suite/export.parser.test.ts +++ b/src/test/suite/export.parser.test.ts @@ -12,43 +12,43 @@ suite('ExportParser Test Suite', () => { test('Should extract class exports', () => { const content = 'export class MyClass {}'; const exports = parser.extractExports(content); - assert.deepStrictEqual(exports, ['MyClass']); + assert.deepStrictEqual(exports, [{ name: 'MyClass', typeOnly: false }]); }); test('Should extract interface exports', () => { const content = 'export interface MyInterface {}'; const exports = parser.extractExports(content); - assert.deepStrictEqual(exports, ['MyInterface']); + assert.deepStrictEqual(exports, [{ name: 'MyInterface', typeOnly: true }]); }); test('Should extract type exports', () => { const content = 'export type MyType = string;'; const exports = parser.extractExports(content); - assert.deepStrictEqual(exports, ['MyType']); + assert.deepStrictEqual(exports, [{ name: 'MyType', typeOnly: true }]); }); test('Should extract function exports', () => { const content = 'export function myFunction() {}'; const exports = parser.extractExports(content); - assert.deepStrictEqual(exports, ['myFunction']); + assert.deepStrictEqual(exports, [{ name: 'myFunction', typeOnly: false }]); }); test('Should extract const exports', () => { const content = 'export const myConst = 42;'; const exports = parser.extractExports(content); - assert.deepStrictEqual(exports, ['myConst']); + assert.deepStrictEqual(exports, [{ name: 'myConst', typeOnly: false }]); }); test('Should extract enum exports', () => { const content = 'export enum MyEnum { A, B }'; const exports = parser.extractExports(content); - assert.deepStrictEqual(exports, ['MyEnum']); + assert.deepStrictEqual(exports, [{ name: 'MyEnum', typeOnly: false }]); }); test('Should extract default exports', () => { const content = 'export default class MyClass {}'; const exports = parser.extractExports(content); - assert.ok(exports.includes('default')); + assert.ok(exports.some((entry) => entry.name === 'default')); }); test('Should extract multiple exports', () => { @@ -59,22 +59,22 @@ suite('ExportParser Test Suite', () => { `; const exports = parser.extractExports(content); assert.strictEqual(exports.length, 3); - assert.ok(exports.includes('MyClass')); - assert.ok(exports.includes('MyInterface')); - assert.ok(exports.includes('myConst')); + assert.ok(exports.some((entry) => entry.name === 'MyClass' && entry.typeOnly === false)); + assert.ok(exports.some((entry) => entry.name === 'MyInterface' && entry.typeOnly === true)); + assert.ok(exports.some((entry) => entry.name === 'myConst' && entry.typeOnly === false)); }); test('Should extract export lists', () => { const content = 'export { MyClass, MyInterface };'; const exports = parser.extractExports(content); - assert.ok(exports.includes('MyClass')); - assert.ok(exports.includes('MyInterface')); + assert.ok(exports.some((entry) => entry.name === 'MyClass')); + assert.ok(exports.some((entry) => entry.name === 'MyInterface')); }); test('Should handle export with as keyword', () => { const content = 'export { MyClass as RenamedClass };'; const exports = parser.extractExports(content); - assert.ok(exports.includes('MyClass')); + assert.ok(exports.some((entry) => entry.name === 'RenamedClass')); }); test('Should ignore comments', () => { @@ -84,7 +84,7 @@ suite('ExportParser Test Suite', () => { export class RealClass {} `; const exports = parser.extractExports(content); - assert.deepStrictEqual(exports, ['RealClass']); + assert.deepStrictEqual(exports, [{ name: 'RealClass', typeOnly: false }]); }); test('Should remove duplicates', () => { @@ -94,6 +94,6 @@ suite('ExportParser Test Suite', () => { `; const exports = parser.extractExports(content); assert.strictEqual(exports.length, 1); - assert.deepStrictEqual(exports, ['myConst']); + assert.deepStrictEqual(exports, [{ name: 'myConst', typeOnly: false }]); }); }); From 0011f23a010c3eaf054b6b8b21762242bcfda3d8 Mon Sep 17 00:00:00 2001 From: coderrob Date: Tue, 21 Oct 2025 18:20:34 -0500 Subject: [PATCH 11/20] feat: implement file system utility methods for directory management and temp directory creation --- .../services/barrel-file.generator.test.ts | 37 +++++++------ .../core/services/file-system.service.test.ts | 55 +++++++++++++++++++ src/core/services/file-system.service.ts | 49 +++++++++++++++++ 3 files changed, 123 insertions(+), 18 deletions(-) diff --git a/src/__tests__/core/services/barrel-file.generator.test.ts b/src/__tests__/core/services/barrel-file.generator.test.ts index 2a817d1..a2887fb 100644 --- a/src/__tests__/core/services/barrel-file.generator.test.ts +++ b/src/__tests__/core/services/barrel-file.generator.test.ts @@ -1,20 +1,22 @@ -import { promises as fs } from 'fs'; import * as os from 'os'; import * as path from 'path'; import type { Uri } from 'vscode'; import { BarrelFileGenerator } from '../../../core/services/barrel-file.generator'; +import { FileSystemService } from '../../../core/services/file-system.service'; describe('BarrelFileGenerator', () => { let tmpDir: string; + let fileSystem: FileSystemService; beforeEach(async () => { - tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'barrel-roll-')); + fileSystem = new FileSystemService(); + tmpDir = await fileSystem.createTempDirectory(path.join(os.tmpdir(), 'barrel-roll-')); }); afterEach(async () => { - await fs.rm(tmpDir, { recursive: true, force: true }); + await fileSystem.removePath(tmpDir); }); describe('generateBarrelFile', () => { @@ -22,37 +24,34 @@ describe('BarrelFileGenerator', () => { const nestedDir = path.join(tmpDir, 'nested'); const deeperDir = path.join(nestedDir, 'deeper'); - await fs.mkdir(deeperDir, { recursive: true }); + await fileSystem.ensureDirectory(deeperDir); - await fs.writeFile(path.join(tmpDir, 'alpha.ts'), 'export const alpha = 1;'); - await fs.writeFile( + await fileSystem.writeFile(path.join(tmpDir, 'alpha.ts'), 'export const alpha = 1;'); + await fileSystem.writeFile( path.join(nestedDir, 'bravo.ts'), ` export interface Bravo {} export default function bravo() {} `, - 'utf-8', ); - await fs.writeFile( + await fileSystem.writeFile( path.join(deeperDir, 'charlie.ts'), ` export { default as charlie } from './impl'; `, - 'utf-8', ); - await fs.writeFile( + await fileSystem.writeFile( path.join(deeperDir, 'impl.ts'), 'export default function impl() {}', - 'utf-8', ); const generator = new BarrelFileGenerator(); const rootUri = { fsPath: tmpDir } as unknown as Uri; await generator.generateBarrelFile(rootUri, { recursive: true }); - const rootIndex = await fs.readFile(path.join(tmpDir, 'index.ts'), 'utf-8'); - const nestedIndex = await fs.readFile(path.join(nestedDir, 'index.ts'), 'utf-8'); - const deeperIndex = await fs.readFile(path.join(deeperDir, 'index.ts'), 'utf-8'); + const rootIndex = await fileSystem.readFile(path.join(tmpDir, 'index.ts')); + const nestedIndex = await fileSystem.readFile(path.join(nestedDir, 'index.ts')); + const deeperIndex = await fileSystem.readFile(path.join(deeperDir, 'index.ts')); expect(rootIndex).toBe( ["export { alpha } from './alpha';", "export * from './nested';", ''].join('\n'), @@ -79,11 +78,11 @@ describe('BarrelFileGenerator', () => { const generator = new BarrelFileGenerator(); const rootUri = { fsPath: tmpDir } as unknown as Uri; - await fs.writeFile(path.join(tmpDir, 'index.ts'), "export * from '../outside';", 'utf-8'); + await fileSystem.writeFile(path.join(tmpDir, 'index.ts'), "export * from '../outside';"); await generator.generateBarrelFile(rootUri, { mode: 'updateExisting' }); - const rootIndex = await fs.readFile(path.join(tmpDir, 'index.ts'), 'utf-8'); + const rootIndex = await fileSystem.readFile(path.join(tmpDir, 'index.ts')); expect(rootIndex).toBe('\n'); }); @@ -91,12 +90,14 @@ describe('BarrelFileGenerator', () => { it('should skip creating barrels when updating non-existent ones', async () => { const generator = new BarrelFileGenerator(); const nestedDir = path.join(tmpDir, 'missing'); - await fs.mkdir(nestedDir); + await fileSystem.ensureDirectory(nestedDir); const nestedUri = { fsPath: nestedDir } as unknown as Uri; await generator.generateBarrelFile(nestedUri, { mode: 'updateExisting' }); - await expect(fs.stat(path.join(nestedDir, 'index.ts'))).rejects.toThrow(); + const exists = await fileSystem.fileExists(path.join(nestedDir, 'index.ts')); + + expect(exists).toBe(false); }); it('should throw when no TypeScript files are present and recursion is disabled', async () => { diff --git a/src/__tests__/core/services/file-system.service.test.ts b/src/__tests__/core/services/file-system.service.test.ts index 969ded0..fa44040 100644 --- a/src/__tests__/core/services/file-system.service.test.ts +++ b/src/__tests__/core/services/file-system.service.test.ts @@ -167,6 +167,61 @@ describe('FileSystemService', () => { }); }); + describe('ensureDirectory', () => { + it('should create directory recursively', async () => { + mockFs.mkdir.mockResolvedValue(undefined as never); + + await service.ensureDirectory('/path/to/dir'); + + expect(mockFs.mkdir).toHaveBeenCalledWith('/path/to/dir', { recursive: true }); + }); + + it('should throw error when directory creation fails', async () => { + mockFs.mkdir.mockRejectedValue(new Error('mkdir error')); + + await expect(service.ensureDirectory('/path/to/dir')).rejects.toThrow( + 'Failed to create directory /path/to/dir: mkdir error', + ); + }); + }); + + describe('removePath', () => { + it('should remove path recursively', async () => { + mockFs.rm.mockResolvedValue(undefined as never); + + await service.removePath('/path/to/remove'); + + expect(mockFs.rm).toHaveBeenCalledWith('/path/to/remove', { recursive: true, force: true }); + }); + + it('should throw error when removal fails', async () => { + mockFs.rm.mockRejectedValue(new Error('rm error')); + + await expect(service.removePath('/path/to/remove')).rejects.toThrow( + 'Failed to remove path /path/to/remove: rm error', + ); + }); + }); + + describe('createTempDirectory', () => { + it('should create temp directory with prefix', async () => { + mockFs.mkdtemp.mockResolvedValue('/tmp/foo123'); + + const result = await service.createTempDirectory('/tmp/foo-'); + + expect(result).toBe('/tmp/foo123'); + expect(mockFs.mkdtemp).toHaveBeenCalledWith('/tmp/foo-'); + }); + + it('should throw error when temp directory creation fails', async () => { + mockFs.mkdtemp.mockRejectedValue(new Error('mkdtemp error')); + + await expect(service.createTempDirectory('/tmp/foo-')).rejects.toThrow( + 'Failed to create temporary directory with prefix /tmp/foo-: mkdtemp error', + ); + }); + }); + describe('fileExists', () => { const fileExistsCases = [true, false] as const; diff --git a/src/core/services/file-system.service.ts b/src/core/services/file-system.service.ts index a64ee2e..2ce6c27 100644 --- a/src/core/services/file-system.service.ts +++ b/src/core/services/file-system.service.ts @@ -92,6 +92,55 @@ export class FileSystemService { } } + /** + * Creates a directory and all intermediate directories if needed. + * @param directoryPath The directory to create + */ + async ensureDirectory(directoryPath: string): Promise { + try { + await fs.mkdir(directoryPath, { recursive: true }); + } catch (error) { + throw new Error( + `Failed to create directory ${directoryPath}: ${ + error instanceof Error ? error.message : String(error) + }`, + ); + } + } + + /** + * Removes a file or directory tree. + * @param targetPath The path to remove + */ + async removePath(targetPath: string): Promise { + try { + await fs.rm(targetPath, { recursive: true, force: true }); + } catch (error) { + throw new Error( + `Failed to remove path ${targetPath}: ${ + error instanceof Error ? error.message : String(error) + }`, + ); + } + } + + /** + * Creates a temporary directory using the provided prefix. + * @param prefix The prefix for the temporary directory + * @returns The created directory path + */ + async createTempDirectory(prefix: string): Promise { + try { + return await fs.mkdtemp(prefix); + } catch (error) { + throw new Error( + `Failed to create temporary directory with prefix ${prefix}: ${ + error instanceof Error ? error.message : String(error) + }`, + ); + } + } + /** * Checks whether a file exists. * @param filePath The file path to check From f1b3a99eb66d0c6082c4f8211ccf8780144ef205 Mon Sep 17 00:00:00 2001 From: coderrob Date: Thu, 23 Oct 2025 18:46:32 -0500 Subject: [PATCH 12/20] feat: Refactor barrel structure and implement file system service - Introduced a new barrel structure in `src/core/barrel` to organize exports. - Replaced the old services index with specific barrel exports. - Added `FileSystemService` for handling file operations with comprehensive methods for reading, writing, and managing directories. - Created unit tests for `FileSystemService` to ensure functionality and error handling. - Implemented `ExportParser` for parsing TypeScript exports with tests to validate export extraction. - Added various barrel-related types and constants to improve type safety and maintainability. - Updated import paths across the codebase to reflect the new structure. - Introduced utility functions for array and string manipulation. --- src/__tests__/jest.setup.ts | 29 ------ .../barrel}/barrel-content.builder.test.ts | 8 +- .../barrel-content.builder.ts | 62 ++++--------- .../barrel}/barrel-file.generator.test.ts | 13 +-- .../barrel-file.generator.ts | 88 ++++++++++--------- src/core/barrel/index.ts | 4 + src/core/index.ts | 2 +- .../io}/file-system.service.test.ts | 7 +- .../{services => io}/file-system.service.ts | 18 ++-- .../parser}/export.parser.test.ts | 17 ++-- .../{services => parser}/export.parser.ts | 28 ++---- src/core/services/index.ts | 21 ----- src/extension.ts | 25 ++++-- src/logging/index.ts | 2 +- .../{pino/logger.ts => pino.logger.ts} | 0 src/logging/pino/index.ts | 18 ---- src/test/runTest.ts | 7 +- src/test/suite/barrel-content.builder.test.ts | 10 +-- src/test/suite/barrel-file.generator.test.ts | 10 +-- src/test/suite/export.parser.test.ts | 2 +- src/types/barrel/BarrelEntry.ts | 11 +++ src/types/barrel/BarrelEntryKind.ts | 4 + src/types/barrel/BarrelExport.ts | 14 +++ src/types/barrel/BarrelExportKind.ts | 5 ++ src/types/barrel/BarrelGenerationMode.ts | 4 + src/types/barrel/BarrelGenerationOptions.ts | 6 ++ .../NormalizedBarrelGenerationOptions.ts | 3 + src/types/barrel/ParsedExport.ts | 4 + src/types/barrel/index.ts | 8 ++ src/types/constants.ts | 4 + src/types/index.ts | 4 + src/utils/array.ts | 9 ++ src/utils/string.ts | 40 +++++++++ 33 files changed, 259 insertions(+), 228 deletions(-) delete mode 100644 src/__tests__/jest.setup.ts rename src/{__tests__/core/services => core/barrel}/barrel-content.builder.test.ts (95%) rename src/core/{services => barrel}/barrel-content.builder.ts (82%) rename src/{__tests__/core/services => core/barrel}/barrel-file.generator.test.ts (91%) rename src/core/{services => barrel}/barrel-file.generator.ts (70%) create mode 100644 src/core/barrel/index.ts rename src/{__tests__/core/services => core/io}/file-system.service.test.ts (98%) rename src/core/{services => io}/file-system.service.ts (89%) rename src/{__tests__/core/services => core/parser}/export.parser.test.ts (84%) rename src/core/{services => parser}/export.parser.ts (84%) delete mode 100644 src/core/services/index.ts rename src/logging/{pino/logger.ts => pino.logger.ts} (100%) delete mode 100644 src/logging/pino/index.ts create mode 100644 src/types/barrel/BarrelEntry.ts create mode 100644 src/types/barrel/BarrelEntryKind.ts create mode 100644 src/types/barrel/BarrelExport.ts create mode 100644 src/types/barrel/BarrelExportKind.ts create mode 100644 src/types/barrel/BarrelGenerationMode.ts create mode 100644 src/types/barrel/BarrelGenerationOptions.ts create mode 100644 src/types/barrel/NormalizedBarrelGenerationOptions.ts create mode 100644 src/types/barrel/ParsedExport.ts create mode 100644 src/types/barrel/index.ts create mode 100644 src/types/constants.ts create mode 100644 src/utils/array.ts create mode 100644 src/utils/string.ts diff --git a/src/__tests__/jest.setup.ts b/src/__tests__/jest.setup.ts deleted file mode 100644 index 202c837..0000000 --- a/src/__tests__/jest.setup.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -import { jest } from '@jest/globals'; - -// Make Jest globals available -global.jest = jest; -global.describe = describe; -global.it = it; -global.test = test; -global.expect = expect; -global.beforeEach = beforeEach; -global.afterEach = afterEach; -global.beforeAll = beforeAll; -global.afterAll = afterAll; diff --git a/src/__tests__/core/services/barrel-content.builder.test.ts b/src/core/barrel/barrel-content.builder.test.ts similarity index 95% rename from src/__tests__/core/services/barrel-content.builder.test.ts rename to src/core/barrel/barrel-content.builder.test.ts index 104cc03..c6e550d 100644 --- a/src/__tests__/core/services/barrel-content.builder.test.ts +++ b/src/core/barrel/barrel-content.builder.test.ts @@ -1,9 +1,5 @@ -import { - BarrelContentBuilder, - BarrelEntry, - BarrelEntryKind, - BarrelExportKind, -} from '../../../core/services/barrel-content.builder'; +import { BarrelContentBuilder } from './barrel-content.builder'; +import { BarrelEntry, BarrelEntryKind, BarrelExportKind } from '../../types'; describe('BarrelContentBuilder', () => { let builder: BarrelContentBuilder; diff --git a/src/core/services/barrel-content.builder.ts b/src/core/barrel/barrel-content.builder.ts similarity index 82% rename from src/core/services/barrel-content.builder.ts rename to src/core/barrel/barrel-content.builder.ts index 55b0c60..d9f63aa 100644 --- a/src/core/services/barrel-content.builder.ts +++ b/src/core/barrel/barrel-content.builder.ts @@ -1,39 +1,13 @@ -const DEFAULT_KEYWORD = 'default'; -const NEWLINE = '\n'; -const PARENT_DIRECTORY = '..'; - -export enum BarrelExportKind { - Value = 'value', - Type = 'type', - Default = 'default', -} - -export enum BarrelEntryKind { - File = 'file', - Directory = 'directory', -} - -export type BarrelExport = - | { - kind: BarrelExportKind.Value; - name: string; - } - | { - kind: BarrelExportKind.Type; - name: string; - } - | { - kind: BarrelExportKind.Default; - }; - -export type BarrelEntry = - | { - kind: BarrelEntryKind.File; - exports: BarrelExport[]; - } - | { - kind: BarrelEntryKind.Directory; - }; +import { + BARREL_DEFAULT_EXPORT_NAME, + BARREL_EXPORT_LINE_SEPARATOR, + BARREL_PARENT_DIRECTORY_SEGMENT, + BarrelEntry, + BarrelEntryKind, + BarrelExport, + BarrelExportKind, +} from '../../types/index.js'; +import { sortAlphabetically } from '../../utils/string.js'; /** * Service to build the content of a barrel file from exports. @@ -46,7 +20,7 @@ export class BarrelContentBuilder { const normalizedEntries = this.normalizeEntries(entries); // Sort files alphabetically for consistent output - const sortedPaths = Array.from(normalizedEntries.keys()).sort(); + const sortedPaths = sortAlphabetically(normalizedEntries.keys()); for (const relativePath of sortedPaths) { const entry = normalizedEntries.get(relativePath); @@ -61,7 +35,7 @@ export class BarrelContentBuilder { } // Add newline at end of file - return lines.join(NEWLINE) + NEWLINE; + return lines.join(BARREL_EXPORT_LINE_SEPARATOR) + BARREL_EXPORT_LINE_SEPARATOR; } /** @@ -87,7 +61,7 @@ export class BarrelContentBuilder { } private toLegacyExport(name: string): BarrelExport { - if (name === DEFAULT_KEYWORD) { + if (name === BARREL_DEFAULT_EXPORT_NAME) { return { kind: BarrelExportKind.Default }; } @@ -115,7 +89,7 @@ export class BarrelContentBuilder { */ private buildDirectoryExportLines(relativePath: string): string[] { const modulePath = this.getModulePath(relativePath); - if (modulePath.startsWith(PARENT_DIRECTORY)) { + if (modulePath.startsWith(BARREL_PARENT_DIRECTORY_SEGMENT)) { return []; } return [`export * from './${modulePath}';`]; @@ -129,7 +103,9 @@ export class BarrelContentBuilder { */ private buildFileExportLines(filePath: string, exports: BarrelExport[]): string[] { const cleanedExports = exports.filter((exp) => - exp.kind === BarrelExportKind.Default ? true : !exp.name.includes(PARENT_DIRECTORY), + exp.kind === BarrelExportKind.Default + ? true + : !exp.name.includes(BARREL_PARENT_DIRECTORY_SEGMENT), ); if (cleanedExports.length === 0) { @@ -140,7 +116,7 @@ export class BarrelContentBuilder { const modulePath = this.getModulePath(filePath); // Skip if this references a parent folder - if (modulePath.startsWith(PARENT_DIRECTORY)) { + if (modulePath.startsWith(BARREL_PARENT_DIRECTORY_SEGMENT)) { return []; } @@ -194,7 +170,7 @@ export class BarrelContentBuilder { // Remove .ts or .tsx extension let modulePath = filePath.replace(/\.tsx?$/, ''); // Normalize path separators for cross-platform compatibility - modulePath = modulePath.replace(/\\/g, '/'); + modulePath = modulePath.replaceAll('\\', '/'); return modulePath; } } diff --git a/src/__tests__/core/services/barrel-file.generator.test.ts b/src/core/barrel/barrel-file.generator.test.ts similarity index 91% rename from src/__tests__/core/services/barrel-file.generator.test.ts rename to src/core/barrel/barrel-file.generator.test.ts index a2887fb..bd91516 100644 --- a/src/__tests__/core/services/barrel-file.generator.test.ts +++ b/src/core/barrel/barrel-file.generator.test.ts @@ -2,9 +2,8 @@ import * as os from 'os'; import * as path from 'path'; import type { Uri } from 'vscode'; - -import { BarrelFileGenerator } from '../../../core/services/barrel-file.generator'; -import { FileSystemService } from '../../../core/services/file-system.service'; +import { BarrelGenerationMode } from '../../types'; +import { FileSystemService } from '../io/file-system.service'; describe('BarrelFileGenerator', () => { let tmpDir: string; @@ -80,7 +79,9 @@ describe('BarrelFileGenerator', () => { await fileSystem.writeFile(path.join(tmpDir, 'index.ts'), "export * from '../outside';"); - await generator.generateBarrelFile(rootUri, { mode: 'updateExisting' }); + await generator.generateBarrelFile(rootUri, { + mode: BarrelGenerationMode.UpdateExisting, + }); const rootIndex = await fileSystem.readFile(path.join(tmpDir, 'index.ts')); @@ -93,7 +94,9 @@ describe('BarrelFileGenerator', () => { await fileSystem.ensureDirectory(nestedDir); const nestedUri = { fsPath: nestedDir } as unknown as Uri; - await generator.generateBarrelFile(nestedUri, { mode: 'updateExisting' }); + await generator.generateBarrelFile(nestedUri, { + mode: BarrelGenerationMode.UpdateExisting, + }); const exists = await fileSystem.fileExists(path.join(nestedDir, 'index.ts')); diff --git a/src/core/services/barrel-file.generator.ts b/src/core/barrel/barrel-file.generator.ts similarity index 70% rename from src/core/services/barrel-file.generator.ts rename to src/core/barrel/barrel-file.generator.ts index 973da65..4e7de61 100644 --- a/src/core/services/barrel-file.generator.ts +++ b/src/core/barrel/barrel-file.generator.ts @@ -1,44 +1,43 @@ -import * as path from 'path'; +import * as path from 'node:path'; + import type { Uri } from 'vscode'; +import { BarrelExport } from '@/types/barrel/BarrelExport.js'; + import { - BarrelContentBuilder, - BarrelEntry, + BARREL_DEFAULT_EXPORT_NAME, + BARREL_INDEX_FILENAME, + type BarrelEntry, BarrelEntryKind, - BarrelExport, BarrelExportKind, -} from './barrel-content.builder'; -import { ExportParser, ParsedExport } from './export.parser'; -import { FileSystemService } from './file-system.service'; - -const INDEX_FILE_NAME = 'index.ts'; -const DEFAULT_EXPORT_NAME = 'default'; - -export type BarrelGenerationMode = 'createOrUpdate' | 'updateExisting'; - -export interface BarrelGenerationOptions { - recursive?: boolean; - mode?: BarrelGenerationMode; -} - -type NormalizedGenerationOptions = Required; + BarrelGenerationMode, + type BarrelGenerationOptions, + type NormalizedBarrelGenerationOptions, + type ParsedExport, +} from '../../types/index.js'; +import { isEmptyArray } from '../../utils/array.js'; +import { FileSystemService } from '../io/file-system.service.js'; +import { ExportParser } from '../parser/export.parser.js'; +import { BarrelContentBuilder } from './barrel-content.builder.js'; + +type NormalizedGenerationOptions = NormalizedBarrelGenerationOptions; /** * Service to generate or update a barrel (index.ts) file in a directory. */ export class BarrelFileGenerator { - private fileSystemService: FileSystemService; - private exportParser: ExportParser; - private barrelContentBuilder: BarrelContentBuilder; + private readonly barrelContentBuilder: BarrelContentBuilder; + private readonly exportParser: ExportParser; + private readonly fileSystemService: FileSystemService; constructor( fileSystemService?: FileSystemService, exportParser?: ExportParser, barrelContentBuilder?: BarrelContentBuilder, ) { - this.fileSystemService = fileSystemService || new FileSystemService(); - this.exportParser = exportParser || new ExportParser(); this.barrelContentBuilder = barrelContentBuilder || new BarrelContentBuilder(); + this.exportParser = exportParser || new ExportParser(); + this.fileSystemService = fileSystemService || new FileSystemService(); } /** @@ -52,11 +51,17 @@ export class BarrelFileGenerator { await this.generateBarrelFileFromPath(directoryUri.fsPath, normalizedOptions); } + /** + * Generates or updates a barrel file from a given directory path. + * @param directoryPath The directory path + * @param options Generation options + * @returns Promise that resolves when the barrel file has been created/updated. + */ private async generateBarrelFileFromPath( directoryPath: string, options: NormalizedGenerationOptions, ): Promise { - const barrelFilePath = path.join(directoryPath, INDEX_FILE_NAME); + const barrelFilePath = path.join(directoryPath, BARREL_INDEX_FILENAME); const { tsFiles, subdirectories } = await this.readDirectoryInfo(directoryPath); if (options.recursive) { @@ -90,11 +95,14 @@ export class BarrelFileGenerator { options: NormalizedGenerationOptions, ): Promise { for (const subdirectoryPath of subdirectories) { - if ( - options.mode === 'updateExisting' && - !(await this.fileSystemService.fileExists(path.join(subdirectoryPath, INDEX_FILE_NAME))) - ) { - continue; + if (options.mode === BarrelGenerationMode.UpdateExisting) { + const hasIndex = await this.fileSystemService.fileExists( + path.join(subdirectoryPath, BARREL_INDEX_FILENAME), + ); + + if (!hasIndex) { + continue; + } } await this.generateBarrelFileFromPath(subdirectoryPath, options); @@ -123,7 +131,7 @@ export class BarrelFileGenerator { const content = await this.fileSystemService.readFile(filePath); const parsedExports = this.exportParser.extractExports(content); const exports = this.normalizeParsedExports(parsedExports); - if (exports.length === 0) { + if (isEmptyArray(exports)) { continue; } @@ -138,7 +146,7 @@ export class BarrelFileGenerator { entries: Map, ): Promise { for (const subdirectoryPath of subdirectories) { - const barrelPath = path.join(subdirectoryPath, INDEX_FILE_NAME); + const barrelPath = path.join(subdirectoryPath, BARREL_INDEX_FILENAME); if (!(await this.fileSystemService.fileExists(barrelPath))) { continue; } @@ -157,7 +165,7 @@ export class BarrelFileGenerator { return true; } - if (options.mode === 'updateExisting') { + if (options.mode === BarrelGenerationMode.UpdateExisting) { return hasExistingIndex; } @@ -171,21 +179,21 @@ export class BarrelFileGenerator { private normalizeOptions(options?: BarrelGenerationOptions): NormalizedGenerationOptions { return { recursive: options?.recursive ?? false, - mode: options?.mode ?? 'createOrUpdate', + mode: options?.mode ?? BarrelGenerationMode.CreateOrUpdate, }; } private normalizeParsedExports(exports: ParsedExport[]): BarrelExport[] { return exports.map((exp) => { - if (exp.name === DEFAULT_EXPORT_NAME) { - return { kind: BarrelExportKind.Default } as BarrelExport; + if (exp.name === BARREL_DEFAULT_EXPORT_NAME) { + return { kind: BarrelExportKind.Default }; } - if (exp.typeOnly) { - return { kind: BarrelExportKind.Type, name: exp.name } as BarrelExport; - } + const entry: BarrelExport = exp.typeOnly + ? { kind: BarrelExportKind.Type, name: exp.name } + : { kind: BarrelExportKind.Value, name: exp.name }; - return { kind: BarrelExportKind.Value, name: exp.name } as BarrelExport; + return entry; }); } } diff --git a/src/core/barrel/index.ts b/src/core/barrel/index.ts new file mode 100644 index 0000000..bca64b8 --- /dev/null +++ b/src/core/barrel/index.ts @@ -0,0 +1,4 @@ +export * from '../io/file-system.service.js'; +export * from '../parser/export.parser.js'; +export * from './barrel-content.builder.js'; +export * from './barrel-file.generator.js'; diff --git a/src/core/index.ts b/src/core/index.ts index 2311989..5aa7b45 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -16,4 +16,4 @@ */ // Export core barrel roll functionality -export * from './services/index.js'; +export * from './barrel/index.js'; diff --git a/src/__tests__/core/services/file-system.service.test.ts b/src/core/io/file-system.service.test.ts similarity index 98% rename from src/__tests__/core/services/file-system.service.test.ts rename to src/core/io/file-system.service.test.ts index fa44040..511327e 100644 --- a/src/__tests__/core/services/file-system.service.test.ts +++ b/src/core/io/file-system.service.test.ts @@ -4,7 +4,7 @@ import * as path from 'path'; import { beforeEach, describe, expect, it } from '@jest/globals'; -import { FileSystemService } from '../../../core/services/file-system.service.js'; +import { FileSystemService } from './file-system.service.js'; jest.mock('fs/promises'); @@ -26,9 +26,12 @@ describe('FileSystemService', () => { isDirectory: () => true, }) as unknown as Dirent; + afterEach(() => { + jest.clearAllMocks(); + }); + beforeEach(() => { service = new FileSystemService(); - jest.clearAllMocks(); }); describe('getTypeScriptFiles', () => { diff --git a/src/core/services/file-system.service.ts b/src/core/io/file-system.service.ts similarity index 89% rename from src/core/services/file-system.service.ts rename to src/core/io/file-system.service.ts index 2ce6c27..19e78d8 100644 --- a/src/core/services/file-system.service.ts +++ b/src/core/io/file-system.service.ts @@ -1,6 +1,6 @@ -import { Dirent } from 'fs'; -import * as fs from 'fs/promises'; -import * as path from 'path'; +import { Dirent } from 'node:fs'; +import * as fs from 'node:fs/promises'; +import * as path from 'node:path'; const INDEX_FILE_NAME = 'index.ts'; const IGNORED_DIRECTORIES = new Set(['node_modules', '.git']); @@ -37,7 +37,7 @@ export class FileSystemService { /** * Checks if a directory entry is a TypeScript file (excluding index.ts). * @param entry The directory entry - * @returns True if it's a TypeScript file + * @returns True if it's a TypeScript file; otherwise, false */ private isTypeScriptFile(entry: Dirent): boolean { if (!entry.isFile()) { @@ -54,7 +54,7 @@ export class FileSystemService { /** * Determines if the entry is a traversable directory. * @param entry The directory entry - * @returns True if the directory should be traversed + * @returns True if the directory should be traversed; otherwise, false */ private isTraversableDirectory(entry: Dirent): boolean { return ( @@ -66,6 +66,7 @@ export class FileSystemService { * Reads the content of a file. * @param filePath The file path to read * @returns The file content as a string + * @throws Error if the read operation fails */ async readFile(filePath: string): Promise { try { @@ -81,6 +82,7 @@ export class FileSystemService { * Writes content to a file. * @param filePath The file path to write to * @param content The content to write + * @throws Error if the write operation fails */ async writeFile(filePath: string, content: string): Promise { try { @@ -95,6 +97,7 @@ export class FileSystemService { /** * Creates a directory and all intermediate directories if needed. * @param directoryPath The directory to create + * @throws Error if the directory creation fails */ async ensureDirectory(directoryPath: string): Promise { try { @@ -111,6 +114,7 @@ export class FileSystemService { /** * Removes a file or directory tree. * @param targetPath The path to remove + * @throws Error if the removal fails */ async removePath(targetPath: string): Promise { try { @@ -128,6 +132,7 @@ export class FileSystemService { * Creates a temporary directory using the provided prefix. * @param prefix The prefix for the temporary directory * @returns The created directory path + * @throws Error if the directory creation fails */ async createTempDirectory(prefix: string): Promise { try { @@ -144,7 +149,8 @@ export class FileSystemService { /** * Checks whether a file exists. * @param filePath The file path to check - * @returns True if the file exists + * @returns True if the file exists; otherwise, false + * @throws Error if an unexpected error occurs */ async fileExists(filePath: string): Promise { try { diff --git a/src/__tests__/core/services/export.parser.test.ts b/src/core/parser/export.parser.test.ts similarity index 84% rename from src/__tests__/core/services/export.parser.test.ts rename to src/core/parser/export.parser.test.ts index feb6344..6e6d5a7 100644 --- a/src/__tests__/core/services/export.parser.test.ts +++ b/src/core/parser/export.parser.test.ts @@ -1,4 +1,4 @@ -import { ExportParser } from '../../../core/services/export.parser'; +import { ExportParser } from './export.parser'; describe('ExportParser', () => { let parser: ExportParser; @@ -34,11 +34,8 @@ describe('ExportParser', () => { expect(result).toHaveLength(7); }); - it('should return an empty array when no exports exist', () => { - const result = parser.extractExports('const unused = 1;'); - - expect(result).toEqual([]); - }); + it('should return an empty array when no exports exist', () => + expect(parser.extractExports('const unused = 1;')).toEqual([])); const extractCases: Array<{ source: string; expected: { name: string; typeOnly: boolean } }> = [ { @@ -56,10 +53,8 @@ describe('ExportParser', () => { ]; // Table-driven tests follow the convention of omitting human-readable titles; prefer standalone tests when unique naming is needed. - it.each(extractCases)('should capture simple export pattern %#', ({ source, expected }) => { - const result = parser.extractExports(source); - - expect(result).toContainEqual(expected); - }); + it.each(extractCases)('should capture simple export pattern %#', ({ source, expected }) => + expect(parser.extractExports(source)).toContainEqual(expected), + ); }); }); diff --git a/src/core/services/export.parser.ts b/src/core/parser/export.parser.ts similarity index 84% rename from src/core/services/export.parser.ts rename to src/core/parser/export.parser.ts index f60696c..46bd287 100644 --- a/src/core/services/export.parser.ts +++ b/src/core/parser/export.parser.ts @@ -1,9 +1,5 @@ -const DEFAULT_EXPORT_NAME = 'default'; - -export interface ParsedExport { - name: string; - typeOnly: boolean; -} +import { BARREL_DEFAULT_EXPORT_NAME, type ParsedExport } from '../../types/index.js'; +import { splitAndClean } from '../../utils/string.js'; /** * Service responsible for parsing TypeScript exports. @@ -32,7 +28,7 @@ export class ExportParser { const result = Array.from(exportMap.values()); if (hasDefaultExport) { - result.push({ name: DEFAULT_EXPORT_NAME, typeOnly: false }); + result.push({ name: BARREL_DEFAULT_EXPORT_NAME, typeOnly: false }); } return result; @@ -45,9 +41,9 @@ export class ExportParser { */ private removeComments(content: string): string { // Remove multi-line comments - let result = content.replace(/\/\*[\s\S]*?\*\//g, ''); + let result = content.replaceAll(/\/\*[\s\S]*?\*\//g, ''); // Remove single-line comments - result = result.replace(/\/\/.*$/gm, ''); + result = result.replaceAll(/\/\/.*$/gm, ''); return result; } @@ -73,7 +69,7 @@ export class ExportParser { const entries = this.parseExportListEntries(match[2], Boolean(match[1])); for (const { name, typeOnly } of entries) { - if (name.toLowerCase() === DEFAULT_EXPORT_NAME) { + if (name.toLowerCase() === BARREL_DEFAULT_EXPORT_NAME) { hasDefault = true; continue; } @@ -91,17 +87,11 @@ export class ExportParser { ): Array<{ name: string; typeOnly: boolean }> { return rawList .split(',') - .map((segment) => segment.trim()) - .filter((segment) => segment.length > 0) + .flatMap((segment) => splitAndClean(segment)) .map((segment) => { - const tokens = segment - .split(/\s+as\s+/i) - .map((token) => token.trim()) - .filter((token) => token.length > 0); - + const tokens = splitAndClean(segment, /\s+as\s+/i); const sourceToken = tokens[0] ?? ''; - const aliasToken = tokens[tokens.length - 1] ?? ''; - + const aliasToken = tokens.at(-1) ?? ''; const typeOnly = typeModifierPresent || /^type\s+/i.test(sourceToken); const cleanedName = typeOnly ? aliasToken.replace(/^type\s+/i, '') : aliasToken; diff --git a/src/core/services/index.ts b/src/core/services/index.ts deleted file mode 100644 index 272c973..0000000 --- a/src/core/services/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -export * from './barrel-content.builder.js'; -export * from './barrel-file.generator.js'; -export * from './export.parser.js'; -export * from './file-system.service.js'; diff --git a/src/extension.ts b/src/extension.ts index e1aae81..6183788 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,11 +1,10 @@ -import * as path from 'path'; +import * as path from 'node:path'; + import * as vscode from 'vscode'; -import { - BarrelFileGenerator, - type BarrelGenerationOptions, -} from './core/services/barrel-file.generator'; -import { PinoLogger } from './logging/pino/logger.js'; +import { BarrelFileGenerator } from './core/barrel/barrel-file.generator.js'; +import { PinoLogger } from './logging/pino.logger.js'; +import { BarrelGenerationMode, type BarrelGenerationOptions } from './types/index.js'; type CommandDescriptor = { id: string; @@ -27,13 +26,19 @@ export function activate(context: vscode.ExtensionContext) { const descriptors: CommandDescriptor[] = [ { id: 'barrel-roll.generateBarrel', - options: { recursive: false, mode: 'createOrUpdate' }, + options: { + recursive: false, + mode: BarrelGenerationMode.CreateOrUpdate, + }, progressTitle: 'Barrel Roll: Updating barrel...', successMessage: 'Barrel Roll: index.ts updated.', }, { id: 'barrel-roll.generateBarrelRecursive', - options: { recursive: true, mode: 'createOrUpdate' }, + options: { + recursive: true, + mode: BarrelGenerationMode.CreateOrUpdate, + }, progressTitle: 'Barrel Roll: Updating barrels recursively...', successMessage: 'Barrel Roll: index.ts files updated recursively.', }, @@ -45,7 +50,9 @@ export function activate(context: vscode.ExtensionContext) { } } -export function deactivate() {} +export function deactivate(): void { + /* no-op */ +} function registerBarrelCommand( generator: BarrelFileGenerator, diff --git a/src/logging/index.ts b/src/logging/index.ts index 24c4c26..c1795f5 100644 --- a/src/logging/index.ts +++ b/src/logging/index.ts @@ -15,4 +15,4 @@ * */ -export { PinoLogger } from './pino/logger.js'; +export { PinoLogger } from './pino.logger.js'; diff --git a/src/logging/pino/logger.ts b/src/logging/pino.logger.ts similarity index 100% rename from src/logging/pino/logger.ts rename to src/logging/pino.logger.ts diff --git a/src/logging/pino/index.ts b/src/logging/pino/index.ts deleted file mode 100644 index 8894250..0000000 --- a/src/logging/pino/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2025 Robert Lindley - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -export { PinoLogger } from './logger.js'; diff --git a/src/test/runTest.ts b/src/test/runTest.ts index 9cdb824..2a7f62a 100644 --- a/src/test/runTest.ts +++ b/src/test/runTest.ts @@ -1,7 +1,8 @@ +import * as os from 'node:os'; +import * as path from 'node:path'; +import { fileURLToPath } from 'node:url'; + import { runTests } from '@vscode/test-electron'; -import * as os from 'os'; -import * as path from 'path'; -import { fileURLToPath } from 'url'; async function main(): Promise { try { diff --git a/src/test/suite/barrel-content.builder.test.ts b/src/test/suite/barrel-content.builder.test.ts index 172af2b..efffb54 100644 --- a/src/test/suite/barrel-content.builder.test.ts +++ b/src/test/suite/barrel-content.builder.test.ts @@ -1,11 +1,7 @@ -import * as assert from 'assert'; +import * as assert from 'node:assert'; -import { - BarrelContentBuilder, - BarrelEntryKind, - BarrelExportKind, - type BarrelEntry, -} from '../../core/services/barrel-content.builder.js'; +import { BarrelContentBuilder } from '../../core/barrel/barrel-content.builder.js'; +import { BarrelEntryKind, BarrelExportKind, type BarrelEntry } from '../../types/index.js'; suite('BarrelContentBuilder Test Suite', () => { let builder: BarrelContentBuilder; diff --git a/src/test/suite/barrel-file.generator.test.ts b/src/test/suite/barrel-file.generator.test.ts index efcb502..71ccfbf 100644 --- a/src/test/suite/barrel-file.generator.test.ts +++ b/src/test/suite/barrel-file.generator.test.ts @@ -1,12 +1,10 @@ -import * as assert from 'assert'; -import * as fs from 'fs/promises'; -import * as os from 'os'; -import * as path from 'path'; +import * as assert from 'node:assert'; +import * as fs from 'node:fs/promises'; +import * as os from 'node:os'; +import * as path from 'node:path'; import * as vscode from 'vscode'; -import { BarrelFileGenerator } from '../../core/services/barrel-file.generator.js'; - suite('BarrelFileGenerator Test Suite', () => { let testDir: string; diff --git a/src/test/suite/export.parser.test.ts b/src/test/suite/export.parser.test.ts index 200ce9c..a8e9580 100644 --- a/src/test/suite/export.parser.test.ts +++ b/src/test/suite/export.parser.test.ts @@ -1,6 +1,6 @@ import * as assert from 'assert'; -import { ExportParser } from '../../core/services/export.parser.js'; +import { ExportParser } from '../../core/parser/export.parser.js'; suite('ExportParser Test Suite', () => { let parser: ExportParser; diff --git a/src/types/barrel/BarrelEntry.ts b/src/types/barrel/BarrelEntry.ts new file mode 100644 index 0000000..e2c85a5 --- /dev/null +++ b/src/types/barrel/BarrelEntry.ts @@ -0,0 +1,11 @@ +import { BarrelEntryKind } from './BarrelEntryKind'; +import { BarrelExport } from './BarrelExport'; + +export type BarrelEntry = + | { + kind: BarrelEntryKind.File; + exports: BarrelExport[]; + } + | { + kind: BarrelEntryKind.Directory; + }; diff --git a/src/types/barrel/BarrelEntryKind.ts b/src/types/barrel/BarrelEntryKind.ts new file mode 100644 index 0000000..8434d5b --- /dev/null +++ b/src/types/barrel/BarrelEntryKind.ts @@ -0,0 +1,4 @@ +export enum BarrelEntryKind { + File = 'file', + Directory = 'directory', +} diff --git a/src/types/barrel/BarrelExport.ts b/src/types/barrel/BarrelExport.ts new file mode 100644 index 0000000..b007d9a --- /dev/null +++ b/src/types/barrel/BarrelExport.ts @@ -0,0 +1,14 @@ +import { BarrelExportKind } from './BarrelExportKind'; + +export type BarrelExport = + | { + kind: BarrelExportKind.Value; + name: string; + } + | { + kind: BarrelExportKind.Type; + name: string; + } + | { + kind: BarrelExportKind.Default; + }; diff --git a/src/types/barrel/BarrelExportKind.ts b/src/types/barrel/BarrelExportKind.ts new file mode 100644 index 0000000..8e74358 --- /dev/null +++ b/src/types/barrel/BarrelExportKind.ts @@ -0,0 +1,5 @@ +export enum BarrelExportKind { + Value = 'value', + Type = 'type', + Default = 'default', +} diff --git a/src/types/barrel/BarrelGenerationMode.ts b/src/types/barrel/BarrelGenerationMode.ts new file mode 100644 index 0000000..ef02b2c --- /dev/null +++ b/src/types/barrel/BarrelGenerationMode.ts @@ -0,0 +1,4 @@ +export enum BarrelGenerationMode { + CreateOrUpdate = 'createOrUpdate', + UpdateExisting = 'updateExisting', +} diff --git a/src/types/barrel/BarrelGenerationOptions.ts b/src/types/barrel/BarrelGenerationOptions.ts new file mode 100644 index 0000000..0d8a713 --- /dev/null +++ b/src/types/barrel/BarrelGenerationOptions.ts @@ -0,0 +1,6 @@ +import { BarrelGenerationMode } from './BarrelGenerationMode'; + +export interface BarrelGenerationOptions { + recursive?: boolean; + mode?: BarrelGenerationMode; +} diff --git a/src/types/barrel/NormalizedBarrelGenerationOptions.ts b/src/types/barrel/NormalizedBarrelGenerationOptions.ts new file mode 100644 index 0000000..234a603 --- /dev/null +++ b/src/types/barrel/NormalizedBarrelGenerationOptions.ts @@ -0,0 +1,3 @@ +import { BarrelGenerationOptions } from './BarrelGenerationOptions'; + +export type NormalizedBarrelGenerationOptions = Required; diff --git a/src/types/barrel/ParsedExport.ts b/src/types/barrel/ParsedExport.ts new file mode 100644 index 0000000..89666f7 --- /dev/null +++ b/src/types/barrel/ParsedExport.ts @@ -0,0 +1,4 @@ +export interface ParsedExport { + name: string; + typeOnly: boolean; +} diff --git a/src/types/barrel/index.ts b/src/types/barrel/index.ts new file mode 100644 index 0000000..290da49 --- /dev/null +++ b/src/types/barrel/index.ts @@ -0,0 +1,8 @@ +export * from './BarrelEntry.js'; +export * from './BarrelEntryKind.js'; +export * from './BarrelExport.js'; +export * from './BarrelExportKind.js'; +export * from './BarrelGenerationMode.js'; +export * from './BarrelGenerationOptions.js'; +export * from './NormalizedBarrelGenerationOptions.js'; +export * from './ParsedExport.js'; diff --git a/src/types/constants.ts b/src/types/constants.ts new file mode 100644 index 0000000..a44b735 --- /dev/null +++ b/src/types/constants.ts @@ -0,0 +1,4 @@ +export const BARREL_DEFAULT_EXPORT_NAME = 'default'; +export const BARREL_EXPORT_LINE_SEPARATOR = '\n'; +export const BARREL_PARENT_DIRECTORY_SEGMENT = '..'; +export const BARREL_INDEX_FILENAME = 'index.ts'; diff --git a/src/types/index.ts b/src/types/index.ts index 1ae80f1..bb1a004 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,2 +1,6 @@ // Export environment variable types export { type IEnvironmentVariables } from './env.js'; + +// Export barrel-related shared types and constants +export * from './barrel/index.js'; +export * from './constants.js'; diff --git a/src/utils/array.ts b/src/utils/array.ts new file mode 100644 index 0000000..6289116 --- /dev/null +++ b/src/utils/array.ts @@ -0,0 +1,9 @@ +/** + * Determines whether the provided array is either missing or contains no elements. + * + * @param value - The array-like value to inspect. + * @returns True when the input is `null`, `undefined`, or has a length of zero; otherwise false. + */ +export function isEmptyArray(value: readonly T[] | null | undefined): boolean { + return !value || value.length === 0; +} diff --git a/src/utils/string.ts b/src/utils/string.ts new file mode 100644 index 0000000..499e92c --- /dev/null +++ b/src/utils/string.ts @@ -0,0 +1,40 @@ +/** + * Splits a string by the given delimiter, trims whitespace from each fragment, + * and removes any empty fragments. + * + * @param value - The string to split and clean. + * @param delimiter - The delimiter to split the string by. Defaults to a comma. + * @returns An array of cleaned string fragments. + */ +export function splitAndClean(value: string, delimiter: string | RegExp = /,/): string[] { + return value + .split(delimiter) + .map((fragment) => fragment.trim()) + .filter((fragment) => fragment.length > 0); +} + +/** + * Returns a new array of strings sorted alphabetically using locale-aware comparison. + * + * @param values - Iterable collection of string values to sort. + * @param locale - Optional locale or locales to use for comparison. + * @param options - Optional Intl.Collator configuration for fine-grained control. + * @returns A new array containing the sorted values. + */ +export function sortAlphabetically( + values: Iterable, + locale?: string | string[], + options?: Intl.CollatorOptions, +): string[] { + const entries = Array.from(values); + + if (entries.length <= 1) { + return entries; + } + + if (locale !== undefined || options !== undefined) { + return entries.sort((a, b) => a.localeCompare(b, locale, options)); + } + + return entries.sort((a, b) => a.localeCompare(b)); +} From 1c8f4a831de9d9fc1c9a1a1fa48c1d62d6ab10cb Mon Sep 17 00:00:00 2001 From: coderrob Date: Thu, 23 Oct 2025 20:16:43 -0500 Subject: [PATCH 13/20] refactor: update import paths to use node built-in modules refactor: replace barrel file constants with INDEX_FILENAME and DEFAULT_EXPORT_NAME refactor: clean up test files to use expect instead of assert refactor: remove deprecated test harness and migrate to node:test refactor: enhance type definitions with JSDoc comments for clarity fix: update tsconfig to exclude test files and improve module resolution test: add utility functions for string manipulation and their corresponding tests --- .dependency-cruiser.js | 13 +- ARCHITECTURE.md | 32 +- eslint.config.mjs | 8 - jest.config.cjs | 46 - package-lock.json | 10320 ++++++---------- package.json | 4 - .../barrel/barrel-content.builder.test.ts | 28 +- src/core/barrel/barrel-content.builder.ts | 18 +- src/core/barrel/barrel-file.generator.test.ts | 19 +- src/core/barrel/barrel-file.generator.ts | 12 +- src/core/barrel/index.ts | 2 - src/core/io/file-system.service.test.ts | 15 +- src/core/io/file-system.service.ts | 5 +- src/core/io/index.ts | 1 + src/core/parser/export.parser.ts | 6 +- src/core/parser/index.ts | 1 + src/logging/pino.logger.ts | 12 +- src/test-utils/testHarness.ts | 195 - src/test/suite/barrel-content.builder.test.ts | 61 +- src/test/suite/barrel-file.generator.test.ts | 65 +- src/test/suite/export.parser.test.ts | 86 +- src/test/suite/index.ts | 49 +- src/types/barrel/BarrelEntry.ts | 3 + src/types/barrel/BarrelEntryKind.ts | 3 + src/types/barrel/BarrelExport.ts | 3 + src/types/barrel/BarrelExportKind.ts | 3 + src/types/barrel/BarrelGenerationMode.ts | 3 + src/types/barrel/BarrelGenerationOptions.ts | 3 + .../NormalizedBarrelGenerationOptions.ts | 3 + src/types/barrel/ParsedExport.ts | 3 + src/types/constants.ts | 8 +- src/utils/guards.ts | 17 + src/utils/string.test.ts | 58 + tsconfig.json | 13 +- tsconfig.test.json | 4 +- 35 files changed, 4005 insertions(+), 7117 deletions(-) delete mode 100644 jest.config.cjs create mode 100644 src/core/io/index.ts create mode 100644 src/core/parser/index.ts delete mode 100644 src/test-utils/testHarness.ts create mode 100644 src/utils/guards.ts create mode 100644 src/utils/string.test.ts diff --git a/.dependency-cruiser.js b/.dependency-cruiser.js index f8b86e4..789c28f 100644 --- a/.dependency-cruiser.js +++ b/.dependency-cruiser.js @@ -19,13 +19,12 @@ module.exports = { from: { orphan: true, pathNot: [ - '(^|/)\\.[^/]+\\.(js|cjs|mjs|ts|json)$', // dot files - '\\.d\\.ts$', // TypeScript declaration files - '(^|/)tsconfig\\.json$', // TypeScript config - '(^|/)webpack\\.config\\.(js|cjs|mjs)$', // Webpack config - '(^|/)jest\\.config\\.(js|cjs|mjs)$', // Jest config - '(^|/)rollup\\.config\\.(js|cjs|mjs)$', // Rollup config - '(^|/)eslint\\.config\\.(js|cjs|mjs)$', // ESLint config + String.raw`(^|/)\\.[^/]+\\.(js|cjs|mjs|ts|json)$`, // dot files + String.raw`\\.d\\.ts$`, // TypeScript declaration files + String.raw`(^|/)tsconfig\\.json$`, // TypeScript config + String.raw`(^|/)webpack\\.config\\.(js|cjs|mjs)$`, // Webpack config + String.raw`(^|/)rollup\\.config\\.(js|cjs|mjs)$`, // Rollup config + String.raw`(^|/)eslint\.config\.(js|cjs|mjs)$`, // ESLint config ], }, to: {}, diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 25e1e95..f4a3bc1 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -8,19 +8,23 @@ Barrel Roll follows SOLID principles with clean separation of concerns. The exte ## Project Structure -``` +```text barrel-roll/ ├── src/ │ ├── extension.ts # Extension entry point │ ├── index.ts # Public API exports │ ├── core/ # Core barrel generation functionality │ │ ├── index.ts # Core exports -│ │ └── services/ # Service layer -│ │ ├── index.ts # Service exports -│ │ ├── barrel-file.generator.ts # Main orchestrator -│ │ ├── barrel-content.builder.ts # Content generation -│ │ ├── export.parser.ts # Export extraction logic -│ │ └── file-system.service.ts # File I/O operations +│ │ └── barrel/ # Barrel-generation modules +│ │ ├── index.ts # Barrel exports +│ │ ├── builder/ +│ │ │ └── content.builder.ts # Content generation +│ │ ├── generator/ +│ │ │ └── file.generator.ts # Main orchestrator +│ │ ├── io/ +│ │ │ └── file-system.service.ts # File I/O operations +│ │ └── parser/ +│ │ └── export.parser.ts # Export extraction logic │ ├── logging/ # Logging infrastructure │ │ ├── index.ts │ │ ├── config.ts @@ -84,7 +88,7 @@ barrel-roll/ **Code Stats**: ~25 lines -### 2. Barrel File Generator (`src/core/services/barrel-file.generator.ts`) +### 2. Barrel File Generator (`src/core/barrel/generator/file.generator.ts`) **Responsibility**: Orchestrate the barrel file generation process @@ -94,15 +98,15 @@ barrel-roll/ - Implements dependency injection for testability - Handles the main workflow: 1. Get TypeScript files from directory - 2. Parse exports from each file - 3. Build barrel file content - 4. Write the barrel file + 1. Parse exports from each file + 1. Build barrel file content + 1. Write the barrel file **Code Stats**: ~60 lines ### 3. Service Layer -#### FileSystemService (`src/core/services/file-system.service.ts`) +#### FileSystemService (`src/core/barrel/io/file-system.service.ts`) **Responsibility**: File system operations @@ -118,7 +122,7 @@ barrel-roll/ **Code Stats**: ~60 lines -#### ExportParser (`src/core/services/export.parser.ts`) +#### ExportParser (`src/core/barrel/parser/export.parser.ts`) **Responsibility**: Extract TypeScript exports from source code @@ -140,7 +144,7 @@ barrel-roll/ **Code Stats**: ~70 lines -#### BarrelContentBuilder (`src/core/services/barrel-content.builder.ts`) +#### BarrelContentBuilder (`src/core/barrel/builder/content.builder.ts`) **Responsibility**: Generate barrel file content from parsed exports diff --git a/eslint.config.mjs b/eslint.config.mjs index 580a3c6..2415111 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -8,7 +8,6 @@ import js from '@eslint/js'; import typescriptEslint from '@typescript-eslint/eslint-plugin'; import tsParser from '@typescript-eslint/parser'; import _import from 'eslint-plugin-import'; -import jest from 'eslint-plugin-jest'; import prettier from 'eslint-plugin-prettier'; import simpleImportSort from 'eslint-plugin-simple-import-sort'; import sonarjs from 'eslint-plugin-sonarjs'; @@ -148,13 +147,6 @@ export default [ jest, }, rules: { - // Jest recommended rules - ...jest.configs.recommended.rules, - 'jest/expect-expect': 'error', - 'jest/no-disabled-tests': 'warn', - 'jest/no-focused-tests': 'error', - 'jest/prefer-to-have-length': 'warn', - // Relax some rules for test files 'sonarjs/no-duplicate-string': 'off', '@typescript-eslint/unbound-method': 'off', diff --git a/jest.config.cjs b/jest.config.cjs deleted file mode 100644 index abd6eed..0000000 --- a/jest.config.cjs +++ /dev/null @@ -1,46 +0,0 @@ -// See: https://jestjs.io/docs/configuration - -/** @type {import('@jest/types').Config.InitialOptions} **/ -module.exports = { - clearMocks: true, - collectCoverage: true, - collectCoverageFrom: ['./src/**'], - coverageDirectory: './coverage', - coveragePathIgnorePatterns: [ - '__mocks__', - '/node_modules/', - '/tests/', - '/out/', - '/.vscode-test/', - 'test', - ], - coverageReporters: ['json-summary', 'text', 'lcov'], - coverageThreshold: { - global: { - branches: 0, - functions: 40, - lines: 60, - statements: 60, - }, - }, - extensionsToTreatAsEsm: ['.ts'], - moduleFileExtensions: ['ts', 'js'], - moduleNameMapper: { - '^@/(.*)$': '/src/$1', - '^(\\.{1,2}/.*)\\.js$': '$1', - }, - preset: 'ts-jest', - reporters: ['default'], - setupFilesAfterEnv: ['/src/__tests__/jest.setup.ts'], - testEnvironment: 'node', - testMatch: ['**/*.test.ts', '**/*.test.js'], - testPathIgnorePatterns: ['/out/', '/node_modules/', '/__mocks__/', '/.vscode-test/'], - transform: { - '^.+\\.ts$': [ - 'ts-jest', - { tsconfig: 'tsconfig.test.json', useESM: false, injectGlobals: true }, - ], - }, - transformIgnorePatterns: ['node_modules/(?!@jest/)', '.*\\.(spec|test)\\.(js|jsx)$'], - verbose: true, -}; diff --git a/package-lock.json b/package-lock.json index 2cc6a06..c67340b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,9 +12,7 @@ "pino": "^10.0.0" }, "devDependencies": { - "@jest/globals": "^29.7.0", "@types/glob": "^8.1.0", - "@types/jest": "^29.5.14", "@types/mocha": "^10.0.1", "@types/node": "^22.x", "@types/vscode": "^1.80.0", @@ -32,13 +30,11 @@ "eslint-plugin-sonarjs": "^3.0.5", "eslint-plugin-unused-imports": "^4.2.0", "glob": "^10.3.3", - "jest": "^29.7.0", "jscpd": "^4.0.5", "madge": "^8.0.0", "make-coverage-badge": "^1.2.0", "mocha": "^10.2.0", "prettier": "^3.5.0", - "ts-jest": "^29.2.5", "ts-loader": "^9.4.4", "ts-morph": "^27.0.2", "ts-node": "^10.9.2", @@ -51,4435 +47,1830 @@ "vscode": "^1.80.0" } }, - "node_modules/@babel/code-frame": { + "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", - "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/core": { + "node_modules/@babel/parser": { "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", - "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.4", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.4", - "@babel/types": "^7.28.4", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" + "@babel/types": "^7.28.4" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "dev": true, "license": "MIT", "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-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, "license": "MIT", + "optional": true, "engines": { - "node": ">=6.9.0" + "node": ">=0.1.90" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "node_modules/@dependents/detective-less": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-5.0.1.tgz", + "integrity": "sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "gonzales-pe": "^4.3.0", + "node-source-walk": "^7.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.4" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, "engines": { - "node": ">=6.0.0" + "node": ">=10.0.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@emnapi/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", + "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "node_modules/@emnapi/runtime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "tslib": "^2.4.0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "tslib": "^2.4.0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=6.9.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "*" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@eslint/config-helpers": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", + "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@eslint/core": "^0.16.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@types/json-schema": "^7.0.15" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 4" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "brace-expansion": "^1.1.7" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "*" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@eslint/js": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, "engines": { - "node": ">=6.9.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "node_modules/@eslint/plugin-kit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@eslint/core": "^0.16.0", + "levn": "^0.4.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=18.18.0" } }, - "node_modules/@babel/traverse": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", - "debug": "^4.3.1" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=18.18.0" } }, - "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6.9.0" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=0.1.90" + "node": "20 || >=22" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@isaacs/balanced-match": "^4.0.1" }, "engines": { - "node": ">=12" + "node": "20 || >=22" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@dependents/detective-less": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-5.0.1.tgz", - "integrity": "sha512-Y6+WUMsTFWE5jb20IFP4YGa5IrGY/+a/FbOSjDF/wz9gepU2hwCYSXRHP/vPwBvwcY3SVMASt4yXxbXNXigmZQ==", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", - "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^7.0.1" - }, "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=10.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@emnapi/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", - "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@emnapi/runtime": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", - "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "tslib": "^2.4.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@epic-web/invariant": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", - "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "node_modules/@jscpd/core": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@jscpd/core/-/core-4.0.1.tgz", + "integrity": "sha512-6Migc68Z8p7q5xqW1wbF3SfIbYHPQoiLHPbJb1A1Z1H9DwImwopFkYflqRDpuamLd0Jfg2jx3ZBmHQt21NbD1g==", "dev": true, "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "dependencies": { + "eventemitter3": "^5.0.1" } }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "node_modules/@jscpd/finder": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@jscpd/finder/-/finder-4.0.1.tgz", + "integrity": "sha512-TcCT28686GeLl87EUmrBXYmuOFELVMDwyjKkcId+qjNS1zVWRd53Xd5xKwEDzkCEgen/vCs+lorLLToolXp5oQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "@jscpd/core": "4.0.1", + "@jscpd/tokenizer": "4.0.1", + "blamer": "^1.0.6", + "bytes": "^3.1.2", + "cli-table3": "^0.6.5", + "colors": "^1.4.0", + "fast-glob": "^3.3.2", + "fs-extra": "^11.2.0", + "markdown-table": "^2.0.0", + "pug": "^3.0.3" } }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@jscpd/html-reporter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@jscpd/html-reporter/-/html-reporter-4.0.1.tgz", + "integrity": "sha512-M9fFETNvXXuy4fWv0M2oMluxwrQUBtubxCHaWw21lb2G8A6SE19moe3dUkluZ/3V4BccywfeF9lSEUg84heLww==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "colors": "1.4.0", + "fs-extra": "^11.2.0", + "pug": "^3.0.3" } }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@jscpd/tokenizer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@jscpd/tokenizer/-/tokenizer-4.0.1.tgz", + "integrity": "sha512-l/CPeEigadYcQUsUxf1wdCBfNjyAxYcQU04KciFNmSZAMY+ykJ8fZsiuyfjb+oOuDgsIPZZ9YvbvsCr6NBXueg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "@jscpd/core": "4.0.1", + "reprism": "^0.0.11", + "spark-md5": "^3.0.2" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", - "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, "dependencies": { - "@eslint/core": "^0.16.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" } }, - "node_modules/@eslint/core": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", - "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.15" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 8" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.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" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 8" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=12.4.0" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", + "optional": true, "engines": { - "node": "*" + "node": ">=14" } }, - "node_modules/@eslint/js": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", - "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://eslint.org/donate" + "url": "https://opencollective.com/pkgr" } }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } + "license": "MIT" }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", - "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "node_modules/@ts-graphviz/adapter": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ts-graphviz/adapter/-/adapter-2.0.6.tgz", + "integrity": "sha512-kJ10lIMSWMJkLkkCG5gt927SnGZcBuG0s0HHswGzcHTgvtUe7yk5/3zTEr0bafzsodsOq5Gi6FhQeV775nC35Q==", "dev": true, - "license": "Apache-2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ts-graphviz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ts-graphviz" + } + ], + "license": "MIT", "dependencies": { - "@eslint/core": "^0.16.0", - "levn": "^0.4.1" + "@ts-graphviz/common": "^2.1.5" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "node_modules/@ts-graphviz/ast": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@ts-graphviz/ast/-/ast-2.0.7.tgz", + "integrity": "sha512-e6+2qtNV99UT6DJSoLbHfkzfyqY84aIuoV8Xlb9+hZAjgpum8iVHprGeAMQ4rF6sKUAxrmY8rfF/vgAwoPc3gw==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ts-graphviz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ts-graphviz" + } + ], + "license": "MIT", "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" + "@ts-graphviz/common": "^2.1.5" }, "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "node_modules/@ts-graphviz/common": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ts-graphviz/common/-/common-2.1.5.tgz", + "integrity": "sha512-S6/9+T6x8j6cr/gNhp+U2olwo1n0jKj/682QVqsh7yXWV6ednHYqxFw0ZsY3LyzT0N8jaZ6jQY9YD99le3cmvg==", "dev": true, - "license": "Apache-2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ts-graphviz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ts-graphviz" + } + ], + "license": "MIT", "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18" } }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "node_modules/@ts-graphviz/core": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@ts-graphviz/core/-/core-2.0.7.tgz", + "integrity": "sha512-w071DSzP94YfN6XiWhOxnLpYT3uqtxJBDYdh6Jdjzt+Ce6DNspJsPQgpC7rbts/B8tEkq0LHoYuIF/O5Jh5rPg==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ts-graphviz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/ts-graphviz" + } + ], "license": "MIT", + "dependencies": { + "@ts-graphviz/ast": "^2.0.7", + "@ts-graphviz/common": "^2.1.5" + }, "engines": { - "node": "20 || >=22" + "node": ">=18" } }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "node_modules/@ts-morph/common": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.28.1.tgz", + "integrity": "sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==", "dev": true, "license": "MIT", "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" + "minimatch": "^10.0.1", + "path-browserify": "^1.0.1", + "tinyglobby": "^0.2.14" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", "dev": true, "license": "ISC", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "node": "20 || >=22" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" + "tslib": "^2.4.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/@types/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "@types/minimatch": "^5.1.2", + "@types/node": "*" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + "license": "MIT" }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } + "license": "MIT" }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "node_modules/@types/node": { + "version": "22.18.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.10.tgz", + "integrity": "sha512-anNG/V/Efn/YZY4pRzbACnKxNKoBng2VTFydVu8RRs5hQjikP8CQfaeAV59VFSCzKNp90mXiVXW2QzV56rwMrg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "undici-types": "~6.21.0" } }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "node_modules/@types/sarif": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", + "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==", "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + "license": "MIT" }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "node_modules/@types/vscode": { + "version": "1.105.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.105.0.tgz", + "integrity": "sha512-Lotk3CTFlGZN8ray4VxJE7axIyLZZETQJVWi/lYoUVQuqfRxlQhVOfoejsD2V3dVXPSbS15ov5ZyowMAzgUqcw==", "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + "license": "MIT" }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.1.tgz", + "integrity": "sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/type-utils": "8.46.1", + "@typescript-eslint/utils": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.46.1", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "node_modules/@typescript-eslint/parser": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.1.tgz", + "integrity": "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", + "debug": "^4.3.4" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.1.tgz", + "integrity": "sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==", "dev": true, "license": "MIT", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" + "@typescript-eslint/tsconfig-utils": "^8.46.1", + "@typescript-eslint/types": "^8.46.1", + "debug": "^4.3.4" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@jest/reporters/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.1.tgz", + "integrity": "sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "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" + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1" }, "engines": { - "node": "*" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@jest/reporters/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.1.tgz", + "integrity": "sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==", "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "engines": { - "node": "*" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.1.tgz", + "integrity": "sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1", + "@typescript-eslint/utils": "8.46.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@typescript-eslint/types": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.1.tgz", + "integrity": "sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==", "dev": true, "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.1.tgz", + "integrity": "sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "@typescript-eslint/project-service": "8.46.1", + "@typescript-eslint/tsconfig-utils": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/visitor-keys": "8.46.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "node_modules/@typescript-eslint/utils": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.1.tgz", + "integrity": "sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.1", + "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/typescript-estree": "8.46.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.1.tgz", + "integrity": "sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "@typescript-eslint/types": "8.46.1", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, + "license": "Apache-2.0", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0.0" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@jscpd/core": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@jscpd/core/-/core-4.0.1.tgz", - "integrity": "sha512-6Migc68Z8p7q5xqW1wbF3SfIbYHPQoiLHPbJb1A1Z1H9DwImwopFkYflqRDpuamLd0Jfg2jx3ZBmHQt21NbD1g==", + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.1" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@jscpd/finder": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@jscpd/finder/-/finder-4.0.1.tgz", - "integrity": "sha512-TcCT28686GeLl87EUmrBXYmuOFELVMDwyjKkcId+qjNS1zVWRd53Xd5xKwEDzkCEgen/vCs+lorLLToolXp5oQ==", + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jscpd/core": "4.0.1", - "@jscpd/tokenizer": "4.0.1", - "blamer": "^1.0.6", - "bytes": "^3.1.2", - "cli-table3": "^0.6.5", - "colors": "^1.4.0", - "fast-glob": "^3.3.2", - "fs-extra": "^11.2.0", - "markdown-table": "^2.0.0", - "pug": "^3.0.3" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@jscpd/html-reporter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@jscpd/html-reporter/-/html-reporter-4.0.1.tgz", - "integrity": "sha512-M9fFETNvXXuy4fWv0M2oMluxwrQUBtubxCHaWw21lb2G8A6SE19moe3dUkluZ/3V4BccywfeF9lSEUg84heLww==", + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "colors": "1.4.0", - "fs-extra": "^11.2.0", - "pug": "^3.0.3" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@jscpd/tokenizer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@jscpd/tokenizer/-/tokenizer-4.0.1.tgz", - "integrity": "sha512-l/CPeEigadYcQUsUxf1wdCBfNjyAxYcQU04KciFNmSZAMY+ykJ8fZsiuyfjb+oOuDgsIPZZ9YvbvsCr6NBXueg==", + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jscpd/core": "4.0.1", - "reprism": "^0.0.11", - "spark-md5": "^3.0.2" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } + "os": [ + "linux" + ] }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.4.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" - } - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@ts-graphviz/adapter": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@ts-graphviz/adapter/-/adapter-2.0.6.tgz", - "integrity": "sha512-kJ10lIMSWMJkLkkCG5gt927SnGZcBuG0s0HHswGzcHTgvtUe7yk5/3zTEr0bafzsodsOq5Gi6FhQeV775nC35Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ts-graphviz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ts-graphviz" - } - ], - "license": "MIT", - "dependencies": { - "@ts-graphviz/common": "^2.1.5" - }, - "engines": { - "node": ">=18" - } + "os": [ + "linux" + ] }, - "node_modules/@ts-graphviz/ast": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@ts-graphviz/ast/-/ast-2.0.7.tgz", - "integrity": "sha512-e6+2qtNV99UT6DJSoLbHfkzfyqY84aIuoV8Xlb9+hZAjgpum8iVHprGeAMQ4rF6sKUAxrmY8rfF/vgAwoPc3gw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ts-graphviz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ts-graphviz" - } + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" ], - "license": "MIT", - "dependencies": { - "@ts-graphviz/common": "^2.1.5" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ts-graphviz/common": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@ts-graphviz/common/-/common-2.1.5.tgz", - "integrity": "sha512-S6/9+T6x8j6cr/gNhp+U2olwo1n0jKj/682QVqsh7yXWV6ednHYqxFw0ZsY3LyzT0N8jaZ6jQY9YD99le3cmvg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ts-graphviz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ts-graphviz" - } - ], "license": "MIT", - "engines": { - "node": ">=18" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@ts-graphviz/core": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@ts-graphviz/core/-/core-2.0.7.tgz", - "integrity": "sha512-w071DSzP94YfN6XiWhOxnLpYT3uqtxJBDYdh6Jdjzt+Ce6DNspJsPQgpC7rbts/B8tEkq0LHoYuIF/O5Jh5rPg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ts-graphviz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/ts-graphviz" - } + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" ], - "license": "MIT", - "dependencies": { - "@ts-graphviz/ast": "^2.0.7", - "@ts-graphviz/common": "^2.1.5" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@ts-morph/common": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.28.1.tgz", - "integrity": "sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimatch": "^10.0.1", - "path-browserify": "^1.0.1", - "tinyglobby": "^0.2.14" - } - }, - "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimatch": "^5.1.2", - "@types/node": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mocha": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", - "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.18.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.10.tgz", - "integrity": "sha512-anNG/V/Efn/YZY4pRzbACnKxNKoBng2VTFydVu8RRs5hQjikP8CQfaeAV59VFSCzKNp90mXiVXW2QzV56rwMrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/sarif": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@types/sarif/-/sarif-2.1.7.tgz", - "integrity": "sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/vscode": { - "version": "1.105.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.105.0.tgz", - "integrity": "sha512-Lotk3CTFlGZN8ray4VxJE7axIyLZZETQJVWi/lYoUVQuqfRxlQhVOfoejsD2V3dVXPSbS15ov5ZyowMAzgUqcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.1.tgz", - "integrity": "sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/type-utils": "8.46.1", - "@typescript-eslint/utils": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.46.1", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.1.tgz", - "integrity": "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.1.tgz", - "integrity": "sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.1", - "@typescript-eslint/types": "^8.46.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.1.tgz", - "integrity": "sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.1.tgz", - "integrity": "sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.1.tgz", - "integrity": "sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1", - "@typescript-eslint/utils": "8.46.1", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.1.tgz", - "integrity": "sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.1.tgz", - "integrity": "sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.46.1", - "@typescript-eslint/tsconfig-utils": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.1.tgz", - "integrity": "sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.1.tgz", - "integrity": "sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.46.1", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", - "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@vscode/test-electron": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", - "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "jszip": "^3.10.1", - "ora": "^8.1.0", - "semver": "^7.6.2" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.22.tgz", - "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.4", - "@vue/shared": "3.5.22", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", - "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.22", - "@vue/shared": "3.5.22" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz", - "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.4", - "@vue/compiler-core": "3.5.22", - "@vue/compiler-dom": "3.5.22", - "@vue/compiler-ssr": "3.5.22", - "@vue/shared": "3.5.22", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.19", - "postcss": "^8.5.6", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz", - "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.22", - "@vue/shared": "3.5.22" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.22.tgz", - "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-jsx-walk": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz", - "integrity": "sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA==", - "dev": true, - "license": "MIT" - }, - "node_modules/acorn-loose": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.5.2.tgz", - "integrity": "sha512-PPvV6g8UGMGgjrMu+n/f9E/tCSkNQ2Y97eFvuVdJfG11+xdIeDcLyNdC8SHcrHbRqkfwLASdplyR6B6sKM1U4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.15.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/app-module-path": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", - "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/assert-never": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.4.0.tgz", - "integrity": "sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ast-module-types": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-6.0.1.tgz", - "integrity": "sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-walk": { - "version": "3.0.0-canary-5", - "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", - "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.9.6" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.8.16", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.16.tgz", - "integrity": "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/blamer": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/blamer/-/blamer-1.0.6.tgz", - "integrity": "sha512-fv7QToPS87oD1m1bDDTf29zC/bVKJxj2Nqh1r/v4NhMtbnzDIbWOHBYIfxCjlmkVGu3FGOjKgdNG3SFm7TkvBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^4.0.0", - "which": "^2.0.2" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/blamer/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/blamer/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/blamer/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/blamer/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/blamer/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true, - "license": "ISC" - }, - "node_modules/browserslist": { - "version": "4.26.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", - "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.8.9", - "caniuse-lite": "^1.0.30001746", - "electron-to-chromium": "^1.5.227", - "node-releases": "^2.0.21", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001750", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001750.tgz", - "integrity": "sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/character-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-regex": "^1.0.3" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true, - "license": "MIT" + "os": [ + "linux" + ] }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "string-width": "^4.2.0" + "@napi-rs/wasm-runtime": "^0.2.11" }, "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "node": ">=14.0.0" } }, - "node_modules/cli-table3/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@vscode/test-electron": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", + "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "jszip": "^3.10.1", + "ora": "^8.1.0", + "semver": "^7.6.2" }, "engines": { - "node": ">=8" + "node": ">=16" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/@vue/compiler-core": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.22.tgz", + "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "@babel/parser": "^7.28.4", + "@vue/shared": "3.5.22", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "node_modules/@vue/compiler-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", + "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.8" + "dependencies": { + "@vue/compiler-core": "3.5.22", + "@vue/shared": "3.5.22" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "node_modules/@vue/compiler-sfc": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz", + "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==", "dev": true, "license": "MIT", "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" + "@babel/parser": "^7.28.4", + "@vue/compiler-core": "3.5.22", + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.19", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "node_modules/@vue/compiler-ssr": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz", + "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==", "dev": true, "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "dependencies": { + "@vue/compiler-dom": "3.5.22", + "@vue/shared": "3.5.22" } }, - "node_modules/code-block-writer": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", - "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", - "dev": true, - "license": "MIT" - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "node_modules/@vue/shared": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.22.tgz", + "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==", "dev": true, "license": "MIT" }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true, "license": "MIT" }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true, "license": "MIT" }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.1.90" + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true, "license": "MIT" }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } }, - "node_modules/constantinople": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", - "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.1" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, "license": "MIT" }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } }, - "node_modules/cross-env": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", - "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "license": "MIT", "dependencies": { - "@epic-web/invariant": "^1.0.0", - "cross-spawn": "^7.0.6" - }, - "bin": { - "cross-env": "dist/bin/cross-env.js", - "cross-env-shell": "dist/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=20" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=14.15.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=14.15.0" }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, "engines": { - "node": ">= 0.4" + "node": ">=14.15.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } } }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "dependencies": { - "ms": "^2.1.3" + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=0.4.0" } }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=10.13.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dedent": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", - "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", - "dev": true, - "license": "MIT", "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } + "acorn": "^8.14.0" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=4.0.0" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "node_modules/acorn-jsx-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz", + "integrity": "sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA==", "dev": true, "license": "MIT" }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/acorn-loose": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.5.2.tgz", + "integrity": "sha512-PPvV6g8UGMGgjrMu+n/f9E/tCSkNQ2Y97eFvuVdJfG11+xdIeDcLyNdC8SHcrHbRqkfwLASdplyR6B6sKM1U4A==", "dev": true, "license": "MIT", + "dependencies": { + "acorn": "^8.15.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.4.0" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "license": "MIT", "dependencies": { - "clone": "^1.0.2" + "acorn": "^8.11.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 14" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/dependency-cruiser": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/dependency-cruiser/-/dependency-cruiser-17.1.0.tgz", - "integrity": "sha512-8ZtJmSEqG5xAFAMYBclJbvp3R8j4wBw2QTzT0ZhC2cou6c/3u0G6j7coNc/fz0qyo0haQ5ihLt7u0iEnRMui/A==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "acorn-jsx-walk": "^2.0.0", - "acorn-loose": "^8.5.2", - "acorn-walk": "^8.3.4", - "ajv": "^8.17.1", - "commander": "^14.0.1", - "enhanced-resolve": "^5.18.3", - "ignore": "^7.0.5", - "interpret": "^3.1.1", - "is-installed-globally": "^1.0.0", - "json5": "^2.2.3", - "memoize": "^10.1.0", - "picomatch": "^4.0.3", - "prompts": "^2.4.2", - "rechoir": "^0.8.0", - "safe-regex": "^2.1.1", - "semver": "^7.7.2", - "tsconfig-paths-webpack-plugin": "^4.2.0", - "watskeburt": "^4.2.3" + "ajv": "^8.0.0" }, - "bin": { - "depcruise": "bin/dependency-cruise.mjs", - "depcruise-baseline": "bin/depcruise-baseline.mjs", - "depcruise-fmt": "bin/depcruise-fmt.mjs", - "depcruise-wrap-stream-in-html": "bin/wrap-stream-in-html.mjs", - "dependency-cruise": "bin/dependency-cruise.mjs", - "dependency-cruiser": "bin/dependency-cruise.mjs" + "peerDependencies": { + "ajv": "^8.0.0" }, - "engines": { - "node": "^20.12||^22||>=24" + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/dependency-cruiser/node_modules/ajv": { + "node_modules/ajv-formats/node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", @@ -4496,513 +1887,611 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/dependency-cruiser/node_modules/commander": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.1.tgz", - "integrity": "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==", + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "license": "MIT", "engines": { - "node": ">=20" + "node": ">=6" } }, - "node_modules/dependency-cruiser/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true, "license": "MIT" }, - "node_modules/dependency-cruiser/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-module-path": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", + "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dependency-tree": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/dependency-tree/-/dependency-tree-11.2.0.tgz", - "integrity": "sha512-+C1H3mXhcvMCeu5i2Jpg9dc0N29TWTuT6vJD7mHLAfVmAbo9zW8NlkvQ1tYd3PDMab0IRQM0ccoyX68EZtx9xw==", + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "dependencies": { - "commander": "^12.1.0", - "filing-cabinet": "^5.0.3", - "precinct": "^12.2.0", - "typescript": "^5.8.3" - }, - "bin": { - "dependency-tree": "bin/cli.js" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": ">=18" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dependency-tree/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, "engines": { - "node": ">=18" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/detective-amd": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-6.0.1.tgz", - "integrity": "sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "dependencies": { - "ast-module-types": "^6.0.1", - "escodegen": "^2.1.0", - "get-amd-module-type": "^6.0.1", - "node-source-walk": "^7.0.1" - }, - "bin": { - "detective-amd": "bin/cli.js" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": ">=18" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/detective-cjs": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-6.0.1.tgz", - "integrity": "sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { - "ast-module-types": "^6.0.1", - "node-source-walk": "^7.0.1" + "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" }, "engines": { - "node": ">=18" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/detective-es6": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-5.0.1.tgz", - "integrity": "sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==", + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/assert-never": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.4.0.tgz", + "integrity": "sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ast-module-types": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-6.0.1.tgz", + "integrity": "sha512-WHw67kLXYbZuHTmcdbIrVArCq5wxo6NEuj3hiYAWr8mwJeC+C2mMCIBIWCiDoCye/OF/xelc+teJ1ERoWmnEIA==", "dev": true, "license": "MIT", - "dependencies": { - "node-source-walk": "^7.0.1" - }, "engines": { "node": ">=18" } }, - "node_modules/detective-postcss": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-7.0.1.tgz", - "integrity": "sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==", + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, "license": "MIT", - "dependencies": { - "is-url": "^1.2.4", - "postcss-values-parser": "^6.0.2" - }, "engines": { - "node": "^14.0.0 || >=16.0.0" - }, - "peerDependencies": { - "postcss": "^8.4.47" + "node": ">= 0.4" } }, - "node_modules/detective-sass": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-6.0.1.tgz", - "integrity": "sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==", - "dev": true, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", "license": "MIT", - "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^7.0.1" - }, "engines": { - "node": ">=18" + "node": ">=8.0.0" } }, - "node_modules/detective-scss": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-5.0.1.tgz", - "integrity": "sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", "dependencies": { - "gonzales-pe": "^4.3.0", - "node-source-walk": "^7.0.1" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">=18" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/detective-stylus": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-5.0.1.tgz", - "integrity": "sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==", + "node_modules/babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/types": "^7.9.6" + }, "engines": { - "node": ">=18" + "node": ">= 10.0.0" } }, - "node_modules/detective-typescript": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-14.0.0.tgz", - "integrity": "sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "^8.23.0", - "ast-module-types": "^6.0.1", - "node-source-walk": "^7.0.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "typescript": "^5.4.4" + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.16", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.16.tgz", + "integrity": "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" } }, - "node_modules/detective-vue2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/detective-vue2/-/detective-vue2-2.2.0.tgz", - "integrity": "sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==", + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "license": "MIT", - "dependencies": { - "@dependents/detective-less": "^5.0.1", - "@vue/compiler-sfc": "^3.5.13", - "detective-es6": "^5.0.1", - "detective-sass": "^6.0.1", - "detective-scss": "^5.0.1", - "detective-stylus": "^5.0.1", - "detective-typescript": "^14.0.0" - }, "engines": { - "node": ">=18" + "node": ">=8" }, - "peerDependencies": { - "typescript": "^5.4.4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 6" } }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/blamer": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/blamer/-/blamer-1.0.6.tgz", + "integrity": "sha512-fv7QToPS87oD1m1bDDTf29zC/bVKJxj2Nqh1r/v4NhMtbnzDIbWOHBYIfxCjlmkVGu3FGOjKgdNG3SFm7TkvBQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "execa": "^4.0.0", + "which": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.9" } }, - "node_modules/doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "node_modules/blamer/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.235", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.235.tgz", - "integrity": "sha512-i/7ntLFwOdoHY7sgjlTIDo4Sl8EdoTjWIaKinYOVfC6bOp71bmwenyZthWHcasxgHDNWbWxvG9M3Ia116zIaYQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "node_modules/blamer/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "node_modules/blamer/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" } }, - "node_modules/enhanced-resolve": { - "version": "5.18.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", - "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "node_modules/blamer/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" + "node": ">=6" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/envinfo": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.18.0.tgz", - "integrity": "sha512-02QGCLRW+Jb8PC270ic02lat+N57iBaWsvHjcJViqp6UVupRB+Vsg7brYPTqEFXvsdTql3KnSczv5ModZFpl8Q==", + "node_modules/blamer/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } + "license": "ISC" }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "balanced-match": "^1.0.0" } }, - "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "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.4", - "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.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "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-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.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.19" - }, - "engines": { - "node": ">= 0.4" + "fill-range": "^7.1.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, "engines": { - "node": ">= 0.4" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" + "engines": { + "node": ">=6" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">= 0.8" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" } }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -5011,20 +2500,20 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "license": "MIT", "engines": { @@ -5034,979 +2523,954 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", - "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.4.0", - "@eslint/core": "^0.16.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.37.0", - "@eslint/plugin-kit": "^0.4.0", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true + "node_modules/caniuse-lite": { + "version": "1.0.30001750", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001750.tgz", + "integrity": "sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - } + ], + "license": "CC-BY-4.0" }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "is-regex": "^1.0.3" } }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", - "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.4.0", - "get-tsconfig": "^4.10.0", - "is-bun-module": "^2.0.0", - "stable-hash": "^0.0.5", - "tinyglobby": "^0.2.13", - "unrs-resolver": "^1.6.2" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">= 8.10.0" }, "funding": { - "url": "https://opencollective.com/eslint-import-resolver-typescript" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" + "url": "https://paulmillr.com/funding/" }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "debug": "^3.2.7" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "node": ">= 6" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "license": "MIT", - "dependencies": { - "ms": "^2.1.1" + "engines": { + "node": ">=6.0" } }, - "node_modules/eslint-plugin-import": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">=18" }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" } }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/eslint-plugin-jest": { - "version": "28.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.14.0.tgz", - "integrity": "sha512-P9s/qXSMTpRTerE2FQ0qJet2gKbcGyFTPAJipoKxmWqR6uuFqIqk8FuEfg5yBieOezVrEfAMZrEwJ6yEp+1MFQ==", + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "engines": { - "node": "^16.10.0 || ^18.12.0 || >=20.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", - "jest": "*" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/eslint-plugin-prettier": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", - "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.7" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/eslint-plugin-simple-import-sort": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz", - "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==", + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "license": "MIT", - "peerDependencies": { - "eslint": ">=5.0.0" + "engines": { + "node": ">=0.8" } }, - "node_modules/eslint-plugin-sonarjs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-3.0.5.tgz", - "integrity": "sha512-dI62Ff3zMezUToi161hs2i1HX1ie8Ia2hO0jtNBfdgRBicAG4ydy2WPt0rMTrAe3ZrlqhpAO3w1jcQEdneYoFA==", + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, - "license": "LGPL-3.0-only", + "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "4.12.1", - "builtin-modules": "3.3.0", - "bytes": "3.1.2", - "functional-red-black-tree": "1.0.1", - "jsx-ast-utils-x": "0.1.0", - "lodash.merge": "4.6.2", - "minimatch": "9.0.5", - "scslre": "0.3.0", - "semver": "7.7.2", - "typescript": ">=5" - }, - "peerDependencies": { - "eslint": "^8.0.0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-sonarjs/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/eslint-plugin-unused-imports": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.2.0.tgz", - "integrity": "sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==", + "node_modules/code-block-writer": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", "dev": true, - "license": "MIT", - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", - "eslint": "^9.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - } - } + "license": "MIT" }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "color-name": "~1.1.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=7.0.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=0.1.90" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } + "license": "MIT" }, - "node_modules/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-env": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", + "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", "dev": true, "license": "MIT", + "dependencies": { + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" + }, + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" + }, "engines": { - "node": ">= 4" + "node": ">=20" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": "*" + "node": ">= 8" } }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" + "url": "https://github.com/sponsors/inspect-js" } }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "estraverse": "^5.1.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "ms": "^2.1.3" }, "engines": { - "node": ">=4.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4.0.0" } }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.8.x" + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", "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" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/execa/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "node_modules/dependency-cruiser": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/dependency-cruiser/-/dependency-cruiser-17.1.0.tgz", + "integrity": "sha512-8ZtJmSEqG5xAFAMYBclJbvp3R8j4wBw2QTzT0ZhC2cou6c/3u0G6j7coNc/fz0qyo0haQ5ihLt7u0iEnRMui/A==", "dev": true, "license": "MIT", "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" + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "acorn-jsx-walk": "^2.0.0", + "acorn-loose": "^8.5.2", + "acorn-walk": "^8.3.4", + "ajv": "^8.17.1", + "commander": "^14.0.1", + "enhanced-resolve": "^5.18.3", + "ignore": "^7.0.5", + "interpret": "^3.1.1", + "is-installed-globally": "^1.0.0", + "json5": "^2.2.3", + "memoize": "^10.1.0", + "picomatch": "^4.0.3", + "prompts": "^2.4.2", + "rechoir": "^0.8.0", + "safe-regex": "^2.1.1", + "semver": "^7.7.2", + "tsconfig-paths-webpack-plugin": "^4.2.0", + "watskeburt": "^4.2.3" + }, + "bin": { + "depcruise": "bin/dependency-cruise.mjs", + "depcruise-baseline": "bin/depcruise-baseline.mjs", + "depcruise-fmt": "bin/depcruise-fmt.mjs", + "depcruise-wrap-stream-in-html": "bin/wrap-stream-in-html.mjs", + "dependency-cruise": "bin/dependency-cruise.mjs", + "dependency-cruiser": "bin/dependency-cruise.mjs" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^20.12||^22||>=24" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "node_modules/dependency-cruiser/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", "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-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, - "engines": { - "node": ">=8.6.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/dependency-cruiser/node_modules/commander": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.1.tgz", + "integrity": "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==", "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=20" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "node_modules/dependency-cruiser/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, "license": "MIT" }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "node_modules/dependency-cruiser/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "node_modules/dependency-tree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/dependency-tree/-/dependency-tree-11.2.0.tgz", + "integrity": "sha512-+C1H3mXhcvMCeu5i2Jpg9dc0N29TWTuT6vJD7mHLAfVmAbo9zW8NlkvQ1tYd3PDMab0IRQM0ccoyX68EZtx9xw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" + "license": "MIT", + "dependencies": { + "commander": "^12.1.0", + "filing-cabinet": "^5.0.3", + "precinct": "^12.2.0", + "typescript": "^5.8.3" + }, + "bin": { + "dependency-tree": "bin/cli.js" + }, + "engines": { + "node": ">=18" + } }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "node_modules/dependency-tree/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 4.9.1" + "node": ">=18" } }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "node_modules/detective-amd": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-6.0.1.tgz", + "integrity": "sha512-TtyZ3OhwUoEEIhTFoc1C9IyJIud3y+xYkSRjmvCt65+ycQuc3VcBrPRTMWoO/AnuCyOB8T5gky+xf7Igxtjd3g==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "ast-module-types": "^6.0.1", + "escodegen": "^2.1.0", + "get-amd-module-type": "^6.0.1", + "node-source-walk": "^7.0.1" + }, + "bin": { + "detective-amd": "bin/cli.js" + }, + "engines": { + "node": ">=18" } }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "node_modules/detective-cjs": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-6.0.1.tgz", + "integrity": "sha512-tLTQsWvd2WMcmn/60T2inEJNhJoi7a//PQ7DwRKEj1yEeiQs4mrONgsUtEJKnZmrGWBBmE0kJ1vqOG/NAxwaJw==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "bser": "2.1.1" + "ast-module-types": "^6.0.1", + "node-source-walk": "^7.0.1" + }, + "engines": { + "node": ">=18" } }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "node_modules/detective-es6": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-5.0.1.tgz", + "integrity": "sha512-XusTPuewnSUdoxRSx8OOI6xIA/uld/wMQwYsouvFN2LAg7HgP06NF1lHRV3x6BZxyL2Kkoih4ewcq8hcbGtwew==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^4.0.0" + "node-source-walk": "^7.0.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=18" } }, - "node_modules/filing-cabinet": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-5.0.3.tgz", - "integrity": "sha512-PlPcMwVWg60NQkhvfoxZs4wEHjhlOO/y7OAm4sKM60o1Z9nttRY4mcdQxp/iZ+kg/Vv6Hw1OAaTbYVM9DA9pYg==", + "node_modules/detective-postcss": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-7.0.1.tgz", + "integrity": "sha512-bEOVpHU9picRZux5XnwGsmCN4+8oZo7vSW0O0/Enq/TO5R2pIAP2279NsszpJR7ocnQt4WXU0+nnh/0JuK4KHQ==", "dev": true, "license": "MIT", "dependencies": { - "app-module-path": "^2.2.0", - "commander": "^12.1.0", - "enhanced-resolve": "^5.18.0", - "module-definition": "^6.0.1", - "module-lookup-amd": "^9.0.3", - "resolve": "^1.22.10", - "resolve-dependency-path": "^4.0.1", - "sass-lookup": "^6.1.0", - "stylus-lookup": "^6.1.0", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.7.3" - }, - "bin": { - "filing-cabinet": "bin/cli.js" + "is-url": "^1.2.4", + "postcss-values-parser": "^6.0.2" }, "engines": { - "node": ">=18" + "node": "^14.0.0 || >=16.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.47" } }, - "node_modules/filing-cabinet/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "node_modules/detective-sass": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-6.0.1.tgz", + "integrity": "sha512-jSGPO8QDy7K7pztUmGC6aiHkexBQT4GIH+mBAL9ZyBmnUIOFbkfZnO8wPRRJFP/QP83irObgsZHCoDHZ173tRw==", "dev": true, "license": "MIT", + "dependencies": { + "gonzales-pe": "^4.3.0", + "node-source-walk": "^7.0.1" + }, "engines": { "node": ">=18" } }, - "node_modules/filing-cabinet/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/detective-scss": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-5.0.1.tgz", + "integrity": "sha512-MAyPYRgS6DCiS6n6AoSBJXLGVOydsr9huwXORUlJ37K3YLyiN0vYHpzs3AdJOgHobBfispokoqrEon9rbmKacg==", "dev": true, "license": "MIT", + "dependencies": { + "gonzales-pe": "^4.3.0", + "node-source-walk": "^7.0.1" + }, "engines": { - "node": ">=4" + "node": ">=18" } }, - "node_modules/filing-cabinet/node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "node_modules/detective-stylus": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-5.0.1.tgz", + "integrity": "sha512-Dgn0bUqdGbE3oZJ+WCKf8Dmu7VWLcmRJGc6RCzBgG31DLIyai9WAoEhYRgIHpt/BCRMrnXLbGWGPQuBUrnF0TA==", "dev": true, "license": "MIT", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=18" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/detective-typescript": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-14.0.0.tgz", + "integrity": "sha512-pgN43/80MmWVSEi5LUuiVvO/0a9ss5V7fwVfrJ4QzAQRd3cwqU1SfWGXJFcNKUqoD5cS+uIovhw5t/0rSeC5Mw==", "dev": true, "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "@typescript-eslint/typescript-estree": "^8.23.0", + "ast-module-types": "^6.0.1", + "node-source-walk": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "typescript": "^5.4.4" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/detective-vue2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/detective-vue2/-/detective-vue2-2.2.0.tgz", + "integrity": "sha512-sVg/t6O2z1zna8a/UIV6xL5KUa2cMTQbdTIIvqNM0NIPswp52fe43Nwmbahzj3ww4D844u/vC2PYfiGLvD3zFA==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "@dependents/detective-less": "^5.0.1", + "@vue/compiler-sfc": "^3.5.13", + "detective-es6": "^5.0.1", + "detective-sass": "^6.0.1", + "detective-scss": "^5.0.1", + "detective-stylus": "^5.0.1", + "detective-typescript": "^14.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "typescript": "^5.4.4" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" + "engines": { + "node": ">=0.3.1" } }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" + "esutils": "^2.0.2" }, "engines": { - "node": ">=16" + "node": ">=0.10.0" } }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "node_modules/doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.2.7" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.235", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.235.tgz", + "integrity": "sha512-i/7ntLFwOdoHY7sgjlTIDo4Sl8EdoTjWIaKinYOVfC6bOp71bmwenyZthWHcasxgHDNWbWxvG9M3Ia116zIaYQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "once": "^1.4.0" } }, - "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=14.14" + "node": ">=10.13.0" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "BSD-2-Clause", "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/envinfo": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.18.0.tgz", + "integrity": "sha512-02QGCLRW+Jb8PC270ic02lat+N57iBaWsvHjcJViqp6UVupRB+Vsg7brYPTqEFXvsdTql3KnSczv5ModZFpl8Q==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" } }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, "license": "MIT", "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", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", + "call-bound": "^1.0.4", + "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.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "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", - "is-callable": "^1.2.7" + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.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.19" }, "engines": { "node": ">= 0.4" @@ -6015,700 +3479,921 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { + "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT" }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, "engines": { "node": ">= 0.4" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" } }, - "node_modules/get-amd-module-type": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-6.0.1.tgz", - "integrity": "sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==", + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "license": "MIT", "dependencies": { - "ast-module-types": "^6.0.1", - "node-source-walk": "^7.0.1" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { - "node": ">=18" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=6" } }, - "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "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" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true, - "license": "ISC" - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "optional": true, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "node_modules/eslint": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", + "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", "dev": true, "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.4.0", + "@eslint/core": "^0.16.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.37.0", + "@eslint/plugin-kit": "^0.4.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" }, "engines": { - "node": ">= 0.4" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } } }, - "node_modules/get-tsconfig": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.12.0.tgz", - "integrity": "sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==", + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "license": "MIT", "dependencies": { - "resolve-pkg-maps": "^1.0.0" + "debug": "^3.2.7" }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/gitignore-to-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/gitignore-to-glob/-/gitignore-to-glob-0.3.0.tgz", - "integrity": "sha512-mk74BdnK7lIwDHnotHddx1wsjMOFIThpLY3cPNniJ/2fA/tlLzHnFxIdR+4sLOu5KGgQJdij4kjJ2RoUNnCNMA==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=4.4 <5 || >=6.9" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": ">=4" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "BSD-2-Clause" + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } }, - "node_modules/global-directory": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "ini": "4.1.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/global-directory/node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "node_modules/eslint-plugin-jest": { + "version": "28.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.14.0.tgz", + "integrity": "sha512-P9s/qXSMTpRTerE2FQ0qJet2gKbcGyFTPAJipoKxmWqR6uuFqIqk8FuEfg5yBieOezVrEfAMZrEwJ6yEp+1MFQ==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, "engines": { - "node": ">=18" + "node": "^16.10.0 || ^18.12.0 || >=20.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } } }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "node_modules/eslint-plugin-prettier": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" }, "engines": { - "node": ">= 0.4" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/gonzales-pe": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", - "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", + "node_modules/eslint-plugin-simple-import-sort": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz", + "integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==", "dev": true, "license": "MIT", + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-sonarjs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-3.0.5.tgz", + "integrity": "sha512-dI62Ff3zMezUToi161hs2i1HX1ie8Ia2hO0jtNBfdgRBicAG4ydy2WPt0rMTrAe3ZrlqhpAO3w1jcQEdneYoFA==", + "dev": true, + "license": "LGPL-3.0-only", "dependencies": { - "minimist": "^1.2.5" + "@eslint-community/regexpp": "4.12.1", + "builtin-modules": "3.3.0", + "bytes": "3.1.2", + "functional-red-black-tree": "1.0.1", + "jsx-ast-utils-x": "0.1.0", + "lodash.merge": "4.6.2", + "minimatch": "9.0.5", + "scslre": "0.3.0", + "semver": "7.7.2", + "typescript": ">=5" }, + "peerDependencies": { + "eslint": "^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", "bin": { - "gonzales": "bin/gonzales.js" + "semver": "bin/semver.js" }, "engines": { - "node": ">=0.6.0" + "node": ">=10" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/eslint-plugin-unused-imports": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.2.0.tgz", + "integrity": "sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", + "eslint": "^9.0.0 || ^8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=0.4.7" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "BSD-3-Clause", + "license": "Apache-2.0", "engines": { - "node": ">=0.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 4" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "es-define-property": "^1.0.0" + "brace-expansion": "^1.1.7" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "*" } }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "dunder-proto": "^1.0.0" + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">= 0.4" + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "function-bind": "^1.1.2" + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=4.0" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, - "node_modules/html-escaper": { + "node_modules/estree-walker": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, "license": "MIT" }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, "engines": { - "node": ">= 14" + "node": ">=0.8.x" } }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" + "@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" }, "engines": { - "node": ">= 14" + "node": ">=8.6.0" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "Apache-2.0", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, "engines": { - "node": ">=10.17.0" + "node": ">= 6" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "url": "https://github.com/sponsors/fastify" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "opencollective", + "url": "https://opencollective.com/fastify" } ], "license": "BSD-3-Clause" }, - "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">= 4.9.1" } }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16.0.0" } }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "node_modules/filing-cabinet": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-5.0.3.tgz", + "integrity": "sha512-PlPcMwVWg60NQkhvfoxZs4wEHjhlOO/y7OAm4sKM60o1Z9nttRY4mcdQxp/iZ+kg/Vv6Hw1OAaTbYVM9DA9pYg==", "dev": true, "license": "MIT", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" + "app-module-path": "^2.2.0", + "commander": "^12.1.0", + "enhanced-resolve": "^5.18.0", + "module-definition": "^6.0.1", + "module-lookup-amd": "^9.0.3", + "resolve": "^1.22.10", + "resolve-dependency-path": "^4.0.1", + "sass-lookup": "^6.1.0", + "stylus-lookup": "^6.1.0", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.7.3" }, "bin": { - "import-local-fixture": "fixtures/cli.js" + "filing-cabinet": "bin/cli.js" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/filing-cabinet/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.19" + "node": ">=18" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "node_modules/filing-cabinet/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "node_modules/filing-cabinet/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=16" } }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { - "has-bigints": "^1.0.2" + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -6717,102 +4402,83 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-bun-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", - "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.7.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "ISC" }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" + "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" }, "engines": { "node": ">= 0.4" @@ -6821,88 +4487,87 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-expression": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", - "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "object-assign": "^4.1.1" - } + "license": "MIT" }, - "node_modules/is-expression/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "node_modules/get-amd-module-type": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-6.0.1.tgz", + "integrity": "sha512-MtjsmYiCXcYDDrGqtNbeIYdAl85n+5mSv2r3FbzER/YV3ZILw4HNNIw34HuV5pyl0jzs6GFYU1VHVEefhgcNHQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "ast-module-types": "^6.0.1", + "node-source-walk": "^7.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=8" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6911,166 +4576,157 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true, + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/is-installed-globally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", - "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { - "global-directory": "^4.0.1", - "is-path-inside": "^4.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "node_modules/get-tsconfig": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.12.0.tgz", + "integrity": "sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "resolve-pkg-maps": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "node_modules/gitignore-to-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/gitignore-to-glob/-/gitignore-to-glob-0.3.0.tgz", + "integrity": "sha512-mk74BdnK7lIwDHnotHddx1wsjMOFIThpLY3cPNniJ/2fA/tlLzHnFxIdR+4sLOu5KGgQJdij4kjJ2RoUNnCNMA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4.4 <5 || >=6.9" } }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10.13.0" } }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "license": "BSD-2-Clause" }, - "node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", "dev": true, "license": "MIT", + "dependencies": { + "ini": "4.1.1" + }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/global-directory/node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -7079,20 +4735,26 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "node_modules/gonzales-pe": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", + "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", "dev": true, "license": "MIT", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "gonzales": "bin/gonzales.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.6.0" } }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", "engines": { @@ -7102,15 +4764,26 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, "engines": { "node": ">= 0.4" }, @@ -7118,28 +4791,37 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "dunder-proto": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7148,17 +4830,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, "engines": { "node": ">= 0.4" }, @@ -7166,14 +4843,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.16" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -7182,1003 +4859,819 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "function-bind": "^1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.4" } }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, - "license": "MIT" + "license": "MIT", + "bin": { + "he": "bin/he" + } }, - "node_modules/is-url-superb": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", - "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">=10" + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 14" } }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 4" } }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.8.19" } }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, - "license": "BSD-3-Clause", - "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" - }, - "engines": { - "node": ">=10" - } + "license": "ISC" }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } + "license": "ISC" }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">= 0.4" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" + "has-bigints": "^1.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" + "binary-extensions": "^2.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", "dev": true, "license": "MIT", "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" - }, - "bin": { - "jest": "bin/jest.js" - }, + "semver": "^7.7.1" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-cli/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "hasown": "^2.0.2" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-cli/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest-cli/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-cli/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-cli/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "node_modules/is-expression/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=12" + "node": ">=0.4.0" } }, - "node_modules/jest-cli/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "call-bound": "^1.0.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-config/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=8" } }, - "node_modules/jest-config/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, - "license": "ISC", + "license": "MIT", "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" + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": "*" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-config/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "is-extglob": "^2.1.1" }, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "node_modules/is-installed-globally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", + "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "global-directory": "^4.0.1", + "is-path-inside": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", - "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" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.12.0" } }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "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" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-haste-map/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-haste-map/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", "dev": true, "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "isobject": "^3.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "dev": true, "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runner/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "which-typed-array": "^1.1.16" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runner/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-runner/node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } + "license": "MIT" }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/is-url-superb": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", + "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", "dev": true, "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runtime/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jest-runtime/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "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" + "call-bound": "^1.0.3" }, "engines": { - "node": "*" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runtime/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + "license": "MIT" }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + "license": "ISC" }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "license": "MIT", - "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" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "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" + "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/jest-worker": { @@ -8219,13 +5712,6 @@ "dev": true, "license": "MIT" }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -8282,19 +5768,6 @@ "node": ">= 6" } }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -8413,16 +5886,6 @@ "node": ">=6" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -8447,13 +5910,6 @@ "immediate": "~3.0.5" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, "node_modules/loader-runner": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", @@ -8484,13 +5940,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -8682,22 +6131,6 @@ "npm": ">=5.3" } }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -8705,16 +6138,6 @@ "dev": true, "license": "ISC" }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, "node_modules/markdown-table": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", @@ -9112,13 +6535,6 @@ "dev": true, "license": "MIT" }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, "node_modules/node-releases": { "version": "2.0.23", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", @@ -9572,25 +6988,6 @@ "node": ">=6" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/parse-ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", @@ -9719,16 +7116,6 @@ "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==", "license": "MIT" }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -9944,34 +7331,6 @@ "node": ">=6.0.0" } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/pretty-ms": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", @@ -10192,23 +7551,6 @@ "node": ">=6" } }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -10279,13 +7621,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -10557,16 +7892,6 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -11024,16 +8349,6 @@ "dev": true, "license": "MIT" }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/slow-redact": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/slow-redact/-/slow-redact-0.3.2.tgz", @@ -11106,13 +8421,6 @@ "node": ">= 10.x" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/stable-hash": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", @@ -11120,29 +8428,6 @@ "dev": true, "license": "MIT" }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/stdin-discarder": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", @@ -11190,20 +8475,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -11375,16 +8646,6 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -11544,67 +8805,6 @@ } } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/thread-stream": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", @@ -11662,13 +8862,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -11728,82 +8921,6 @@ "node": ">=18" } }, - "node_modules/ts-jest": { - "version": "29.4.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.5.tgz", - "integrity": "sha512-HO3GyiWn2qvTQA4kTgjDcXiMwYQt68a1Y8+JuLRVpdIzm+UOLSHgl/XqR4c6nzJkq5rOkjc02O2I7P7l/Yof0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "^0.2.6", - "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.8", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.7.3", - "type-fest": "^4.41.0", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0 || ^30.0.0", - "@jest/types": "^29.0.0 || ^30.0.0", - "babel-jest": "^29.0.0 || ^30.0.0", - "jest": "^29.0.0 || ^30.0.0", - "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jest-util": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ts-jest/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/ts-loader": { "version": "9.5.4", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.4.tgz", @@ -11987,29 +9104,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -12102,20 +9196,6 @@ "node": ">=14.17" } }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -12242,21 +9322,6 @@ "dev": true, "license": "MIT" }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, "node_modules/void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", @@ -12277,16 +9342,6 @@ "node": ">=6.0.0" } }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, "node_modules/watchpack": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", @@ -12623,13 +9678,6 @@ "node": ">=0.10.0" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" - }, "node_modules/workerpool": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", @@ -12745,27 +9793,6 @@ "dev": true, "license": "ISC" }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -12776,13 +9803,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/package.json b/package.json index 4403f54..7446f7a 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,7 @@ }, "description": "Automatically export types, functions, constants, and classes through barrel files", "devDependencies": { - "@jest/globals": "^29.7.0", "@types/glob": "^8.1.0", - "@types/jest": "^29.5.14", "@types/mocha": "^10.0.1", "@types/node": "^22.x", "@types/vscode": "^1.80.0", @@ -69,13 +67,11 @@ "eslint-plugin-unused-imports": "^4.2.0", "eslint-plugin-simple-import-sort": "^12.1.0", "glob": "^10.3.3", - "jest": "^29.7.0", "jscpd": "^4.0.5", "madge": "^8.0.0", "make-coverage-badge": "^1.2.0", "mocha": "^10.2.0", "prettier": "^3.5.0", - "ts-jest": "^29.2.5", "ts-loader": "^9.4.4", "ts-morph": "^27.0.2", "ts-node": "^10.9.2", diff --git a/src/core/barrel/barrel-content.builder.test.ts b/src/core/barrel/barrel-content.builder.test.ts index c6e550d..8eb4bc5 100644 --- a/src/core/barrel/barrel-content.builder.test.ts +++ b/src/core/barrel/barrel-content.builder.test.ts @@ -1,5 +1,9 @@ -import { BarrelContentBuilder } from './barrel-content.builder'; -import { BarrelEntry, BarrelEntryKind, BarrelExportKind } from '../../types'; +/* eslint-disable @typescript-eslint/no-floating-promises */ + +import { beforeEach, describe, expect, it } from '../../test-utils/testHarness.js'; + +import { BarrelContentBuilder } from './barrel-content.builder.js'; +import { BarrelEntry, BarrelEntryKind, BarrelExportKind } from '../../types/index.js'; describe('BarrelContentBuilder', () => { let builder: BarrelContentBuilder; @@ -67,11 +71,13 @@ describe('BarrelContentBuilder', () => { }, ]; - it.each(buildContentCases)('should build expected output %#', ({ entries, expected }) => { - const result = builder.buildContent(entries, ''); + for (const [index, { entries, expected }] of buildContentCases.entries()) { + it(`should build expected output ${index}`, () => { + const result = builder.buildContent(entries, ''); - expect(result.trim()).toBe(expected); - }); + expect(result.trim()).toBe(expected); + }); + } it('should build output for legacy entry arrays', () => { const entries = new Map([['delta.ts', ['Delta', 'default']]]); @@ -96,10 +102,12 @@ describe('BarrelContentBuilder', () => { ]), ]; - it.each(parentDirectoryCases)('should ignore parent-directory entries %#', (entries) => { - const result = builder.buildContent(entries, ''); + for (const [index, entries] of parentDirectoryCases.entries()) { + it(`should ignore parent-directory entries ${index}`, () => { + const result = builder.buildContent(entries, ''); - expect(result).toBe('\n'); - }); + expect(result).toBe('\n'); + }); + } }); }); diff --git a/src/core/barrel/barrel-content.builder.ts b/src/core/barrel/barrel-content.builder.ts index d9f63aa..86518a5 100644 --- a/src/core/barrel/barrel-content.builder.ts +++ b/src/core/barrel/barrel-content.builder.ts @@ -1,7 +1,7 @@ import { - BARREL_DEFAULT_EXPORT_NAME, - BARREL_EXPORT_LINE_SEPARATOR, - BARREL_PARENT_DIRECTORY_SEGMENT, + DEFAULT_EXPORT_NAME, + NEWLINE, + PARENT_DIRECTORY_SEGMENT, BarrelEntry, BarrelEntryKind, BarrelExport, @@ -35,7 +35,7 @@ export class BarrelContentBuilder { } // Add newline at end of file - return lines.join(BARREL_EXPORT_LINE_SEPARATOR) + BARREL_EXPORT_LINE_SEPARATOR; + return lines.join(NEWLINE) + NEWLINE; } /** @@ -61,7 +61,7 @@ export class BarrelContentBuilder { } private toLegacyExport(name: string): BarrelExport { - if (name === BARREL_DEFAULT_EXPORT_NAME) { + if (name === DEFAULT_EXPORT_NAME) { return { kind: BarrelExportKind.Default }; } @@ -89,7 +89,7 @@ export class BarrelContentBuilder { */ private buildDirectoryExportLines(relativePath: string): string[] { const modulePath = this.getModulePath(relativePath); - if (modulePath.startsWith(BARREL_PARENT_DIRECTORY_SEGMENT)) { + if (modulePath.startsWith(PARENT_DIRECTORY_SEGMENT)) { return []; } return [`export * from './${modulePath}';`]; @@ -103,9 +103,7 @@ export class BarrelContentBuilder { */ private buildFileExportLines(filePath: string, exports: BarrelExport[]): string[] { const cleanedExports = exports.filter((exp) => - exp.kind === BarrelExportKind.Default - ? true - : !exp.name.includes(BARREL_PARENT_DIRECTORY_SEGMENT), + exp.kind === BarrelExportKind.Default ? true : !exp.name.includes(PARENT_DIRECTORY_SEGMENT), ); if (cleanedExports.length === 0) { @@ -116,7 +114,7 @@ export class BarrelContentBuilder { const modulePath = this.getModulePath(filePath); // Skip if this references a parent folder - if (modulePath.startsWith(BARREL_PARENT_DIRECTORY_SEGMENT)) { + if (modulePath.startsWith(PARENT_DIRECTORY_SEGMENT)) { return []; } diff --git a/src/core/barrel/barrel-file.generator.test.ts b/src/core/barrel/barrel-file.generator.test.ts index bd91516..c464757 100644 --- a/src/core/barrel/barrel-file.generator.test.ts +++ b/src/core/barrel/barrel-file.generator.test.ts @@ -1,9 +1,10 @@ -import * as os from 'os'; -import * as path from 'path'; +import * as os from 'node:os'; +import * as path from 'node:path'; import type { Uri } from 'vscode'; -import { BarrelGenerationMode } from '../../types'; +import { BarrelGenerationMode, INDEX_FILENAME } from '../../types'; import { FileSystemService } from '../io/file-system.service'; +import { BarrelFileGenerator } from './barrel-file.generator'; describe('BarrelFileGenerator', () => { let tmpDir: string; @@ -48,9 +49,9 @@ describe('BarrelFileGenerator', () => { const rootUri = { fsPath: tmpDir } as unknown as Uri; await generator.generateBarrelFile(rootUri, { recursive: true }); - const rootIndex = await fileSystem.readFile(path.join(tmpDir, 'index.ts')); - const nestedIndex = await fileSystem.readFile(path.join(nestedDir, 'index.ts')); - const deeperIndex = await fileSystem.readFile(path.join(deeperDir, 'index.ts')); + const rootIndex = await fileSystem.readFile(path.join(tmpDir, INDEX_FILENAME)); + const nestedIndex = await fileSystem.readFile(path.join(nestedDir, INDEX_FILENAME)); + const deeperIndex = await fileSystem.readFile(path.join(deeperDir, INDEX_FILENAME)); expect(rootIndex).toBe( ["export { alpha } from './alpha';", "export * from './nested';", ''].join('\n'), @@ -77,13 +78,13 @@ describe('BarrelFileGenerator', () => { const generator = new BarrelFileGenerator(); const rootUri = { fsPath: tmpDir } as unknown as Uri; - await fileSystem.writeFile(path.join(tmpDir, 'index.ts'), "export * from '../outside';"); + await fileSystem.writeFile(path.join(tmpDir, INDEX_FILENAME), "export * from '../outside';"); await generator.generateBarrelFile(rootUri, { mode: BarrelGenerationMode.UpdateExisting, }); - const rootIndex = await fileSystem.readFile(path.join(tmpDir, 'index.ts')); + const rootIndex = await fileSystem.readFile(path.join(tmpDir, INDEX_FILENAME)); expect(rootIndex).toBe('\n'); }); @@ -98,7 +99,7 @@ describe('BarrelFileGenerator', () => { mode: BarrelGenerationMode.UpdateExisting, }); - const exists = await fileSystem.fileExists(path.join(nestedDir, 'index.ts')); + const exists = await fileSystem.fileExists(path.join(nestedDir, INDEX_FILENAME)); expect(exists).toBe(false); }); diff --git a/src/core/barrel/barrel-file.generator.ts b/src/core/barrel/barrel-file.generator.ts index 4e7de61..7930eaa 100644 --- a/src/core/barrel/barrel-file.generator.ts +++ b/src/core/barrel/barrel-file.generator.ts @@ -5,8 +5,8 @@ import type { Uri } from 'vscode'; import { BarrelExport } from '@/types/barrel/BarrelExport.js'; import { - BARREL_DEFAULT_EXPORT_NAME, - BARREL_INDEX_FILENAME, + DEFAULT_EXPORT_NAME, + INDEX_FILENAME, type BarrelEntry, BarrelEntryKind, BarrelExportKind, @@ -61,7 +61,7 @@ export class BarrelFileGenerator { directoryPath: string, options: NormalizedGenerationOptions, ): Promise { - const barrelFilePath = path.join(directoryPath, BARREL_INDEX_FILENAME); + const barrelFilePath = path.join(directoryPath, INDEX_FILENAME); const { tsFiles, subdirectories } = await this.readDirectoryInfo(directoryPath); if (options.recursive) { @@ -97,7 +97,7 @@ export class BarrelFileGenerator { for (const subdirectoryPath of subdirectories) { if (options.mode === BarrelGenerationMode.UpdateExisting) { const hasIndex = await this.fileSystemService.fileExists( - path.join(subdirectoryPath, BARREL_INDEX_FILENAME), + path.join(subdirectoryPath, INDEX_FILENAME), ); if (!hasIndex) { @@ -146,7 +146,7 @@ export class BarrelFileGenerator { entries: Map, ): Promise { for (const subdirectoryPath of subdirectories) { - const barrelPath = path.join(subdirectoryPath, BARREL_INDEX_FILENAME); + const barrelPath = path.join(subdirectoryPath, INDEX_FILENAME); if (!(await this.fileSystemService.fileExists(barrelPath))) { continue; } @@ -185,7 +185,7 @@ export class BarrelFileGenerator { private normalizeParsedExports(exports: ParsedExport[]): BarrelExport[] { return exports.map((exp) => { - if (exp.name === BARREL_DEFAULT_EXPORT_NAME) { + if (exp.name === DEFAULT_EXPORT_NAME) { return { kind: BarrelExportKind.Default }; } diff --git a/src/core/barrel/index.ts b/src/core/barrel/index.ts index bca64b8..253332d 100644 --- a/src/core/barrel/index.ts +++ b/src/core/barrel/index.ts @@ -1,4 +1,2 @@ -export * from '../io/file-system.service.js'; -export * from '../parser/export.parser.js'; export * from './barrel-content.builder.js'; export * from './barrel-file.generator.js'; diff --git a/src/core/io/file-system.service.test.ts b/src/core/io/file-system.service.test.ts index 511327e..8305b5b 100644 --- a/src/core/io/file-system.service.test.ts +++ b/src/core/io/file-system.service.test.ts @@ -1,12 +1,9 @@ -import { Dirent } from 'fs'; -import * as fs from 'fs/promises'; -import * as path from 'path'; - -import { beforeEach, describe, expect, it } from '@jest/globals'; +import { Dirent } from 'node:fs'; +import * as fs from 'node:fs/promises'; +import * as path from 'node:path'; import { FileSystemService } from './file-system.service.js'; - -jest.mock('fs/promises'); +import { INDEX_FILENAME } from '../../types/index.js'; describe('FileSystemService', () => { let service: FileSystemService; @@ -40,7 +37,7 @@ describe('FileSystemService', () => { it('should return TypeScript files excluding index.ts and definition files', async () => { const mockEntries: Dirent[] = [ createFileEntry('file.ts'), - createFileEntry('index.ts'), + createFileEntry(INDEX_FILENAME), createFileEntry('types.d.ts'), createFileEntry('component.tsx'), createDirectoryEntry('nested'), @@ -59,7 +56,7 @@ describe('FileSystemService', () => { const typeScriptEntryCases: Array<{ entry: Dirent; shouldInclude: boolean }> = [ { entry: createFileEntry('alpha.ts'), shouldInclude: true }, { entry: createFileEntry('component.tsx'), shouldInclude: true }, - { entry: createFileEntry('index.ts'), shouldInclude: false }, + { entry: createFileEntry(INDEX_FILENAME), shouldInclude: false }, { entry: createFileEntry('types.d.ts'), shouldInclude: false }, { entry: createFileEntry('main.js'), shouldInclude: false }, { entry: createDirectoryEntry('nested'), shouldInclude: false }, diff --git a/src/core/io/file-system.service.ts b/src/core/io/file-system.service.ts index 19e78d8..cf9b738 100644 --- a/src/core/io/file-system.service.ts +++ b/src/core/io/file-system.service.ts @@ -2,7 +2,8 @@ import { Dirent } from 'node:fs'; import * as fs from 'node:fs/promises'; import * as path from 'node:path'; -const INDEX_FILE_NAME = 'index.ts'; +import { INDEX_FILENAME } from '../../types/index.js'; + const IGNORED_DIRECTORIES = new Set(['node_modules', '.git']); /** @@ -44,7 +45,7 @@ export class FileSystemService { return false; } - const isIndexFile = entry.name === INDEX_FILE_NAME; + const isIndexFile = entry.name === INDEX_FILENAME; const isDefinitionFile = entry.name.endsWith('.d.ts'); const isTsFile = entry.name.endsWith('.ts') || entry.name.endsWith('.tsx'); diff --git a/src/core/io/index.ts b/src/core/io/index.ts new file mode 100644 index 0000000..64375db --- /dev/null +++ b/src/core/io/index.ts @@ -0,0 +1 @@ +export * from './file-system.service.js'; diff --git a/src/core/parser/export.parser.ts b/src/core/parser/export.parser.ts index 46bd287..667935a 100644 --- a/src/core/parser/export.parser.ts +++ b/src/core/parser/export.parser.ts @@ -1,4 +1,4 @@ -import { BARREL_DEFAULT_EXPORT_NAME, type ParsedExport } from '../../types/index.js'; +import { DEFAULT_EXPORT_NAME, type ParsedExport } from '../../types/index.js'; import { splitAndClean } from '../../utils/string.js'; /** @@ -28,7 +28,7 @@ export class ExportParser { const result = Array.from(exportMap.values()); if (hasDefaultExport) { - result.push({ name: BARREL_DEFAULT_EXPORT_NAME, typeOnly: false }); + result.push({ name: DEFAULT_EXPORT_NAME, typeOnly: false }); } return result; @@ -69,7 +69,7 @@ export class ExportParser { const entries = this.parseExportListEntries(match[2], Boolean(match[1])); for (const { name, typeOnly } of entries) { - if (name.toLowerCase() === BARREL_DEFAULT_EXPORT_NAME) { + if (name.toLowerCase() === DEFAULT_EXPORT_NAME) { hasDefault = true; continue; } diff --git a/src/core/parser/index.ts b/src/core/parser/index.ts new file mode 100644 index 0000000..5a57690 --- /dev/null +++ b/src/core/parser/index.ts @@ -0,0 +1 @@ +export * from './export.parser.js'; diff --git a/src/logging/pino.logger.ts b/src/logging/pino.logger.ts index c73dc63..bd1ed97 100644 --- a/src/logging/pino.logger.ts +++ b/src/logging/pino.logger.ts @@ -18,15 +18,17 @@ import pino from 'pino'; import type { OutputChannel } from 'vscode'; +import { isObject, isString } from '../utils/guards.js'; + type LogMetadata = Record; /** * Minimal structured logger used by the extension. Falls back to a no-op implementation if pino - * fails to initialise in the host environment. + * fails to initialize in the host environment. */ export class PinoLogger { private logger: pino.Logger; - private isAvailable = true; + private readonly isAvailable: boolean = true; private static sharedOutputChannel?: OutputChannel; @@ -112,7 +114,7 @@ export class PinoLogger { * @param message - The failure message. * @param metadata - Optional metadata to include with the failure. */ - setFailed(message: string, metadata?: LogMetadata): void { + fatal(message: string, metadata?: LogMetadata): void { this.logger.fatal(metadata || {}, `Action failed: ${message}`); this.appendToOutputChannel('FATAL', `Action failed: ${message}`, metadata); } @@ -180,14 +182,14 @@ export class PinoLogger { if (error instanceof Error) { return error.stack || error.message; } - if (typeof error === 'object' && error !== null) { + if (isObject(error) && error !== null) { return this.safeStringify(error); } return String(error); } private safeStringify(value: unknown): string { - if (typeof value === 'string') { + if (isString(value)) { return value; } try { diff --git a/src/test-utils/testHarness.ts b/src/test-utils/testHarness.ts deleted file mode 100644 index c7d887f..0000000 --- a/src/test-utils/testHarness.ts +++ /dev/null @@ -1,195 +0,0 @@ -import { - after as nodeAfter, - afterEach as nodeAfterEach, - before as nodeBefore, - beforeEach as nodeBeforeEach, - describe as nodeDescribe, - it as nodeIt, - mock as nodeMock, - test as nodeTest, -} from 'node:test'; - -import expectImport from 'expect'; - -type AnyFunction = (...args: any[]) => any; - -type MockState = { - calls: unknown[][]; - results: Array<{ type: 'return'; value?: unknown } | { type: 'throw'; error: unknown }>; -}; - -type JestLikeMock = ((...args: any[]) => any) & { - mock: MockState; - mockClear(): JestLikeMock; - mockReset(): JestLikeMock; - mockRestore(): JestLikeMock; - mockImplementation(impl: AnyFunction): JestLikeMock; - mockImplementationOnce(impl: AnyFunction): JestLikeMock; - mockReturnValue(value: unknown): JestLikeMock; - mockReturnValueOnce(value: unknown): JestLikeMock; - mockResolvedValue(value: unknown): JestLikeMock; - mockResolvedValueOnce(value: unknown): JestLikeMock; - mockRejectedValue(error: unknown): JestLikeMock; - mockRejectedValueOnce(error: unknown): JestLikeMock; - __restore?: () => void; -}; - -const activeMocks = new Set(); - -function recordCall(state: MockState, args: unknown[], invoke: () => unknown): unknown { - state.calls.push(args); - try { - const value = invoke(); - state.results.push({ type: 'return', value }); - return value; - } catch (error) { - state.results.push({ type: 'throw', error }); - throw error; - } -} - -function createState(): MockState { - return { calls: [], results: [] }; -} - -function createJestMock(implementation: AnyFunction = () => undefined): JestLikeMock { - let defaultImpl: AnyFunction = implementation; - const onceQueue: AnyFunction[] = []; - const state = createState(); - - const handler = function (this: unknown, ...args: unknown[]) { - return recordCall(state, args, () => { - const nextImpl = onceQueue.shift() ?? defaultImpl; - return nextImpl.apply(this, args); - }); - }; - - const nodeMockFn = nodeMock.fn(handler) as unknown as JestLikeMock; - - nodeMockFn.mock = state; - - nodeMockFn.mockClear = () => { - state.calls.length = 0; - state.results.length = 0; - return nodeMockFn; - }; - - nodeMockFn.mockReset = () => { - onceQueue.length = 0; - defaultImpl = implementation; - nodeMockFn.mockClear(); - return nodeMockFn; - }; - - nodeMockFn.mockRestore = () => { - nodeMockFn.mockReset(); - nodeMockFn.__restore?.(); - activeMocks.delete(nodeMockFn); - return nodeMockFn; - }; - - nodeMockFn.mockImplementation = (impl: AnyFunction) => { - defaultImpl = impl; - return nodeMockFn; - }; - - nodeMockFn.mockImplementationOnce = (impl: AnyFunction) => { - onceQueue.push(impl); - return nodeMockFn; - }; - - nodeMockFn.mockReturnValue = (value: unknown) => { - defaultImpl = () => value; - return nodeMockFn; - }; - - nodeMockFn.mockReturnValueOnce = (value: unknown) => { - onceQueue.push(() => value); - return nodeMockFn; - }; - - nodeMockFn.mockResolvedValue = (value: unknown) => { - defaultImpl = () => Promise.resolve(value); - return nodeMockFn; - }; - - nodeMockFn.mockResolvedValueOnce = (value: unknown) => { - onceQueue.push(() => Promise.resolve(value)); - return nodeMockFn; - }; - - nodeMockFn.mockRejectedValue = (error: unknown) => { - defaultImpl = () => Promise.reject(error); - return nodeMockFn; - }; - - nodeMockFn.mockRejectedValueOnce = (error: unknown) => { - onceQueue.push(() => Promise.reject(error)); - return nodeMockFn; - }; - - activeMocks.add(nodeMockFn); - - return nodeMockFn; -} - -function spyOn(object: Record, property: keyof typeof object): JestLikeMock { - const original = object[property] as AnyFunction; - const spy = createJestMock(function (this: unknown, ...args: unknown[]) { - return original.apply(this ?? object, args); - }); - - const wrapper = function (this: unknown, ...args: unknown[]) { - return spy.apply(this, args); - }; - - object[property] = wrapper; - - spy.__restore = () => { - object[property] = original; - }; - - return spy; -} - -function clearAllMocks(): void { - activeMocks.forEach((mockFn) => { - mockFn.mockClear(); - }); -} - -function resetAllMocks(): void { - activeMocks.forEach((mockFn) => { - mockFn.mockReset(); - }); -} - -function restoreAllMocks(): void { - activeMocks.forEach((mockFn) => { - mockFn.mockRestore(); - }); -} - -const jest = { - fn: (implementation?: AnyFunction) => createJestMock(implementation), - spyOn, - clearAllMocks, - resetAllMocks, - restoreAllMocks, -}; - -const expect = expectImport; - -export { - nodeAfter as after, - nodeAfterEach as afterEach, - nodeBefore as before, - nodeBeforeEach as beforeEach, - nodeDescribe as describe, - expect, - nodeIt as it, - jest, - nodeTest as test, -}; - -export type JestMockFunction = JestLikeMock; diff --git a/src/test/suite/barrel-content.builder.test.ts b/src/test/suite/barrel-content.builder.test.ts index efffb54..bec6f92 100644 --- a/src/test/suite/barrel-content.builder.test.ts +++ b/src/test/suite/barrel-content.builder.test.ts @@ -1,46 +1,52 @@ -import * as assert from 'node:assert'; +/* eslint-disable @typescript-eslint/no-floating-promises */ + +import { beforeEach, describe, expect, it } from '../../test-utils/testHarness.js'; import { BarrelContentBuilder } from '../../core/barrel/barrel-content.builder.js'; import { BarrelEntryKind, BarrelExportKind, type BarrelEntry } from '../../types/index.js'; -suite('BarrelContentBuilder Test Suite', () => { +describe('BarrelContentBuilder Test Suite', () => { let builder: BarrelContentBuilder; - setup(() => { + beforeEach(() => { builder = new BarrelContentBuilder(); }); - test('Should build content for single file with single export', () => { + it('should build content for single file with single export', () => { const exportsByFile = new Map([['myFile.ts', ['MyClass']]]); const content = builder.buildContent(exportsByFile, '/some/path'); - assert.strictEqual(content, "export { MyClass } from './myFile';\n"); + + expect(content).toBe("export { MyClass } from './myFile';\n"); }); - test('Should build content for single file with multiple exports', () => { + it('should build content for single file with multiple exports', () => { const exportsByFile = new Map([['myFile.ts', ['MyClass', 'MyInterface', 'myConst']]]); const content = builder.buildContent(exportsByFile, '/some/path'); - assert.strictEqual(content, "export { MyClass, MyInterface, myConst } from './myFile';\n"); + + expect(content).toBe("export { MyClass, MyInterface, myConst } from './myFile';\n"); }); - test('Should build content for multiple files', () => { + it('should build content for multiple files', () => { const exportsByFile = new Map([ ['fileA.ts', ['ClassA']], ['fileB.ts', ['ClassB']], ]); const content = builder.buildContent(exportsByFile, '/some/path'); - const lines = content.split('\n').filter((line) => line); - assert.strictEqual(lines.length, 2); - assert.ok(content.includes("export { ClassA } from './fileA';")); - assert.ok(content.includes("export { ClassB } from './fileB';")); + const lines = content.split('\n').filter(Boolean); + + expect(lines).toHaveLength(2); + expect(content).toContain("export { ClassA } from './fileA';"); + expect(content).toContain("export { ClassB } from './fileB';"); }); - test('Should handle default exports', () => { + it('should handle default exports', () => { const exportsByFile = new Map([['myFile.ts', ['default']]]); const content = builder.buildContent(exportsByFile, '/some/path'); - assert.strictEqual(content, "export { default } from './myFile';\n"); + + expect(content).toBe("export { default } from './myFile';\n"); }); - test('Should handle default, type, and named exports together', () => { + it('should handle default, type, and named exports together', () => { const entries = new Map(); entries.set('myFile.ts', { kind: BarrelEntryKind.File, @@ -52,31 +58,34 @@ suite('BarrelContentBuilder Test Suite', () => { }); const content = builder.buildContent(entries, '/some/path'); - assert.ok(content.includes("export { MyClass } from './myFile';")); - assert.ok(content.includes("export type { MyInterface } from './myFile';")); - assert.ok(content.includes("export { default } from './myFile';")); + + expect(content).toContain("export { MyClass } from './myFile';"); + expect(content).toContain("export type { MyInterface } from './myFile';"); + expect(content).toContain("export { default } from './myFile';"); }); - test('Should sort files alphabetically', () => { + it('should sort files alphabetically', () => { const exportsByFile = new Map([ ['zebra.ts', ['ClassZ']], ['alpha.ts', ['ClassA']], ['beta.ts', ['ClassB']], ]); const content = builder.buildContent(exportsByFile, '/some/path'); - const lines = content.split('\n').filter((line) => line); - assert.ok(lines[0].includes('alpha')); - assert.ok(lines[1].includes('beta')); - assert.ok(lines[2].includes('zebra')); + const lines = content.split('\n').filter(Boolean); + + expect(lines[0]).toContain('alpha'); + expect(lines[1]).toContain('beta'); + expect(lines[2]).toContain('zebra'); }); - test('Should filter out parent folder references', () => { + it('should filter out parent folder references', () => { const exportsByFile = new Map([ ['../parent.ts', ['ParentClass']], ['local.ts', ['LocalClass']], ]); const content = builder.buildContent(exportsByFile, '/some/path'); - assert.ok(!content.includes('ParentClass')); - assert.ok(content.includes('LocalClass')); + + expect(content).not.toContain('ParentClass'); + expect(content).toContain('LocalClass'); }); }); diff --git a/src/test/suite/barrel-file.generator.test.ts b/src/test/suite/barrel-file.generator.test.ts index 71ccfbf..ee3a3e2 100644 --- a/src/test/suite/barrel-file.generator.test.ts +++ b/src/test/suite/barrel-file.generator.test.ts @@ -1,29 +1,31 @@ -import * as assert from 'node:assert'; +/* eslint-disable @typescript-eslint/no-floating-promises */ + import * as fs from 'node:fs/promises'; import * as os from 'node:os'; import * as path from 'node:path'; import * as vscode from 'vscode'; -suite('BarrelFileGenerator Test Suite', () => { +import { afterEach, beforeEach, describe, expect, it } from '../../test-utils/testHarness.js'; + +import { BarrelFileGenerator } from '../../core/barrel/barrel-file.generator.js'; + +describe('BarrelFileGenerator Test Suite', () => { let testDir: string; - setup(async () => { - // Create a temporary test directory + beforeEach(async () => { testDir = await fs.mkdtemp(path.join(os.tmpdir(), 'barrel-test-')); }); - teardown(async () => { - // Clean up test directory + afterEach(async () => { try { await fs.rm(testDir, { recursive: true, force: true }); } catch { - // Ignore cleanup errors + // Swallow cleanup errors to avoid masking test outcomes. } }); - test('Should generate barrel file with exports from multiple files', async () => { - // Create test TypeScript files + it('should generate barrel file with exports from multiple files', async () => { await fs.writeFile( path.join(testDir, 'file1.ts'), 'export class MyClass {}\nexport const myConst = 42;', @@ -38,24 +40,19 @@ suite('BarrelFileGenerator Test Suite', () => { await generator.generateBarrelFile(uri); - // Read the generated barrel file const barrelPath = path.join(testDir, 'index.ts'); const content = await fs.readFile(barrelPath, 'utf-8'); - // Verify the barrel file contains expected exports - assert.ok(content.includes('export { MyClass } from')); - assert.ok(content.includes('myConst')); - assert.ok(content.includes('export type { MyInterface }')); - assert.ok(content.includes('myFunction')); - assert.ok(content.includes("from './file1'")); - assert.ok(content.includes("from './file2'")); + expect(content).toContain('export { MyClass } from'); + expect(content).toContain('myConst'); + expect(content).toContain('export type { MyInterface }'); + expect(content).toContain('myFunction'); + expect(content).toContain("from './file1'"); + expect(content).toContain("from './file2'"); }); - test('Should update existing barrel file', async () => { - // Create test TypeScript file + it('should update existing barrel file', async () => { await fs.writeFile(path.join(testDir, 'newFile.ts'), 'export class NewClass {}'); - - // Create initial barrel file await fs.writeFile(path.join(testDir, 'index.ts'), '// Old content'); const generator = new BarrelFileGenerator(); @@ -63,31 +60,23 @@ suite('BarrelFileGenerator Test Suite', () => { await generator.generateBarrelFile(uri); - // Read the updated barrel file const barrelPath = path.join(testDir, 'index.ts'); const content = await fs.readFile(barrelPath, 'utf-8'); - // Verify the barrel file was updated - assert.ok(content.includes('NewClass')); - assert.ok(!content.includes('// Old content')); + expect(content).toContain('NewClass'); + expect(content).not.toContain('// Old content'); }); - test('Should throw error when no TypeScript files found', async () => { + it('should throw error when no TypeScript files found', async () => { const generator = new BarrelFileGenerator(); const uri = vscode.Uri.file(testDir); - await assert.rejects( - async () => { - await generator.generateBarrelFile(uri); - }, - { - message: 'No TypeScript files found in the selected directory', - }, + await expect(generator.generateBarrelFile(uri)).rejects.toThrow( + 'No TypeScript files found in the selected directory', ); }); - test('Should ignore index.ts when scanning files', async () => { - // Create test TypeScript files including an index.ts + it('should ignore index.ts when scanning files', async () => { await fs.writeFile(path.join(testDir, 'file1.ts'), 'export class MyClass {}'); await fs.writeFile(path.join(testDir, 'index.ts'), 'export class IndexClass {}'); @@ -96,12 +85,10 @@ suite('BarrelFileGenerator Test Suite', () => { await generator.generateBarrelFile(uri); - // Read the generated barrel file const barrelPath = path.join(testDir, 'index.ts'); const content = await fs.readFile(barrelPath, 'utf-8'); - // Verify the barrel file contains exports from file1 but not the old index.ts content - assert.ok(content.includes('export { MyClass } from')); - assert.ok(!content.includes('IndexClass')); + expect(content).toContain('export { MyClass } from'); + expect(content).not.toContain('IndexClass'); }); }); diff --git a/src/test/suite/export.parser.test.ts b/src/test/suite/export.parser.test.ts index a8e9580..af3da74 100644 --- a/src/test/suite/export.parser.test.ts +++ b/src/test/suite/export.parser.test.ts @@ -1,99 +1,121 @@ -import * as assert from 'assert'; +/* eslint-disable @typescript-eslint/no-floating-promises */ + +import { beforeEach, describe, expect, it } from '../../test-utils/testHarness.js'; import { ExportParser } from '../../core/parser/export.parser.js'; -suite('ExportParser Test Suite', () => { +describe('ExportParser Test Suite', () => { let parser: ExportParser; - setup(() => { + beforeEach(() => { parser = new ExportParser(); }); - test('Should extract class exports', () => { + it('should extract class exports', () => { const content = 'export class MyClass {}'; const exports = parser.extractExports(content); - assert.deepStrictEqual(exports, [{ name: 'MyClass', typeOnly: false }]); + + expect(exports).toEqual([{ name: 'MyClass', typeOnly: false }]); }); - test('Should extract interface exports', () => { + it('should extract interface exports', () => { const content = 'export interface MyInterface {}'; const exports = parser.extractExports(content); - assert.deepStrictEqual(exports, [{ name: 'MyInterface', typeOnly: true }]); + + expect(exports).toEqual([{ name: 'MyInterface', typeOnly: true }]); }); - test('Should extract type exports', () => { + it('should extract type exports', () => { const content = 'export type MyType = string;'; const exports = parser.extractExports(content); - assert.deepStrictEqual(exports, [{ name: 'MyType', typeOnly: true }]); + + expect(exports).toEqual([{ name: 'MyType', typeOnly: true }]); }); - test('Should extract function exports', () => { + it('should extract function exports', () => { const content = 'export function myFunction() {}'; const exports = parser.extractExports(content); - assert.deepStrictEqual(exports, [{ name: 'myFunction', typeOnly: false }]); + + expect(exports).toEqual([{ name: 'myFunction', typeOnly: false }]); }); - test('Should extract const exports', () => { + it('should extract const exports', () => { const content = 'export const myConst = 42;'; const exports = parser.extractExports(content); - assert.deepStrictEqual(exports, [{ name: 'myConst', typeOnly: false }]); + + expect(exports).toEqual([{ name: 'myConst', typeOnly: false }]); }); - test('Should extract enum exports', () => { + it('should extract enum exports', () => { const content = 'export enum MyEnum { A, B }'; const exports = parser.extractExports(content); - assert.deepStrictEqual(exports, [{ name: 'MyEnum', typeOnly: false }]); + + expect(exports).toEqual([{ name: 'MyEnum', typeOnly: false }]); }); - test('Should extract default exports', () => { + it('should extract default exports', () => { const content = 'export default class MyClass {}'; const exports = parser.extractExports(content); - assert.ok(exports.some((entry) => entry.name === 'default')); + + expect(exports).toEqual(expect.arrayContaining([{ name: 'default', typeOnly: false }])); }); - test('Should extract multiple exports', () => { + it('should extract multiple exports', () => { const content = ` export class MyClass {} export interface MyInterface {} export const myConst = 42; `; const exports = parser.extractExports(content); - assert.strictEqual(exports.length, 3); - assert.ok(exports.some((entry) => entry.name === 'MyClass' && entry.typeOnly === false)); - assert.ok(exports.some((entry) => entry.name === 'MyInterface' && entry.typeOnly === true)); - assert.ok(exports.some((entry) => entry.name === 'myConst' && entry.typeOnly === false)); + + expect(exports).toHaveLength(3); + expect(exports).toEqual( + expect.arrayContaining([ + { name: 'MyClass', typeOnly: false }, + { name: 'MyInterface', typeOnly: true }, + { name: 'myConst', typeOnly: false }, + ]), + ); }); - test('Should extract export lists', () => { + it('should extract export lists', () => { const content = 'export { MyClass, MyInterface };'; const exports = parser.extractExports(content); - assert.ok(exports.some((entry) => entry.name === 'MyClass')); - assert.ok(exports.some((entry) => entry.name === 'MyInterface')); + + expect(exports).toEqual( + expect.arrayContaining([ + { name: 'MyClass', typeOnly: false }, + { name: 'MyInterface', typeOnly: false }, + ]), + ); }); - test('Should handle export with as keyword', () => { + it('should handle export with as keyword', () => { const content = 'export { MyClass as RenamedClass };'; const exports = parser.extractExports(content); - assert.ok(exports.some((entry) => entry.name === 'RenamedClass')); + + expect(exports).toEqual(expect.arrayContaining([{ name: 'RenamedClass', typeOnly: false }])); }); - test('Should ignore comments', () => { + it('should ignore comments', () => { const content = ` // export class CommentedClass {} /* export const commentedConst = 42; */ export class RealClass {} `; const exports = parser.extractExports(content); - assert.deepStrictEqual(exports, [{ name: 'RealClass', typeOnly: false }]); + + expect(exports).toEqual([{ name: 'RealClass', typeOnly: false }]); }); - test('Should remove duplicates', () => { + it('should remove duplicates', () => { const content = ` export const myConst = 42; export { myConst }; `; const exports = parser.extractExports(content); - assert.strictEqual(exports.length, 1); - assert.deepStrictEqual(exports, [{ name: 'myConst', typeOnly: false }]); + + expect(exports).toHaveLength(1); + expect(exports).toEqual([{ name: 'myConst', typeOnly: false }]); }); }); diff --git a/src/test/suite/index.ts b/src/test/suite/index.ts index c0d3843..973c0da 100644 --- a/src/test/suite/index.ts +++ b/src/test/suite/index.ts @@ -1,36 +1,39 @@ -import * as path from 'path'; -import { fileURLToPath } from 'url'; +import { once } from 'node:events'; +import * as path from 'node:path'; +import { fileURLToPath } from 'node:url'; import { glob } from 'glob'; -import Mocha from 'mocha'; +import { run as runNodeTests } from 'node:test'; -export async function run(): Promise { - // Create the mocha test - const mocha = new Mocha({ - ui: 'tdd', - color: true, - }); +import { PARENT_DIRECTORY_SEGMENT } from '@/types'; - const testsRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +export async function run(): Promise { + const testsRoot = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + PARENT_DIRECTORY_SEGMENT, + ); console.log('Test runner starting...'); console.log('Tests root:', testsRoot); - const files = await glob('**/**.test.js', { cwd: testsRoot }); + const files = await glob('**/*.test.js', { cwd: testsRoot, absolute: true }); console.log('Found test files:', files); - // Add files to the test suite - files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); - - // Run the tests - return new Promise((resolve, reject) => { - mocha.run((failures) => { - if (failures > 0) { - reject(new Error(`${failures} tests failed.`)); - } else { - resolve(); - } - }); + let failureCount = 0; + const testStream = runNodeTests({ + files, + isolation: 'none', + setup: (stream) => { + stream.on('test:fail', () => { + failureCount += 1; + }); + }, }); + + await once(testStream, 'end'); + + if (failureCount > 0) { + throw new Error(`${failureCount} tests failed.`); + } } diff --git a/src/types/barrel/BarrelEntry.ts b/src/types/barrel/BarrelEntry.ts index e2c85a5..e593229 100644 --- a/src/types/barrel/BarrelEntry.ts +++ b/src/types/barrel/BarrelEntry.ts @@ -1,6 +1,9 @@ import { BarrelEntryKind } from './BarrelEntryKind'; import { BarrelExport } from './BarrelExport'; +/** + * Represents an entry in a barrel, which can be either a file with exports or a directory. + */ export type BarrelEntry = | { kind: BarrelEntryKind.File; diff --git a/src/types/barrel/BarrelEntryKind.ts b/src/types/barrel/BarrelEntryKind.ts index 8434d5b..a473b83 100644 --- a/src/types/barrel/BarrelEntryKind.ts +++ b/src/types/barrel/BarrelEntryKind.ts @@ -1,3 +1,6 @@ +/** + * Defines the kinds of entries that can exist within a barrel. + */ export enum BarrelEntryKind { File = 'file', Directory = 'directory', diff --git a/src/types/barrel/BarrelExport.ts b/src/types/barrel/BarrelExport.ts index b007d9a..e7ab32f 100644 --- a/src/types/barrel/BarrelExport.ts +++ b/src/types/barrel/BarrelExport.ts @@ -1,5 +1,8 @@ import { BarrelExportKind } from './BarrelExportKind'; +/** + * Represents an export within a barrel, which can be a value export, type export, or default export. + */ export type BarrelExport = | { kind: BarrelExportKind.Value; diff --git a/src/types/barrel/BarrelExportKind.ts b/src/types/barrel/BarrelExportKind.ts index 8e74358..0c2bab8 100644 --- a/src/types/barrel/BarrelExportKind.ts +++ b/src/types/barrel/BarrelExportKind.ts @@ -1,3 +1,6 @@ +/** + * Defines the kinds of exports that can be present in a barrel file. + */ export enum BarrelExportKind { Value = 'value', Type = 'type', diff --git a/src/types/barrel/BarrelGenerationMode.ts b/src/types/barrel/BarrelGenerationMode.ts index ef02b2c..aca1b6c 100644 --- a/src/types/barrel/BarrelGenerationMode.ts +++ b/src/types/barrel/BarrelGenerationMode.ts @@ -1,3 +1,6 @@ +/** + * Defines the modes for generating barrel files. + */ export enum BarrelGenerationMode { CreateOrUpdate = 'createOrUpdate', UpdateExisting = 'updateExisting', diff --git a/src/types/barrel/BarrelGenerationOptions.ts b/src/types/barrel/BarrelGenerationOptions.ts index 0d8a713..e000eb9 100644 --- a/src/types/barrel/BarrelGenerationOptions.ts +++ b/src/types/barrel/BarrelGenerationOptions.ts @@ -1,5 +1,8 @@ import { BarrelGenerationMode } from './BarrelGenerationMode'; +/** + * Options for generating barrel files. + */ export interface BarrelGenerationOptions { recursive?: boolean; mode?: BarrelGenerationMode; diff --git a/src/types/barrel/NormalizedBarrelGenerationOptions.ts b/src/types/barrel/NormalizedBarrelGenerationOptions.ts index 234a603..e39c54b 100644 --- a/src/types/barrel/NormalizedBarrelGenerationOptions.ts +++ b/src/types/barrel/NormalizedBarrelGenerationOptions.ts @@ -1,3 +1,6 @@ import { BarrelGenerationOptions } from './BarrelGenerationOptions'; +/** + * Normalized options for generating barrel files, with all properties required. + */ export type NormalizedBarrelGenerationOptions = Required; diff --git a/src/types/barrel/ParsedExport.ts b/src/types/barrel/ParsedExport.ts index 89666f7..5e41a8f 100644 --- a/src/types/barrel/ParsedExport.ts +++ b/src/types/barrel/ParsedExport.ts @@ -1,3 +1,6 @@ +/** + * Represents a parsed export statement with its name and whether it is type-only. + */ export interface ParsedExport { name: string; typeOnly: boolean; diff --git a/src/types/constants.ts b/src/types/constants.ts index a44b735..706975a 100644 --- a/src/types/constants.ts +++ b/src/types/constants.ts @@ -1,4 +1,4 @@ -export const BARREL_DEFAULT_EXPORT_NAME = 'default'; -export const BARREL_EXPORT_LINE_SEPARATOR = '\n'; -export const BARREL_PARENT_DIRECTORY_SEGMENT = '..'; -export const BARREL_INDEX_FILENAME = 'index.ts'; +export const DEFAULT_EXPORT_NAME = 'default'; +export const INDEX_FILENAME = 'index.ts'; +export const NEWLINE = '\n'; +export const PARENT_DIRECTORY_SEGMENT = '..'; diff --git a/src/utils/guards.ts b/src/utils/guards.ts new file mode 100644 index 0000000..c7ec06b --- /dev/null +++ b/src/utils/guards.ts @@ -0,0 +1,17 @@ +/** + * Returns true when the provided value is a non-null object. + * @param value The value to check + * @returns True when the value is a non-null object; otherwise false. + */ +export function isObject(value: unknown): value is Record { + return typeof value === 'object' && value !== null; +} + +/** + * Returns true when the provided value is a string primitive. + * @param value The value to check + * @returns True when the value is a string; otherwise false. + */ +export function isString(value: unknown): value is string { + return typeof value === 'string'; +} diff --git a/src/utils/string.test.ts b/src/utils/string.test.ts new file mode 100644 index 0000000..5a8475c --- /dev/null +++ b/src/utils/string.test.ts @@ -0,0 +1,58 @@ +/* eslint-disable @typescript-eslint/no-floating-promises */ + +import { describe, expect, it } from '../test-utils/testHarness.js'; + +import { splitAndClean, sortAlphabetically } from './string.js'; + +describe('splitAndClean', () => { + it('should split by default comma delimiter, trim, and remove empty fragments', () => { + expect(splitAndClean('a, b , c')).toEqual(['a', 'b', 'c']); + expect(splitAndClean('a,,b, ,c')).toEqual(['a', 'b', 'c']); + }); + + it('should split by custom string delimiter', () => { + expect(splitAndClean('a;b;c', ';')).toEqual(['a', 'b', 'c']); + }); + + it('should split by RegExp delimiter', () => { + expect(splitAndClean('a1b2c', /\d/)).toEqual(['a', 'b', 'c']); + }); + + it('should handle empty string', () => { + expect(splitAndClean('')).toEqual([]); + }); + + it('should handle string with only delimiters and spaces', () => { + expect(splitAndClean(', , ,')).toEqual([]); + }); + + it('should handle no splits needed', () => { + expect(splitAndClean('abc')).toEqual(['abc']); + }); +}); + +describe('sortAlphabetically', () => { + it('should sort strings alphabetically', () => { + expect(sortAlphabetically(['c', 'a', 'b'])).toEqual(['a', 'b', 'c']); + }); + + it('should handle empty array', () => { + expect(sortAlphabetically([])).toEqual([]); + }); + + it('should handle single item', () => { + expect(sortAlphabetically(['a'])).toEqual(['a']); + }); + + it('should sort with locale', () => { + expect(sortAlphabetically(['ä', 'a'], 'de')).toEqual(['a', 'ä']); + }); + + it('should sort with options', () => { + expect(sortAlphabetically(['A', 'a'], undefined, { sensitivity: 'base' })).toEqual(['A', 'a']); + }); + + it('should handle iterable input', () => { + expect(sortAlphabetically(new Set(['c', 'a', 'b']))).toEqual(['a', 'b', 'c']); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index 87dbce7..224cfac 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -26,15 +26,6 @@ "target": "ES2022", "useUnknownInCatchVariables": true }, - "exclude": [ - ".vscode-test", - "tests", - "__mocks__/**/*", - "node_modules", - "out", - "src/**/*.spec.ts", - "src/**/*.test.ts", - "src/**/__tests__/**/*" - ], - "include": ["src/**/*"] + "exclude": [".vscode-test", "tests", "test-utils", "node_modules", "out", "src/**/*.test.ts"], + "include": ["src/**/*.ts"] } diff --git a/tsconfig.test.json b/tsconfig.test.json index 208733a..8a43339 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -7,8 +7,8 @@ "moduleResolution": "NodeNext", "noEmit": true, "sourceMap": true, - "types": ["jest", "node"] + "types": ["node"] }, - "include": ["src/**/*.ts", "__tests__/**/*", "__mocks__/**/*", "jest.config.cjs"], + "include": ["src/**/*.ts", "__tests__/**/*", "__mocks__/**/*"], "exclude": ["out", "node_modules", ".vscode-test"] } From 5ad55e5991d6fd6c0b141db55bbaf29880335b1e Mon Sep 17 00:00:00 2001 From: coderrob Date: Fri, 24 Oct 2025 18:45:40 -0500 Subject: [PATCH 14/20] refactor: migrate tests from Mocha to Node's built-in test module - Removed Mocha and related type definitions from devDependencies. - Updated test files to use Node's `assert` and `test` modules. - Replaced `expect` assertions with `assert` assertions for consistency. - Created a custom test harness to mimic Jest-like functionality for spies. - Adjusted TypeScript configuration for test suite compatibility with Node's module system. --- eslint.config.mjs | 9 +- package-lock.json | 59 ++----- package.json | 3 +- .../barrel/barrel-content.builder.test.ts | 13 +- src/core/barrel/barrel-content.builder.ts | 6 +- src/core/barrel/barrel-file.generator.test.ts | 29 ++-- src/core/barrel/barrel-file.generator.ts | 4 +- src/core/io/file-system.service.test.ts | 160 ++++++++++-------- src/core/parser/export.parser.test.ts | 72 +++++--- src/test-utils/testHarness.ts | 83 +++++++++ src/test/suite/barrel-content.builder.test.ts | 31 ++-- src/test/suite/barrel-file.generator.test.ts | 28 +-- src/test/suite/export.parser.test.ts | 63 ++++--- src/test/testHarness.ts | 84 +++++++++ src/utils/string.test.ts | 32 ++-- tsconfig.test-suite.json | 4 +- 16 files changed, 439 insertions(+), 241 deletions(-) create mode 100644 src/test-utils/testHarness.ts create mode 100644 src/test/testHarness.ts diff --git a/eslint.config.mjs b/eslint.config.mjs index 2415111..3165f9c 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -127,7 +127,7 @@ export default [ }, }, - // Jest test files and mock files configuration + // Node test files and mock files configuration { files: [ '**/__tests__/**/*.{ts,tsx}', @@ -138,14 +138,10 @@ export default [ languageOptions: { globals: { ...globals.node, - ...globals.jest, NodeJS: 'readonly', - jest: 'readonly', }, }, - plugins: { - jest, - }, + plugins: {}, rules: { // Relax some rules for test files 'sonarjs/no-duplicate-string': 'off', @@ -182,7 +178,6 @@ export default [ '@typescript-eslint/require-await': 'off', 'sonarjs/publicly-writable-directories': 'off', 'no-console': 'off', - 'jest/expect-expect': 'off', complexity: 'off', 'sonarjs/cognitive-complexity': 'off', 'simple-import-sort/imports': 'off', diff --git a/package-lock.json b/package-lock.json index c67340b..8202120 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3935,19 +3935,6 @@ "eslint": "^8.0.0 || ^9.0.0" } }, - "node_modules/eslint-plugin-sonarjs/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-plugin-unused-imports": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.2.0.tgz", @@ -4300,16 +4287,6 @@ "node": ">=18" } }, - "node_modules/filing-cabinet/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/filing-cabinet/node_modules/tsconfig-paths": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", @@ -8139,9 +8116,9 @@ } }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { @@ -8646,6 +8623,16 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -9036,16 +9023,6 @@ "node": ">=10.13.0" } }, - "node_modules/tsconfig-paths-webpack-plugin/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", @@ -9074,16 +9051,6 @@ "json5": "lib/cli.js" } }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", diff --git a/package.json b/package.json index 7446f7a..3ac4c16 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,6 @@ "description": "Automatically export types, functions, constants, and classes through barrel files", "devDependencies": { "@types/glob": "^8.1.0", - "@types/mocha": "^10.0.1", "@types/node": "^22.x", "@types/vscode": "^1.80.0", "@typescript-eslint/eslint-plugin": "^8.24.0", @@ -66,11 +65,11 @@ "eslint-plugin-sonarjs": "^3.0.5", "eslint-plugin-unused-imports": "^4.2.0", "eslint-plugin-simple-import-sort": "^12.1.0", + "expect": "^29.7.0", "glob": "^10.3.3", "jscpd": "^4.0.5", "madge": "^8.0.0", "make-coverage-badge": "^1.2.0", - "mocha": "^10.2.0", "prettier": "^3.5.0", "ts-loader": "^9.4.4", "ts-morph": "^27.0.2", diff --git a/src/core/barrel/barrel-content.builder.test.ts b/src/core/barrel/barrel-content.builder.test.ts index 8eb4bc5..4bb07ab 100644 --- a/src/core/barrel/barrel-content.builder.test.ts +++ b/src/core/barrel/barrel-content.builder.test.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/no-floating-promises */ -import { beforeEach, describe, expect, it } from '../../test-utils/testHarness.js'; +import assert from 'node:assert/strict'; +import { beforeEach, describe, it } from 'node:test'; import { BarrelContentBuilder } from './barrel-content.builder.js'; import { BarrelEntry, BarrelEntryKind, BarrelExportKind } from '../../types/index.js'; @@ -32,7 +33,8 @@ describe('BarrelContentBuilder', () => { const source = builder.buildContent(entries, ''); - expect(source).toBe( + assert.strictEqual( + source, [ "export { Alpha } from './alpha';", "export type { Bravo } from './beta';", @@ -75,7 +77,7 @@ describe('BarrelContentBuilder', () => { it(`should build expected output ${index}`, () => { const result = builder.buildContent(entries, ''); - expect(result.trim()).toBe(expected); + assert.strictEqual(result.trim(), expected); }); } @@ -84,7 +86,8 @@ describe('BarrelContentBuilder', () => { const result = builder.buildContent(entries, ''); - expect(result.trim()).toBe( + assert.strictEqual( + result.trim(), "export { Delta } from './delta';\nexport { default } from './delta';", ); }); @@ -106,7 +109,7 @@ describe('BarrelContentBuilder', () => { it(`should ignore parent-directory entries ${index}`, () => { const result = builder.buildContent(entries, ''); - expect(result).toBe('\n'); + assert.strictEqual(result, '\n'); }); } }); diff --git a/src/core/barrel/barrel-content.builder.ts b/src/core/barrel/barrel-content.builder.ts index 86518a5..c25370d 100644 --- a/src/core/barrel/barrel-content.builder.ts +++ b/src/core/barrel/barrel-content.builder.ts @@ -1,11 +1,11 @@ import { - DEFAULT_EXPORT_NAME, - NEWLINE, - PARENT_DIRECTORY_SEGMENT, BarrelEntry, BarrelEntryKind, BarrelExport, BarrelExportKind, + DEFAULT_EXPORT_NAME, + NEWLINE, + PARENT_DIRECTORY_SEGMENT, } from '../../types/index.js'; import { sortAlphabetically } from '../../utils/string.js'; diff --git a/src/core/barrel/barrel-file.generator.test.ts b/src/core/barrel/barrel-file.generator.test.ts index c464757..2090ebd 100644 --- a/src/core/barrel/barrel-file.generator.test.ts +++ b/src/core/barrel/barrel-file.generator.test.ts @@ -1,10 +1,16 @@ +/* eslint-disable @typescript-eslint/no-floating-promises */ + +import assert from 'node:assert/strict'; import * as os from 'node:os'; import * as path from 'node:path'; import type { Uri } from 'vscode'; -import { BarrelGenerationMode, INDEX_FILENAME } from '../../types'; -import { FileSystemService } from '../io/file-system.service'; -import { BarrelFileGenerator } from './barrel-file.generator'; + +import { afterEach, beforeEach, describe, it } from 'node:test'; + +import { BarrelGenerationMode, INDEX_FILENAME } from '../../types/index.js'; +import { FileSystemService } from '../io/file-system.service.js'; +import { BarrelFileGenerator } from './barrel-file.generator.js'; describe('BarrelFileGenerator', () => { let tmpDir: string; @@ -53,11 +59,13 @@ describe('BarrelFileGenerator', () => { const nestedIndex = await fileSystem.readFile(path.join(nestedDir, INDEX_FILENAME)); const deeperIndex = await fileSystem.readFile(path.join(deeperDir, INDEX_FILENAME)); - expect(rootIndex).toBe( + assert.strictEqual( + rootIndex, ["export { alpha } from './alpha';", "export * from './nested';", ''].join('\n'), ); - expect(nestedIndex).toBe( + assert.strictEqual( + nestedIndex, [ "export type { Bravo } from './bravo';", "export { default } from './bravo';", @@ -71,7 +79,7 @@ describe('BarrelFileGenerator', () => { '', ].join('\n'); - expect(deeperIndex).toBe(expectedDeeperIndex); + assert.strictEqual(deeperIndex, expectedDeeperIndex); }); it('should sanitize existing barrels when updating', async () => { @@ -86,7 +94,7 @@ describe('BarrelFileGenerator', () => { const rootIndex = await fileSystem.readFile(path.join(tmpDir, INDEX_FILENAME)); - expect(rootIndex).toBe('\n'); + assert.strictEqual(rootIndex, '\n'); }); it('should skip creating barrels when updating non-existent ones', async () => { @@ -101,15 +109,16 @@ describe('BarrelFileGenerator', () => { const exists = await fileSystem.fileExists(path.join(nestedDir, INDEX_FILENAME)); - expect(exists).toBe(false); + assert.strictEqual(exists, false); }); it('should throw when no TypeScript files are present and recursion is disabled', async () => { const generator = new BarrelFileGenerator(); const emptyDirUri = { fsPath: tmpDir } as unknown as Uri; - await expect(generator.generateBarrelFile(emptyDirUri)).rejects.toThrow( - 'No TypeScript files found in the selected directory', + await assert.rejects( + generator.generateBarrelFile(emptyDirUri), + /No TypeScript files found in the selected directory/, ); }); }); diff --git a/src/core/barrel/barrel-file.generator.ts b/src/core/barrel/barrel-file.generator.ts index 7930eaa..c321a5d 100644 --- a/src/core/barrel/barrel-file.generator.ts +++ b/src/core/barrel/barrel-file.generator.ts @@ -5,13 +5,13 @@ import type { Uri } from 'vscode'; import { BarrelExport } from '@/types/barrel/BarrelExport.js'; import { - DEFAULT_EXPORT_NAME, - INDEX_FILENAME, type BarrelEntry, BarrelEntryKind, BarrelExportKind, BarrelGenerationMode, type BarrelGenerationOptions, + DEFAULT_EXPORT_NAME, + INDEX_FILENAME, type NormalizedBarrelGenerationOptions, type ParsedExport, } from '../../types/index.js'; diff --git a/src/core/io/file-system.service.test.ts b/src/core/io/file-system.service.test.ts index 8305b5b..a79811c 100644 --- a/src/core/io/file-system.service.test.ts +++ b/src/core/io/file-system.service.test.ts @@ -1,13 +1,16 @@ +/* eslint-disable @typescript-eslint/no-floating-promises */ + +import assert from 'node:assert/strict'; import { Dirent } from 'node:fs'; import * as fs from 'node:fs/promises'; import * as path from 'node:path'; -import { FileSystemService } from './file-system.service.js'; +import { afterEach, beforeEach, describe, it, jest } from '../../test/testHarness.js'; import { INDEX_FILENAME } from '../../types/index.js'; +import { FileSystemService } from './file-system.service.js'; describe('FileSystemService', () => { let service: FileSystemService; - const mockFs = fs as jest.Mocked; const createFileEntry = (name: string): Dirent => ({ @@ -23,14 +26,14 @@ describe('FileSystemService', () => { isDirectory: () => true, }) as unknown as Dirent; - afterEach(() => { - jest.clearAllMocks(); - }); - beforeEach(() => { service = new FileSystemService(); }); + afterEach(() => { + jest.restoreAllMocks(); + }); + describe('getTypeScriptFiles', () => { const directoryPath = '/path/to/dir'; @@ -42,15 +45,15 @@ describe('FileSystemService', () => { createFileEntry('component.tsx'), createDirectoryEntry('nested'), ]; - mockFs.readdir.mockResolvedValue(mockEntries as never); + const readdirMock = jest.spyOn(fs, 'readdir').mockResolvedValue(mockEntries as never); const result = await service.getTypeScriptFiles(directoryPath); - expect(result).toEqual([ + assert.deepStrictEqual(result, [ path.join(directoryPath, 'file.ts'), path.join(directoryPath, 'component.tsx'), ]); - expect(mockFs.readdir).toHaveBeenCalledWith(directoryPath, { withFileTypes: true }); + assert.deepStrictEqual(readdirMock.mock.calls, [[directoryPath, { withFileTypes: true }]]); }); const typeScriptEntryCases: Array<{ entry: Dirent; shouldInclude: boolean }> = [ @@ -62,24 +65,26 @@ describe('FileSystemService', () => { { entry: createDirectoryEntry('nested'), shouldInclude: false }, ]; - // Data-table cases omit natural language labels per team convention; add individual tests when additional context is needed. - it.each(typeScriptEntryCases)( - 'should handle TypeScript entry filtering %#', - async ({ entry, shouldInclude }) => { - mockFs.readdir.mockResolvedValue([entry] as never); + for (const [index, { entry, shouldInclude }] of typeScriptEntryCases.entries()) { + it(`should handle TypeScript entry filtering ${index}`, async () => { + const readdirMock = jest.spyOn(fs, 'readdir').mockResolvedValue([entry] as never); const result = await service.getTypeScriptFiles(directoryPath); const expectedPath = path.join(directoryPath, entry.name); - expect(result).toEqual(shouldInclude ? [expectedPath] : []); - }, - ); + const expected = shouldInclude ? [expectedPath] : []; + + assert.deepStrictEqual(result, expected); + assert.deepStrictEqual(readdirMock.mock.calls, [[directoryPath, { withFileTypes: true }]]); + }); + } it('should throw error if directory read fails', async () => { - mockFs.readdir.mockRejectedValue(new Error('Read error')); + jest.spyOn(fs, 'readdir').mockRejectedValue(new Error('Read error')); - await expect(service.getTypeScriptFiles('/invalid/path')).rejects.toThrow( - 'Failed to read directory: Read error', + await assert.rejects( + service.getTypeScriptFiles('/invalid/path'), + /Failed to read directory: Read error/, ); }); }); @@ -94,12 +99,12 @@ describe('FileSystemService', () => { createDirectoryEntry('.hidden'), createFileEntry('file.ts'), ]; - mockFs.readdir.mockResolvedValue(mockEntries as never); + const readdirMock = jest.spyOn(fs, 'readdir').mockResolvedValue(mockEntries as never); const result = await service.getSubdirectories(directoryPath); - expect(result).toEqual([path.join(directoryPath, 'subdir')]); - expect(mockFs.readdir).toHaveBeenCalledWith(directoryPath, { withFileTypes: true }); + assert.deepStrictEqual(result, [path.join(directoryPath, 'subdir')]); + assert.deepStrictEqual(readdirMock.mock.calls, [[directoryPath, { withFileTypes: true }]]); }); const subdirectoryCases: Array<{ entry: Dirent; shouldInclude: boolean }> = [ @@ -109,115 +114,125 @@ describe('FileSystemService', () => { { entry: createFileEntry('readme.md'), shouldInclude: false }, ]; - it.each(subdirectoryCases)( - 'should handle subdirectory filtering %#', - async ({ entry, shouldInclude }) => { - mockFs.readdir.mockResolvedValue([entry] as never); + for (const [index, { entry, shouldInclude }] of subdirectoryCases.entries()) { + it(`should handle subdirectory filtering ${index}`, async () => { + const readdirMock = jest.spyOn(fs, 'readdir').mockResolvedValue([entry] as never); const result = await service.getSubdirectories(directoryPath); const expectedPath = path.join(directoryPath, entry.name); - expect(result).toEqual(shouldInclude ? [expectedPath] : []); - }, - ); + const expected = shouldInclude ? [expectedPath] : []; + + assert.deepStrictEqual(result, expected); + assert.deepStrictEqual(readdirMock.mock.calls, [[directoryPath, { withFileTypes: true }]]); + }); + } it('should throw error if directory read fails', async () => { - mockFs.readdir.mockRejectedValue(new Error('Read error')); + jest.spyOn(fs, 'readdir').mockRejectedValue(new Error('Read error')); - await expect(service.getSubdirectories('/invalid/path')).rejects.toThrow( - 'Failed to read directory: Read error', + await assert.rejects( + service.getSubdirectories('/invalid/path'), + /Failed to read directory: Read error/, ); }); }); describe('readFile', () => { it('should read file content successfully', async () => { - mockFs.readFile.mockResolvedValue('file content'); + const readFileMock = jest.spyOn(fs, 'readFile').mockResolvedValue('file content' as never); const result = await service.readFile('/path/to/file.ts'); - expect(result).toBe('file content'); - expect(mockFs.readFile).toHaveBeenCalledWith('/path/to/file.ts', 'utf-8'); + assert.strictEqual(result, 'file content'); + assert.deepStrictEqual(readFileMock.mock.calls, [['/path/to/file.ts', 'utf-8']]); }); it('should throw error if file read fails', async () => { - mockFs.readFile.mockRejectedValue(new Error('Read error')); + jest.spyOn(fs, 'readFile').mockRejectedValue(new Error('Read error')); - await expect(service.readFile('/invalid/path')).rejects.toThrow( - 'Failed to read file /invalid/path: Read error', + await assert.rejects( + service.readFile('/invalid/path'), + /Failed to read file \/invalid\/path: Read error/, ); }); }); describe('writeFile', () => { it('should write file content successfully', async () => { - mockFs.writeFile.mockResolvedValue(undefined); + const writeFileMock = jest.spyOn(fs, 'writeFile').mockResolvedValue(undefined as never); await service.writeFile('/path/to/file.ts', 'content'); - expect(mockFs.writeFile).toHaveBeenCalledWith('/path/to/file.ts', 'content', 'utf-8'); + assert.deepStrictEqual(writeFileMock.mock.calls, [['/path/to/file.ts', 'content', 'utf-8']]); }); it('should throw error if file write fails', async () => { - mockFs.writeFile.mockRejectedValue(new Error('Write error')); + jest.spyOn(fs, 'writeFile').mockRejectedValue(new Error('Write error')); - await expect(service.writeFile('/invalid/path', 'content')).rejects.toThrow( - 'Failed to write file /invalid/path: Write error', + await assert.rejects( + service.writeFile('/invalid/path', 'content'), + /Failed to write file \/invalid\/path: Write error/, ); }); }); describe('ensureDirectory', () => { it('should create directory recursively', async () => { - mockFs.mkdir.mockResolvedValue(undefined as never); + const mkdirMock = jest.spyOn(fs, 'mkdir').mockResolvedValue(undefined as never); await service.ensureDirectory('/path/to/dir'); - expect(mockFs.mkdir).toHaveBeenCalledWith('/path/to/dir', { recursive: true }); + assert.deepStrictEqual(mkdirMock.mock.calls, [['/path/to/dir', { recursive: true }]]); }); it('should throw error when directory creation fails', async () => { - mockFs.mkdir.mockRejectedValue(new Error('mkdir error')); + jest.spyOn(fs, 'mkdir').mockRejectedValue(new Error('mkdir error')); - await expect(service.ensureDirectory('/path/to/dir')).rejects.toThrow( - 'Failed to create directory /path/to/dir: mkdir error', + await assert.rejects( + service.ensureDirectory('/path/to/dir'), + /Failed to create directory \/path\/to\/dir: mkdir error/, ); }); }); describe('removePath', () => { it('should remove path recursively', async () => { - mockFs.rm.mockResolvedValue(undefined as never); + const rmMock = jest.spyOn(fs, 'rm').mockResolvedValue(undefined as never); await service.removePath('/path/to/remove'); - expect(mockFs.rm).toHaveBeenCalledWith('/path/to/remove', { recursive: true, force: true }); + assert.deepStrictEqual(rmMock.mock.calls, [ + ['/path/to/remove', { recursive: true, force: true }], + ]); }); it('should throw error when removal fails', async () => { - mockFs.rm.mockRejectedValue(new Error('rm error')); + jest.spyOn(fs, 'rm').mockRejectedValue(new Error('rm error')); - await expect(service.removePath('/path/to/remove')).rejects.toThrow( - 'Failed to remove path /path/to/remove: rm error', + await assert.rejects( + service.removePath('/path/to/remove'), + /Failed to remove path \/path\/to\/remove: rm error/, ); }); }); describe('createTempDirectory', () => { it('should create temp directory with prefix', async () => { - mockFs.mkdtemp.mockResolvedValue('/tmp/foo123'); + const mkdtempMock = jest.spyOn(fs, 'mkdtemp').mockResolvedValue('/tmp/foo123' as never); const result = await service.createTempDirectory('/tmp/foo-'); - expect(result).toBe('/tmp/foo123'); - expect(mockFs.mkdtemp).toHaveBeenCalledWith('/tmp/foo-'); + assert.strictEqual(result, '/tmp/foo123'); + assert.deepStrictEqual(mkdtempMock.mock.calls, [['/tmp/foo-']]); }); it('should throw error when temp directory creation fails', async () => { - mockFs.mkdtemp.mockRejectedValue(new Error('mkdtemp error')); + jest.spyOn(fs, 'mkdtemp').mockRejectedValue(new Error('mkdtemp error')); - await expect(service.createTempDirectory('/tmp/foo-')).rejects.toThrow( - 'Failed to create temporary directory with prefix /tmp/foo-: mkdtemp error', + await assert.rejects( + service.createTempDirectory('/tmp/foo-'), + /Failed to create temporary directory with prefix \/tmp\/foo-: mkdtemp error/, ); }); }); @@ -225,19 +240,22 @@ describe('FileSystemService', () => { describe('fileExists', () => { const fileExistsCases = [true, false] as const; - it.each(fileExistsCases)('should evaluate file existence %#', async (expected) => { - const filePath = expected ? '/path/to/file.ts' : '/invalid/path'; + for (const [index, expected] of fileExistsCases.entries()) { + it(`should evaluate file existence ${index}`, async () => { + const filePath = expected ? '/path/to/file.ts' : '/invalid/path'; + const accessMock = jest.spyOn(fs, 'access'); - if (expected) { - mockFs.access.mockResolvedValue(undefined); - } else { - mockFs.access.mockRejectedValue(new Error('Access error')); - } + if (expected) { + accessMock.mockResolvedValue(undefined as never); + } else { + accessMock.mockRejectedValue(new Error('Access error')); + } - const result = await service.fileExists(filePath); + const result = await service.fileExists(filePath); - expect(result).toBe(expected); - expect(mockFs.access).toHaveBeenCalledWith(filePath); - }); + assert.strictEqual(result, expected); + assert.deepStrictEqual(accessMock.mock.calls, [[filePath]]); + }); + } }); }); diff --git a/src/core/parser/export.parser.test.ts b/src/core/parser/export.parser.test.ts index 6e6d5a7..6e444dd 100644 --- a/src/core/parser/export.parser.test.ts +++ b/src/core/parser/export.parser.test.ts @@ -1,4 +1,9 @@ -import { ExportParser } from './export.parser'; +/* eslint-disable @typescript-eslint/no-floating-promises */ + +import assert from 'node:assert/strict'; +import { beforeEach, describe, it } from 'node:test'; + +import { ExportParser } from './export.parser.js'; describe('ExportParser', () => { let parser: ExportParser; @@ -10,32 +15,41 @@ describe('ExportParser', () => { describe('extractExports', () => { it('should capture named, default, and aliased exports', () => { const source = ` - export const alpha = 1; - export function bravo() {} - export { charlie as delta, echo }; - export default class Foxtrot {} - export interface Golf {} - export { type Hotel } - `; + export const alpha = 1; + export function bravo() {} + export { charlie as delta, echo }; + export default class Foxtrot {} + export interface Golf {} + export { type Hotel } + `; const result = parser.extractExports(source); - expect(result).toEqual( - expect.arrayContaining([ - { name: 'alpha', typeOnly: false }, - { name: 'bravo', typeOnly: false }, - { name: 'delta', typeOnly: false }, - { name: 'echo', typeOnly: false }, - { name: 'default', typeOnly: false }, - { name: 'Golf', typeOnly: true }, - { name: 'Hotel', typeOnly: true }, - ]), - ); - expect(result).toHaveLength(7); + const expectedEntries = [ + { name: 'alpha', typeOnly: false }, + { name: 'bravo', typeOnly: false }, + { name: 'delta', typeOnly: false }, + { name: 'echo', typeOnly: false }, + { name: 'default', typeOnly: false }, + { name: 'Golf', typeOnly: true }, + { name: 'Hotel', typeOnly: true }, + ]; + + for (const expected of expectedEntries) { + assert.ok( + result.some( + (entry) => entry.name === expected.name && entry.typeOnly === expected.typeOnly, + ), + ); + } + + assert.strictEqual(result.length, expectedEntries.length); }); - it('should return an empty array when no exports exist', () => - expect(parser.extractExports('const unused = 1;')).toEqual([])); + it('should return an empty array when no exports exist', () => { + const result = parser.extractExports('const unused = 1;'); + assert.deepStrictEqual(result, []); + }); const extractCases: Array<{ source: string; expected: { name: string; typeOnly: boolean } }> = [ { @@ -52,9 +66,15 @@ describe('ExportParser', () => { }, ]; - // Table-driven tests follow the convention of omitting human-readable titles; prefer standalone tests when unique naming is needed. - it.each(extractCases)('should capture simple export pattern %#', ({ source, expected }) => - expect(parser.extractExports(source)).toContainEqual(expected), - ); + for (const [index, { source, expected }] of extractCases.entries()) { + it(`should capture simple export pattern ${index}`, () => { + const exports = parser.extractExports(source); + assert.ok( + exports.some( + (entry) => entry.name === expected.name && entry.typeOnly === expected.typeOnly, + ), + ); + }); + } }); }); diff --git a/src/test-utils/testHarness.ts b/src/test-utils/testHarness.ts new file mode 100644 index 0000000..45dde1e --- /dev/null +++ b/src/test-utils/testHarness.ts @@ -0,0 +1,83 @@ +export { afterEach, beforeEach, describe, it } from 'node:test'; + +const activeSpies = new Set(); + +type AnyFunction = (...args: any[]) => any; + +type SpyInstance = { + restore: () => void; +}; + +type Spy = { + mock: { + calls: TArgs[]; + }; + mockImplementation: (impl: (...args: TArgs) => TReturn) => Spy; + mockResolvedValue: (value: Awaited) => Spy; + mockRejectedValue: (error: unknown) => Spy; +}; + +function createSpy( + target: TTarget, + key: TKey, +): Spy< + Parameters>, + ReturnType> +> { + const original = target[key]; + + if (typeof original !== 'function') { + throw new TypeError(`Cannot spy on property ${String(key)} because it is not a function.`); + } + + type Args = Parameters>; + type Return = ReturnType>; + + const calls: Args[] = []; + let implementation = original as AnyFunction; + + const spyWrapper = ((...args: Args) => { + calls.push(args); + return implementation.apply(target, args); + }) as TTarget[TKey]; + + (target as Record)[key as string | symbol] = spyWrapper; + + const spyApi: Spy & SpyInstance = { + mock: { + calls, + }, + mockImplementation(newImpl: AnyFunction) { + implementation = newImpl; + return spyApi; + }, + mockResolvedValue(value: unknown) { + implementation = () => Promise.resolve(value) as Return; + return spyApi; + }, + mockRejectedValue(error: unknown) { + const rejection = error instanceof Error ? error : new Error(String(error)); + implementation = () => Promise.reject(rejection) as Return; + return spyApi; + }, + restore() { + (target as Record)[key as string | symbol] = original; + activeSpies.delete(spyApi); + }, + }; + + activeSpies.add(spyApi); + + return spyApi; +} + +const jestLike = { + spyOn: createSpy, + restoreAllMocks(): void { + for (const spy of activeSpies) { + spy.restore(); + } + activeSpies.clear(); + }, +}; +export const jest = jestLike; diff --git a/src/test/suite/barrel-content.builder.test.ts b/src/test/suite/barrel-content.builder.test.ts index bec6f92..472f5b6 100644 --- a/src/test/suite/barrel-content.builder.test.ts +++ b/src/test/suite/barrel-content.builder.test.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/no-floating-promises */ -import { beforeEach, describe, expect, it } from '../../test-utils/testHarness.js'; +import assert from 'node:assert/strict'; +import { beforeEach, describe, it } from 'node:test'; import { BarrelContentBuilder } from '../../core/barrel/barrel-content.builder.js'; import { BarrelEntryKind, BarrelExportKind, type BarrelEntry } from '../../types/index.js'; @@ -16,14 +17,14 @@ describe('BarrelContentBuilder Test Suite', () => { const exportsByFile = new Map([['myFile.ts', ['MyClass']]]); const content = builder.buildContent(exportsByFile, '/some/path'); - expect(content).toBe("export { MyClass } from './myFile';\n"); + assert.strictEqual(content, "export { MyClass } from './myFile';\n"); }); it('should build content for single file with multiple exports', () => { const exportsByFile = new Map([['myFile.ts', ['MyClass', 'MyInterface', 'myConst']]]); const content = builder.buildContent(exportsByFile, '/some/path'); - expect(content).toBe("export { MyClass, MyInterface, myConst } from './myFile';\n"); + assert.strictEqual(content, "export { MyClass, MyInterface, myConst } from './myFile';\n"); }); it('should build content for multiple files', () => { @@ -34,16 +35,16 @@ describe('BarrelContentBuilder Test Suite', () => { const content = builder.buildContent(exportsByFile, '/some/path'); const lines = content.split('\n').filter(Boolean); - expect(lines).toHaveLength(2); - expect(content).toContain("export { ClassA } from './fileA';"); - expect(content).toContain("export { ClassB } from './fileB';"); + assert.strictEqual(lines.length, 2); + assert.ok(content.includes("export { ClassA } from './fileA';")); + assert.ok(content.includes("export { ClassB } from './fileB';")); }); it('should handle default exports', () => { const exportsByFile = new Map([['myFile.ts', ['default']]]); const content = builder.buildContent(exportsByFile, '/some/path'); - expect(content).toBe("export { default } from './myFile';\n"); + assert.strictEqual(content, "export { default } from './myFile';\n"); }); it('should handle default, type, and named exports together', () => { @@ -59,9 +60,9 @@ describe('BarrelContentBuilder Test Suite', () => { const content = builder.buildContent(entries, '/some/path'); - expect(content).toContain("export { MyClass } from './myFile';"); - expect(content).toContain("export type { MyInterface } from './myFile';"); - expect(content).toContain("export { default } from './myFile';"); + assert.ok(content.includes("export { MyClass } from './myFile';")); + assert.ok(content.includes("export type { MyInterface } from './myFile';")); + assert.ok(content.includes("export { default } from './myFile';")); }); it('should sort files alphabetically', () => { @@ -73,9 +74,9 @@ describe('BarrelContentBuilder Test Suite', () => { const content = builder.buildContent(exportsByFile, '/some/path'); const lines = content.split('\n').filter(Boolean); - expect(lines[0]).toContain('alpha'); - expect(lines[1]).toContain('beta'); - expect(lines[2]).toContain('zebra'); + assert.ok(lines[0]?.includes('alpha')); + assert.ok(lines[1]?.includes('beta')); + assert.ok(lines[2]?.includes('zebra')); }); it('should filter out parent folder references', () => { @@ -85,7 +86,7 @@ describe('BarrelContentBuilder Test Suite', () => { ]); const content = builder.buildContent(exportsByFile, '/some/path'); - expect(content).not.toContain('ParentClass'); - expect(content).toContain('LocalClass'); + assert.ok(!content.includes('ParentClass')); + assert.ok(content.includes('LocalClass')); }); }); diff --git a/src/test/suite/barrel-file.generator.test.ts b/src/test/suite/barrel-file.generator.test.ts index ee3a3e2..5fa1b1b 100644 --- a/src/test/suite/barrel-file.generator.test.ts +++ b/src/test/suite/barrel-file.generator.test.ts @@ -1,12 +1,13 @@ /* eslint-disable @typescript-eslint/no-floating-promises */ +import assert from 'node:assert/strict'; import * as fs from 'node:fs/promises'; import * as os from 'node:os'; import * as path from 'node:path'; import * as vscode from 'vscode'; -import { afterEach, beforeEach, describe, expect, it } from '../../test-utils/testHarness.js'; +import { afterEach, beforeEach, describe, it } from 'node:test'; import { BarrelFileGenerator } from '../../core/barrel/barrel-file.generator.js'; @@ -43,12 +44,12 @@ describe('BarrelFileGenerator Test Suite', () => { const barrelPath = path.join(testDir, 'index.ts'); const content = await fs.readFile(barrelPath, 'utf-8'); - expect(content).toContain('export { MyClass } from'); - expect(content).toContain('myConst'); - expect(content).toContain('export type { MyInterface }'); - expect(content).toContain('myFunction'); - expect(content).toContain("from './file1'"); - expect(content).toContain("from './file2'"); + assert.ok(content.includes('export { MyClass } from')); + assert.ok(content.includes('myConst')); + assert.ok(content.includes('export type { MyInterface }')); + assert.ok(content.includes('myFunction')); + assert.ok(content.includes("from './file1'")); + assert.ok(content.includes("from './file2'")); }); it('should update existing barrel file', async () => { @@ -63,16 +64,17 @@ describe('BarrelFileGenerator Test Suite', () => { const barrelPath = path.join(testDir, 'index.ts'); const content = await fs.readFile(barrelPath, 'utf-8'); - expect(content).toContain('NewClass'); - expect(content).not.toContain('// Old content'); + assert.ok(content.includes('NewClass')); + assert.ok(!content.includes('// Old content')); }); it('should throw error when no TypeScript files found', async () => { const generator = new BarrelFileGenerator(); const uri = vscode.Uri.file(testDir); - await expect(generator.generateBarrelFile(uri)).rejects.toThrow( - 'No TypeScript files found in the selected directory', + await assert.rejects( + generator.generateBarrelFile(uri), + /No TypeScript files found in the selected directory/, ); }); @@ -88,7 +90,7 @@ describe('BarrelFileGenerator Test Suite', () => { const barrelPath = path.join(testDir, 'index.ts'); const content = await fs.readFile(barrelPath, 'utf-8'); - expect(content).toContain('export { MyClass } from'); - expect(content).not.toContain('IndexClass'); + assert.ok(content.includes('export { MyClass } from')); + assert.ok(!content.includes('IndexClass')); }); }); diff --git a/src/test/suite/export.parser.test.ts b/src/test/suite/export.parser.test.ts index af3da74..bf88e14 100644 --- a/src/test/suite/export.parser.test.ts +++ b/src/test/suite/export.parser.test.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/no-floating-promises */ -import { beforeEach, describe, expect, it } from '../../test-utils/testHarness.js'; +import assert from 'node:assert/strict'; +import { beforeEach, describe, it } from 'node:test'; import { ExportParser } from '../../core/parser/export.parser.js'; @@ -15,49 +16,49 @@ describe('ExportParser Test Suite', () => { const content = 'export class MyClass {}'; const exports = parser.extractExports(content); - expect(exports).toEqual([{ name: 'MyClass', typeOnly: false }]); + assert.deepStrictEqual(exports, [{ name: 'MyClass', typeOnly: false }]); }); it('should extract interface exports', () => { const content = 'export interface MyInterface {}'; const exports = parser.extractExports(content); - expect(exports).toEqual([{ name: 'MyInterface', typeOnly: true }]); + assert.deepStrictEqual(exports, [{ name: 'MyInterface', typeOnly: true }]); }); it('should extract type exports', () => { const content = 'export type MyType = string;'; const exports = parser.extractExports(content); - expect(exports).toEqual([{ name: 'MyType', typeOnly: true }]); + assert.deepStrictEqual(exports, [{ name: 'MyType', typeOnly: true }]); }); it('should extract function exports', () => { const content = 'export function myFunction() {}'; const exports = parser.extractExports(content); - expect(exports).toEqual([{ name: 'myFunction', typeOnly: false }]); + assert.deepStrictEqual(exports, [{ name: 'myFunction', typeOnly: false }]); }); it('should extract const exports', () => { const content = 'export const myConst = 42;'; const exports = parser.extractExports(content); - expect(exports).toEqual([{ name: 'myConst', typeOnly: false }]); + assert.deepStrictEqual(exports, [{ name: 'myConst', typeOnly: false }]); }); it('should extract enum exports', () => { const content = 'export enum MyEnum { A, B }'; const exports = parser.extractExports(content); - expect(exports).toEqual([{ name: 'MyEnum', typeOnly: false }]); + assert.deepStrictEqual(exports, [{ name: 'MyEnum', typeOnly: false }]); }); it('should extract default exports', () => { const content = 'export default class MyClass {}'; const exports = parser.extractExports(content); - expect(exports).toEqual(expect.arrayContaining([{ name: 'default', typeOnly: false }])); + assert.ok(exports.some((entry) => entry.name === 'default' && entry.typeOnly === false)); }); it('should extract multiple exports', () => { @@ -68,33 +69,43 @@ describe('ExportParser Test Suite', () => { `; const exports = parser.extractExports(content); - expect(exports).toHaveLength(3); - expect(exports).toEqual( - expect.arrayContaining([ - { name: 'MyClass', typeOnly: false }, - { name: 'MyInterface', typeOnly: true }, - { name: 'myConst', typeOnly: false }, - ]), - ); + assert.strictEqual(exports.length, 3); + const requiredEntries = [ + { name: 'MyClass', typeOnly: false }, + { name: 'MyInterface', typeOnly: true }, + { name: 'myConst', typeOnly: false }, + ]; + for (const expectedEntry of requiredEntries) { + assert.ok( + exports.some( + (entry) => entry.name === expectedEntry.name && entry.typeOnly === expectedEntry.typeOnly, + ), + ); + } }); it('should extract export lists', () => { const content = 'export { MyClass, MyInterface };'; const exports = parser.extractExports(content); - expect(exports).toEqual( - expect.arrayContaining([ - { name: 'MyClass', typeOnly: false }, - { name: 'MyInterface', typeOnly: false }, - ]), - ); + const listEntries = [ + { name: 'MyClass', typeOnly: false }, + { name: 'MyInterface', typeOnly: false }, + ]; + for (const expectedEntry of listEntries) { + assert.ok( + exports.some( + (entry) => entry.name === expectedEntry.name && entry.typeOnly === expectedEntry.typeOnly, + ), + ); + } }); it('should handle export with as keyword', () => { const content = 'export { MyClass as RenamedClass };'; const exports = parser.extractExports(content); - expect(exports).toEqual(expect.arrayContaining([{ name: 'RenamedClass', typeOnly: false }])); + assert.ok(exports.some((entry) => entry.name === 'RenamedClass' && entry.typeOnly === false)); }); it('should ignore comments', () => { @@ -105,7 +116,7 @@ describe('ExportParser Test Suite', () => { `; const exports = parser.extractExports(content); - expect(exports).toEqual([{ name: 'RealClass', typeOnly: false }]); + assert.deepStrictEqual(exports, [{ name: 'RealClass', typeOnly: false }]); }); it('should remove duplicates', () => { @@ -115,7 +126,7 @@ describe('ExportParser Test Suite', () => { `; const exports = parser.extractExports(content); - expect(exports).toHaveLength(1); - expect(exports).toEqual([{ name: 'myConst', typeOnly: false }]); + assert.strictEqual(exports.length, 1); + assert.deepStrictEqual(exports, [{ name: 'myConst', typeOnly: false }]); }); }); diff --git a/src/test/testHarness.ts b/src/test/testHarness.ts new file mode 100644 index 0000000..3bab5f7 --- /dev/null +++ b/src/test/testHarness.ts @@ -0,0 +1,84 @@ +export { afterEach, beforeEach, describe, it } from 'node:test'; + +const activeSpies = new Set(); + +type AnyFunction = (...args: any[]) => any; + +type SpyInstance = { + restore: () => void; +}; + +type Spy = { + mock: { + calls: TArgs[]; + }; + mockImplementation: (impl: (...args: TArgs) => TReturn) => Spy; + mockResolvedValue: (value: Awaited) => Spy; + mockRejectedValue: (error: unknown) => Spy; +}; + +function createSpy( + target: TTarget, + key: TKey, +): Spy< + Parameters>, + ReturnType> +> { + const original = target[key]; + + if (typeof original !== 'function') { + throw new TypeError(`Cannot spy on property ${String(key)} because it is not a function.`); + } + + type Args = Parameters>; + type Return = ReturnType>; + + const calls: Args[] = []; + let implementation = original as AnyFunction; + + const spyWrapper = ((...args: Args) => { + calls.push(args); + return implementation.apply(target, args); + }) as TTarget[TKey]; + + (target as Record)[key as string | symbol] = spyWrapper; + + const spyApi: Spy & SpyInstance = { + mock: { + calls, + }, + mockImplementation(newImpl: AnyFunction) { + implementation = newImpl; + return spyApi; + }, + mockResolvedValue(value: unknown) { + implementation = () => Promise.resolve(value) as Return; + return spyApi; + }, + mockRejectedValue(error: unknown) { + const rejection = error instanceof Error ? error : new Error(String(error)); + implementation = () => Promise.reject(rejection) as Return; + return spyApi; + }, + restore() { + (target as Record)[key as string | symbol] = original; + activeSpies.delete(spyApi); + }, + }; + + activeSpies.add(spyApi); + + return spyApi; +} + +const jestLike = { + spyOn: createSpy, + restoreAllMocks(): void { + for (const spy of activeSpies) { + spy.restore(); + } + activeSpies.clear(); + }, +}; + +export const jest = jestLike; diff --git a/src/utils/string.test.ts b/src/utils/string.test.ts index 5a8475c..7e9f608 100644 --- a/src/utils/string.test.ts +++ b/src/utils/string.test.ts @@ -1,58 +1,62 @@ /* eslint-disable @typescript-eslint/no-floating-promises */ -import { describe, expect, it } from '../test-utils/testHarness.js'; +import assert from 'node:assert/strict'; +import { describe, it } from 'node:test'; import { splitAndClean, sortAlphabetically } from './string.js'; describe('splitAndClean', () => { it('should split by default comma delimiter, trim, and remove empty fragments', () => { - expect(splitAndClean('a, b , c')).toEqual(['a', 'b', 'c']); - expect(splitAndClean('a,,b, ,c')).toEqual(['a', 'b', 'c']); + assert.deepStrictEqual(splitAndClean('a, b , c'), ['a', 'b', 'c']); + assert.deepStrictEqual(splitAndClean('a,,b, ,c'), ['a', 'b', 'c']); }); it('should split by custom string delimiter', () => { - expect(splitAndClean('a;b;c', ';')).toEqual(['a', 'b', 'c']); + assert.deepStrictEqual(splitAndClean('a;b;c', ';'), ['a', 'b', 'c']); }); it('should split by RegExp delimiter', () => { - expect(splitAndClean('a1b2c', /\d/)).toEqual(['a', 'b', 'c']); + assert.deepStrictEqual(splitAndClean('a1b2c', /\d/), ['a', 'b', 'c']); }); it('should handle empty string', () => { - expect(splitAndClean('')).toEqual([]); + assert.deepStrictEqual(splitAndClean(''), []); }); it('should handle string with only delimiters and spaces', () => { - expect(splitAndClean(', , ,')).toEqual([]); + assert.deepStrictEqual(splitAndClean(', , ,'), []); }); it('should handle no splits needed', () => { - expect(splitAndClean('abc')).toEqual(['abc']); + assert.deepStrictEqual(splitAndClean('abc'), ['abc']); }); }); describe('sortAlphabetically', () => { it('should sort strings alphabetically', () => { - expect(sortAlphabetically(['c', 'a', 'b'])).toEqual(['a', 'b', 'c']); + assert.deepStrictEqual(sortAlphabetically(['c', 'a', 'b']), ['a', 'b', 'c']); }); it('should handle empty array', () => { - expect(sortAlphabetically([])).toEqual([]); + assert.deepStrictEqual(sortAlphabetically([]), []); }); it('should handle single item', () => { - expect(sortAlphabetically(['a'])).toEqual(['a']); + assert.deepStrictEqual(sortAlphabetically(['a']), ['a']); }); it('should sort with locale', () => { - expect(sortAlphabetically(['ä', 'a'], 'de')).toEqual(['a', 'ä']); + assert.deepStrictEqual(sortAlphabetically(['ä', 'a'], 'de'), ['a', 'ä']); }); it('should sort with options', () => { - expect(sortAlphabetically(['A', 'a'], undefined, { sensitivity: 'base' })).toEqual(['A', 'a']); + assert.deepStrictEqual(sortAlphabetically(['A', 'a'], undefined, { sensitivity: 'base' }), [ + 'A', + 'a', + ]); }); it('should handle iterable input', () => { - expect(sortAlphabetically(new Set(['c', 'a', 'b']))).toEqual(['a', 'b', 'c']); + assert.deepStrictEqual(sortAlphabetically(new Set(['c', 'a', 'b'])), ['a', 'b', 'c']); }); }); diff --git a/tsconfig.test-suite.json b/tsconfig.test-suite.json index 4defffb..eb712e6 100644 --- a/tsconfig.test-suite.json +++ b/tsconfig.test-suite.json @@ -3,11 +3,13 @@ "extends": "./tsconfig.json", "compilerOptions": { "allowJs": true, + "module": "NodeNext", + "moduleResolution": "NodeNext", "noEmit": false, "outDir": "./out", "removeComments": false, "sourceMap": false, - "types": ["node", "mocha"] + "types": ["node"] }, "include": ["src/**/*.ts"], "exclude": ["src/__tests__/**/*", "node_modules", "out", ".vscode-test"] From 2f6f97f065871b42f5feebee830f03254a20f08d Mon Sep 17 00:00:00 2001 From: coderrob Date: Fri, 24 Oct 2025 21:53:40 -0500 Subject: [PATCH 15/20] feat: update test configurations and enhance test harness with mock export --- eslint.config.mjs | 1 + package.json | 3 ++- src/test/runTest.ts | 11 ++--------- src/test/suite/index.ts | 18 +++++++++++------- src/test/testHarness.ts | 2 +- 5 files changed, 17 insertions(+), 18 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 3165f9c..7a0e5ed 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -190,6 +190,7 @@ export default [ files: ['**/src/test/runTest.ts'], rules: { '@typescript-eslint/no-floating-promises': 'off', + 'unicorn/prefer-top-level-await': 'off', }, }, ]; diff --git a/package.json b/package.json index 3ac4c16..711cc96 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,8 @@ "package": "webpack --mode production --devtool hidden-source-map", "pretest": "npm run compile-tests && npm run compile && npm run lint", "quality": "npm run lint && npm run duplication && npm run madge", - "test": "node ./out/test/runTest.js", + "test": "node --test \"out/core/barrel/**/*.test.js\" \"out/core/parser/**/*.test.js\" \"out/utils/**/*.test.js\"", + "test:vscode": "node ./out/test/runTest.js", "typecheck": "tsc --noEmit", "vscode:prepublish": "npm run package", "watch": "webpack --watch", diff --git a/src/test/runTest.ts b/src/test/runTest.ts index 2a7f62a..197bb65 100644 --- a/src/test/runTest.ts +++ b/src/test/runTest.ts @@ -1,6 +1,5 @@ import * as os from 'node:os'; import * as path from 'node:path'; -import { fileURLToPath } from 'node:url'; import { runTests } from '@vscode/test-electron'; @@ -15,17 +14,11 @@ async function main(): Promise { // The folder containing the Extension Manifest package.json // Passed to `--extensionDevelopmentPath` - const extensionDevelopmentPath = path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - '../../', - ); + const extensionDevelopmentPath = path.resolve(__dirname, '../../'); // The path to test runner // Passed to --extensionTestsPath - const extensionTestsPath = path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - './suite/index.js', - ); + const extensionTestsPath = path.resolve(__dirname, './suite/index.js'); // Download VS Code, unzip it and run the integration test const options: Parameters[0] = { diff --git a/src/test/suite/index.ts b/src/test/suite/index.ts index 973c0da..1e5dbff 100644 --- a/src/test/suite/index.ts +++ b/src/test/suite/index.ts @@ -1,17 +1,13 @@ import { once } from 'node:events'; import * as path from 'node:path'; -import { fileURLToPath } from 'node:url'; import { glob } from 'glob'; import { run as runNodeTests } from 'node:test'; -import { PARENT_DIRECTORY_SEGMENT } from '@/types'; +import { PARENT_DIRECTORY_SEGMENT } from '../../types/index.js'; export async function run(): Promise { - const testsRoot = path.resolve( - path.dirname(fileURLToPath(import.meta.url)), - PARENT_DIRECTORY_SEGMENT, - ); + const testsRoot = path.resolve(__dirname, PARENT_DIRECTORY_SEGMENT); console.log('Test runner starting...'); console.log('Tests root:', testsRoot); @@ -21,18 +17,26 @@ export async function run(): Promise { console.log('Found test files:', files); let failureCount = 0; + let passCount = 0; const testStream = runNodeTests({ files, isolation: 'none', setup: (stream) => { - stream.on('test:fail', () => { + stream.on('test:fail', (data) => { failureCount += 1; + console.log('Test failed:', data.name); + }); + stream.on('test:pass', (data) => { + passCount += 1; + console.log('Test passed:', data.name); }); }, }); await once(testStream, 'end'); + console.log(`Tests complete: ${passCount} passed, ${failureCount} failed`); + if (failureCount > 0) { throw new Error(`${failureCount} tests failed.`); } diff --git a/src/test/testHarness.ts b/src/test/testHarness.ts index 3bab5f7..503e3e9 100644 --- a/src/test/testHarness.ts +++ b/src/test/testHarness.ts @@ -1,4 +1,4 @@ -export { afterEach, beforeEach, describe, it } from 'node:test'; +export { afterEach, beforeEach, describe, it, mock } from 'node:test'; const activeSpies = new Set(); From 304c541334ed8ab83c346efe759272575098e3ec Mon Sep 17 00:00:00 2001 From: coderrob Date: Fri, 24 Oct 2025 22:05:50 -0500 Subject: [PATCH 16/20] feat: refactor file system tests to use a reusable filtering function and remove redundant code --- src/core/io/file-system.service.test.ts | 59 ++++++++------ src/test-utils/testHarness.ts | 83 -------------------- src/test/suite/barrel-file.generator.test.ts | 32 +++----- 3 files changed, 44 insertions(+), 130 deletions(-) delete mode 100644 src/test-utils/testHarness.ts diff --git a/src/core/io/file-system.service.test.ts b/src/core/io/file-system.service.test.ts index a79811c..0d2bf53 100644 --- a/src/core/io/file-system.service.test.ts +++ b/src/core/io/file-system.service.test.ts @@ -9,6 +9,27 @@ import { afterEach, beforeEach, describe, it, jest } from '../../test/testHarnes import { INDEX_FILENAME } from '../../types/index.js'; import { FileSystemService } from './file-system.service.js'; +async function testEntriesFiltering( + testCases: Array<{ entry: Dirent; shouldInclude: boolean }>, + methodUnderTest: (path: string) => Promise, + directoryPath: string, + testNamePrefix: string, +): Promise { + for (const [index, { entry, shouldInclude }] of testCases.entries()) { + it(`${testNamePrefix} ${index}`, async () => { + const readdirMock = jest.spyOn(fs, 'readdir').mockResolvedValue([entry] as never); + + const result = await methodUnderTest(directoryPath); + + const expectedPath = path.join(directoryPath, entry.name); + const expected = shouldInclude ? [expectedPath] : []; + + assert.deepStrictEqual(result, expected); + assert.deepStrictEqual(readdirMock.mock.calls, [[directoryPath, { withFileTypes: true }]]); + }); + } +} + describe('FileSystemService', () => { let service: FileSystemService; @@ -65,19 +86,12 @@ describe('FileSystemService', () => { { entry: createDirectoryEntry('nested'), shouldInclude: false }, ]; - for (const [index, { entry, shouldInclude }] of typeScriptEntryCases.entries()) { - it(`should handle TypeScript entry filtering ${index}`, async () => { - const readdirMock = jest.spyOn(fs, 'readdir').mockResolvedValue([entry] as never); - - const result = await service.getTypeScriptFiles(directoryPath); - - const expectedPath = path.join(directoryPath, entry.name); - const expected = shouldInclude ? [expectedPath] : []; - - assert.deepStrictEqual(result, expected); - assert.deepStrictEqual(readdirMock.mock.calls, [[directoryPath, { withFileTypes: true }]]); - }); - } + testEntriesFiltering( + typeScriptEntryCases, + (path) => service.getTypeScriptFiles(path), + directoryPath, + 'should handle TypeScript entry filtering', + ); it('should throw error if directory read fails', async () => { jest.spyOn(fs, 'readdir').mockRejectedValue(new Error('Read error')); @@ -114,19 +128,12 @@ describe('FileSystemService', () => { { entry: createFileEntry('readme.md'), shouldInclude: false }, ]; - for (const [index, { entry, shouldInclude }] of subdirectoryCases.entries()) { - it(`should handle subdirectory filtering ${index}`, async () => { - const readdirMock = jest.spyOn(fs, 'readdir').mockResolvedValue([entry] as never); - - const result = await service.getSubdirectories(directoryPath); - - const expectedPath = path.join(directoryPath, entry.name); - const expected = shouldInclude ? [expectedPath] : []; - - assert.deepStrictEqual(result, expected); - assert.deepStrictEqual(readdirMock.mock.calls, [[directoryPath, { withFileTypes: true }]]); - }); - } + testEntriesFiltering( + subdirectoryCases, + (path) => service.getSubdirectories(path), + directoryPath, + 'should handle subdirectory filtering', + ); it('should throw error if directory read fails', async () => { jest.spyOn(fs, 'readdir').mockRejectedValue(new Error('Read error')); diff --git a/src/test-utils/testHarness.ts b/src/test-utils/testHarness.ts deleted file mode 100644 index 45dde1e..0000000 --- a/src/test-utils/testHarness.ts +++ /dev/null @@ -1,83 +0,0 @@ -export { afterEach, beforeEach, describe, it } from 'node:test'; - -const activeSpies = new Set(); - -type AnyFunction = (...args: any[]) => any; - -type SpyInstance = { - restore: () => void; -}; - -type Spy = { - mock: { - calls: TArgs[]; - }; - mockImplementation: (impl: (...args: TArgs) => TReturn) => Spy; - mockResolvedValue: (value: Awaited) => Spy; - mockRejectedValue: (error: unknown) => Spy; -}; - -function createSpy( - target: TTarget, - key: TKey, -): Spy< - Parameters>, - ReturnType> -> { - const original = target[key]; - - if (typeof original !== 'function') { - throw new TypeError(`Cannot spy on property ${String(key)} because it is not a function.`); - } - - type Args = Parameters>; - type Return = ReturnType>; - - const calls: Args[] = []; - let implementation = original as AnyFunction; - - const spyWrapper = ((...args: Args) => { - calls.push(args); - return implementation.apply(target, args); - }) as TTarget[TKey]; - - (target as Record)[key as string | symbol] = spyWrapper; - - const spyApi: Spy & SpyInstance = { - mock: { - calls, - }, - mockImplementation(newImpl: AnyFunction) { - implementation = newImpl; - return spyApi; - }, - mockResolvedValue(value: unknown) { - implementation = () => Promise.resolve(value) as Return; - return spyApi; - }, - mockRejectedValue(error: unknown) { - const rejection = error instanceof Error ? error : new Error(String(error)); - implementation = () => Promise.reject(rejection) as Return; - return spyApi; - }, - restore() { - (target as Record)[key as string | symbol] = original; - activeSpies.delete(spyApi); - }, - }; - - activeSpies.add(spyApi); - - return spyApi; -} - -const jestLike = { - spyOn: createSpy, - restoreAllMocks(): void { - for (const spy of activeSpies) { - spy.restore(); - } - activeSpies.clear(); - }, -}; -export const jest = jestLike; diff --git a/src/test/suite/barrel-file.generator.test.ts b/src/test/suite/barrel-file.generator.test.ts index 5fa1b1b..1de019a 100644 --- a/src/test/suite/barrel-file.generator.test.ts +++ b/src/test/suite/barrel-file.generator.test.ts @@ -26,6 +26,14 @@ describe('BarrelFileGenerator Test Suite', () => { } }); + async function generateAndReadBarrel(): Promise { + const generator = new BarrelFileGenerator(); + const uri = vscode.Uri.file(testDir); + await generator.generateBarrelFile(uri); + const barrelPath = path.join(testDir, 'index.ts'); + return fs.readFile(barrelPath, 'utf-8'); + } + it('should generate barrel file with exports from multiple files', async () => { await fs.writeFile( path.join(testDir, 'file1.ts'), @@ -36,13 +44,7 @@ describe('BarrelFileGenerator Test Suite', () => { 'export interface MyInterface {}\nexport function myFunction() {}', ); - const generator = new BarrelFileGenerator(); - const uri = vscode.Uri.file(testDir); - - await generator.generateBarrelFile(uri); - - const barrelPath = path.join(testDir, 'index.ts'); - const content = await fs.readFile(barrelPath, 'utf-8'); + const content = await generateAndReadBarrel(); assert.ok(content.includes('export { MyClass } from')); assert.ok(content.includes('myConst')); @@ -56,13 +58,7 @@ describe('BarrelFileGenerator Test Suite', () => { await fs.writeFile(path.join(testDir, 'newFile.ts'), 'export class NewClass {}'); await fs.writeFile(path.join(testDir, 'index.ts'), '// Old content'); - const generator = new BarrelFileGenerator(); - const uri = vscode.Uri.file(testDir); - - await generator.generateBarrelFile(uri); - - const barrelPath = path.join(testDir, 'index.ts'); - const content = await fs.readFile(barrelPath, 'utf-8'); + const content = await generateAndReadBarrel(); assert.ok(content.includes('NewClass')); assert.ok(!content.includes('// Old content')); @@ -82,13 +78,7 @@ describe('BarrelFileGenerator Test Suite', () => { await fs.writeFile(path.join(testDir, 'file1.ts'), 'export class MyClass {}'); await fs.writeFile(path.join(testDir, 'index.ts'), 'export class IndexClass {}'); - const generator = new BarrelFileGenerator(); - const uri = vscode.Uri.file(testDir); - - await generator.generateBarrelFile(uri); - - const barrelPath = path.join(testDir, 'index.ts'); - const content = await fs.readFile(barrelPath, 'utf-8'); + const content = await generateAndReadBarrel(); assert.ok(content.includes('export { MyClass } from')); assert.ok(!content.includes('IndexClass')); From 35976cc34d944a30cfe5f14479118c05ce81166a Mon Sep 17 00:00:00 2001 From: coderrob Date: Fri, 24 Oct 2025 22:18:09 -0500 Subject: [PATCH 17/20] feat: update CI and release workflows to use Node.js 22.x and improve quality checks --- .github/workflows/ci.yml | 25 +++++++++++++++-------- .github/workflows/release.yml | 38 +++++++++++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3c22478..f5aa050 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,31 +12,40 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] - node-version: [18.x, 20.x] + node-version: [18.x, 20.x, 22.x] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} + cache: 'npm' - name: Install dependencies run: npm ci + - name: Type check + run: npm run typecheck + - name: Run linter run: npm run lint - - name: Run formatter check - run: npm run format:check + - name: Check for code duplication + run: npm run duplication + + - name: Check for circular dependencies + run: npm run madge - - name: Compile + - name: Compile TypeScript run: npm run compile - - name: Run tests + - name: Compile tests + run: npm run compile-tests + + - name: Run unit tests run: npm test - if: runner.os == 'Linux' - name: Package extension run: npm run package diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5c29e33..1ba3ab1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,16 +6,45 @@ on: - 'v*' jobs: + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: 22.x + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Run quality checks + run: npm run quality + + - name: Type check + run: npm run typecheck + + - name: Compile tests + run: npm run compile-tests + + - name: Run tests + run: npm test + release: + needs: test runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Use Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: 20.x + node-version: 22.x + cache: 'npm' - name: Install dependencies run: npm ci @@ -30,8 +59,9 @@ jobs: run: vsce package - name: Create Release - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 with: files: '*.vsix' + generate_release_notes: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From af3528af3c0149e8f8763c04619333a8a310f83e Mon Sep 17 00:00:00 2001 From: coderrob Date: Sat, 25 Oct 2025 14:39:53 -0500 Subject: [PATCH 18/20] Implement feature X to enhance user experience and fix bug Y in module Z --- package-lock.json | 1967 +++++++++++++++++++++------------------------ 1 file changed, 921 insertions(+), 1046 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8202120..e7b7089 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,6 @@ }, "devDependencies": { "@types/glob": "^8.1.0", - "@types/mocha": "^10.0.1", "@types/node": "^22.x", "@types/vscode": "^1.80.0", "@typescript-eslint/eslint-plugin": "^8.24.0", @@ -29,11 +28,11 @@ "eslint-plugin-simple-import-sort": "^12.1.0", "eslint-plugin-sonarjs": "^3.0.5", "eslint-plugin-unused-imports": "^4.2.0", + "expect": "^29.7.0", "glob": "^10.3.3", "jscpd": "^4.0.5", "madge": "^8.0.0", "make-coverage-badge": "^1.2.0", - "mocha": "^10.2.0", "prettier": "^3.5.0", "ts-loader": "^9.4.4", "ts-morph": "^27.0.2", @@ -47,6 +46,21 @@ "vscode": "^1.80.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -58,9 +72,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -68,13 +82,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.4" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -84,14 +98,14 @@ } }, "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -121,17 +135,6 @@ "node": ">=12" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@dependents/detective-less": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-5.0.1.tgz", @@ -157,9 +160,9 @@ } }, "node_modules/@emnapi/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", - "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.6.0.tgz", + "integrity": "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==", "dev": true, "license": "MIT", "optional": true, @@ -169,9 +172,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", - "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.6.0.tgz", + "integrity": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==", "dev": true, "license": "MIT", "optional": true, @@ -217,9 +220,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -227,13 +230,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -266,9 +269,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", - "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.1.tgz", + "integrity": "sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -315,6 +318,23 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -336,6 +356,13 @@ "node": ">= 4" } }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -350,9 +377,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", - "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", + "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", "dev": true, "license": "MIT", "engines": { @@ -363,9 +390,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -479,33 +506,48 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "jest-get-type": "^29.6.3" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">=12" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jridgewell/gen-mapping": { @@ -519,6 +561,17 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -540,6 +593,17 @@ "@jridgewell/trace-mapping": "^0.3.25" } }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -548,14 +612,14 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@jscpd/core": { @@ -672,6 +736,12 @@ "node": ">=12.4.0" } }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -703,6 +773,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, "node_modules/@ts-graphviz/adapter": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@ts-graphviz/adapter/-/adapter-2.0.6.tgz", @@ -900,6 +977,33 @@ "@types/node": "*" } }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -921,17 +1025,10 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/mocha": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", - "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/node": { - "version": "22.18.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.10.tgz", - "integrity": "sha512-anNG/V/Efn/YZY4pRzbACnKxNKoBng2VTFydVu8RRs5hQjikP8CQfaeAV59VFSCzKNp90mXiVXW2QzV56rwMrg==", + "version": "22.18.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.12.tgz", + "integrity": "sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog==", "dev": true, "license": "MIT", "dependencies": { @@ -945,6 +1042,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/vscode": { "version": "1.105.0", "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.105.0.tgz", @@ -952,18 +1056,35 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/yargs": { + "version": "17.0.34", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.34.tgz", + "integrity": "sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.1.tgz", - "integrity": "sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz", + "integrity": "sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/type-utils": "8.46.1", - "@typescript-eslint/utils": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/type-utils": "8.46.2", + "@typescript-eslint/utils": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -977,22 +1098,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.46.1", + "@typescript-eslint/parser": "^8.46.2", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.1.tgz", - "integrity": "sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.2.tgz", + "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", "debug": "^4.3.4" }, "engines": { @@ -1008,14 +1129,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.1.tgz", - "integrity": "sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.2.tgz", + "integrity": "sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.1", - "@typescript-eslint/types": "^8.46.1", + "@typescript-eslint/tsconfig-utils": "^8.46.2", + "@typescript-eslint/types": "^8.46.2", "debug": "^4.3.4" }, "engines": { @@ -1030,14 +1151,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.1.tgz", - "integrity": "sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz", + "integrity": "sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1" + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1048,9 +1169,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.1.tgz", - "integrity": "sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz", + "integrity": "sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==", "dev": true, "license": "MIT", "engines": { @@ -1065,15 +1186,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.1.tgz", - "integrity": "sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz", + "integrity": "sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1", - "@typescript-eslint/utils": "8.46.1", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/utils": "8.46.2", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -1090,9 +1211,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.1.tgz", - "integrity": "sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", + "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", "dev": true, "license": "MIT", "engines": { @@ -1104,16 +1225,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.1.tgz", - "integrity": "sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz", + "integrity": "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.46.1", - "@typescript-eslint/tsconfig-utils": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/visitor-keys": "8.46.1", + "@typescript-eslint/project-service": "8.46.2", + "@typescript-eslint/tsconfig-utils": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -1133,16 +1254,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.1.tgz", - "integrity": "sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.2.tgz", + "integrity": "sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.1", - "@typescript-eslint/types": "8.46.1", - "@typescript-eslint/typescript-estree": "8.46.1" + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1157,13 +1278,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.1.tgz", - "integrity": "sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==", + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", + "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.1", + "@typescript-eslint/types": "8.46.2", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -1836,16 +1957,16 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -1870,48 +1991,30 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "fast-deep-equal": "^3.1.3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "peerDependencies": { + "ajv": "^8.8.2" } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -1937,20 +2040,6 @@ "dev": true, "license": "MIT" }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/app-module-path": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", @@ -2195,28 +2284,15 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.16", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.16.tgz", - "integrity": "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==", + "version": "2.8.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.20.tgz", + "integrity": "sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==", "dev": true, "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -2245,9 +2321,9 @@ } }, "node_modules/blamer": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/blamer/-/blamer-1.0.6.tgz", - "integrity": "sha512-fv7QToPS87oD1m1bDDTf29zC/bVKJxj2Nqh1r/v4NhMtbnzDIbWOHBYIfxCjlmkVGu3FGOjKgdNG3SFm7TkvBQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/blamer/-/blamer-1.0.7.tgz", + "integrity": "sha512-GbBStl/EVlSWkiJQBZps3H1iARBrC7vt++Jb/TTmCNu/jZ04VW7tSN1nScbFXBUy1AN+jzeL7Zep9sbQxLhXKA==", "dev": true, "license": "MIT", "dependencies": { @@ -2258,113 +2334,33 @@ "node": ">=8.9" } }, - "node_modules/blamer/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "balanced-match": "^1.0.0" } }, - "node_modules/blamer/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { - "pump": "^3.0.0" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/blamer/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/blamer/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/blamer/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true, - "license": "ISC" - }, "node_modules/browserslist": { - "version": "4.26.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", - "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", "dev": true, "funding": [ { @@ -2382,11 +2378,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.9", - "caniuse-lite": "^1.0.30001746", - "electron-to-chromium": "^1.5.227", - "node-releases": "^2.0.21", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" @@ -2510,23 +2506,10 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/caniuse-lite": { - "version": "1.0.30001750", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001750.tgz", - "integrity": "sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==", + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", "dev": true, "funding": [ { @@ -2571,44 +2554,6 @@ "is-regex": "^1.0.3" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", @@ -2619,6 +2564,22 @@ "node": ">=6.0" } }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cli-cursor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", @@ -2664,48 +2625,24 @@ "@colors/colors": "1.5.0" } }, - "node_modules/cli-table3/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/cli-table3/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { "node": ">=8" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { + "node_modules/cli-table3/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, - "node_modules/cliui/node_modules/string-width": { + "node_modules/cli-table3/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", @@ -2720,22 +2657,17 @@ "node": ">=8" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/cli-table3/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/clone": { @@ -2808,11 +2740,14 @@ } }, "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=20" + } }, "node_modules/commondir": { "version": "1.0.1", @@ -2958,19 +2893,6 @@ } } }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -3077,53 +2999,6 @@ "node": "^20.12||^22||>=24" } }, - "node_modules/dependency-cruiser/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/dependency-cruiser/node_modules/commander": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.1.tgz", - "integrity": "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/dependency-cruiser/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/dependency-cruiser/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/dependency-tree": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/dependency-tree/-/dependency-tree-11.2.0.tgz", @@ -3295,15 +3170,25 @@ } }, "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -3347,9 +3232,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.235", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.235.tgz", - "integrity": "sha512-i/7ntLFwOdoHY7sgjlTIDo4Sl8EdoTjWIaKinYOVfC6bOp71bmwenyZthWHcasxgHDNWbWxvG9M3Ia116zIaYQ==", + "version": "1.5.240", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.240.tgz", + "integrity": "sha512-OBwbZjWgrCOH+g6uJsA2/7Twpas2OlepS9uvByJjR2datRDuKGYeD+nP8lBBks2qnB7bGJNHDUx7c/YLaT3QMQ==", "dev": true, "license": "ISC" }, @@ -3398,9 +3283,9 @@ } }, "node_modules/envinfo": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.18.0.tgz", - "integrity": "sha512-02QGCLRW+Jb8PC270ic02lat+N57iBaWsvHjcJViqp6UVupRB+Vsg7brYPTqEFXvsdTql3KnSczv5ModZFpl8Q==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.19.0.tgz", + "integrity": "sha512-DoSM9VyG6O3vqBf+p3Gjgr/Q52HYBBtO3v+4koAxt1MnWr+zEnxE+nke/yXS4lt2P4SYCHQ4V3f1i88LQVOpAw==", "dev": true, "license": "MIT", "bin": { @@ -3611,37 +3496,25 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eslint": { - "version": "9.37.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", - "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", + "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.4.0", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.1", "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.37.0", + "@eslint/js": "9.38.0", "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", @@ -3935,10 +3808,33 @@ "eslint": "^8.0.0 || ^9.0.0" } }, + "node_modules/eslint-plugin-sonarjs/node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/eslint-plugin-sonarjs/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-plugin-unused-imports": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.2.0.tgz", - "integrity": "sha512-hLbJ2/wnjKq4kGA9AUaExVFIbNzyxYdVo49QZmKCnhk5pc9wcYRbfgLHvWJ8tnsdcseGhoUAddm9gn/lt+d74w==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.3.0.tgz", + "integrity": "sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3981,6 +3877,23 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -4015,6 +3928,13 @@ "node": ">= 4" } }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4131,16 +4051,64 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true, - "license": "MIT" + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "license": "MIT", + "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" + }, "engines": { - "node": ">=0.8.x" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/fast-deep-equal": { @@ -4238,6 +4206,24 @@ "reusify": "^1.0.4" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -4418,21 +4404,6 @@ "dev": true, "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -4505,16 +4476,6 @@ "node": ">=18" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/get-east-asian-width": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", @@ -4574,6 +4535,22 @@ "node": ">= 0.4" } }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", @@ -4593,9 +4570,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.12.0.tgz", - "integrity": "sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4672,16 +4649,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/global-directory/node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -4849,16 +4816,6 @@ "node": ">= 0.4" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -4887,6 +4844,16 @@ "node": ">= 14" } }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -4992,11 +4959,14 @@ "license": "ISC" }, "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/internal-slot": { "version": "1.1.0", @@ -5077,19 +5047,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-boolean-object": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", @@ -5380,16 +5337,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -5533,13 +5480,13 @@ } }, "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5651,6 +5598,100 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -5689,6 +5730,13 @@ "dev": true, "license": "MIT" }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -5760,9 +5808,9 @@ "license": "MIT" }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, "license": "MIT" }, @@ -5925,17 +5973,43 @@ "license": "MIT" }, "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5987,6 +6061,16 @@ } } }, + "node_modules/madge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/madge/node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -6020,17 +6104,31 @@ "node": ">=8" } }, - "node_modules/madge/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/madge/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/madge/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6081,10 +6179,23 @@ "dev": true, "license": "ISC" }, + "node_modules/madge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/magic-string": { - "version": "0.30.19", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", - "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6140,9 +6251,9 @@ } }, "node_modules/memoize": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.1.0.tgz", - "integrity": "sha512-MMbFhJzh4Jlg/poq1si90XRlTZRDHVqdlz2mPyGJ6kqMpyHUyVpDd5gpFAvVehW64+RA1eKE9Yt8aSLY7w2Kgg==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/memoize/-/memoize-10.2.0.tgz", + "integrity": "sha512-DeC6b7QBrZsRs3Y02A6A7lQyzFbsQbqgjI6UW0GigGWV+u1s25TycMr0XHZE4cJce7rY/vyw2ctMQqfDkIhUEA==", "dev": true, "license": "MIT", "dependencies": { @@ -6186,6 +6297,19 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -6268,92 +6392,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mocha": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", - "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.3", - "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", - "debug": "^4.3.5", - "diff": "^5.2.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^8.1.0", - "he": "^1.2.0", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^5.1.6", - "ms": "^2.1.3", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^6.5.1", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/module-definition": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-6.0.1.tgz", @@ -6513,9 +6551,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.23", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", - "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz", + "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==", "dev": true, "license": "MIT" }, @@ -6561,16 +6599,6 @@ "node": ">=18" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -6711,16 +6739,16 @@ } }, "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", "dependencies": { - "mimic-function": "^5.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=18" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6768,19 +6796,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/ora/node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", @@ -6801,49 +6816,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ora/node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ora/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -6862,22 +6834,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", @@ -7044,24 +7000,25 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pino": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-10.0.0.tgz", - "integrity": "sha512-eI9pKwWEix40kfvSzqEP6ldqOoBIN7dwD/o91TY5z8vQI12sAffpR/pOqAD1IVVwIVHDpHjkq0joBPdJD0rafA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-10.1.0.tgz", + "integrity": "sha512-0zZC2ygfdqvqK8zJIr1e+wT1T/L+LF6qvqvbzEQ6tiMAoTqEVK9a1K3YRu8HEUvGEvNqZyPJTtb2sNIoTkB83w==", "license": "MIT", "dependencies": { + "@pinojs/redact": "^0.4.0", "atomic-sleep": "^1.0.0", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", @@ -7070,7 +7027,6 @@ "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", - "slow-redact": "^0.3.0", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, @@ -7308,6 +7264,34 @@ "node": ">=6.0.0" } }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/pretty-ms": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", @@ -7588,6 +7572,13 @@ "rc": "cli.js" } }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -7598,6 +7589,13 @@ "node": ">=0.10.0" } }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -7614,19 +7612,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/real-require": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", @@ -7747,16 +7732,6 @@ "dev": true, "license": "MIT" }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -7796,13 +7771,13 @@ } }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -7886,6 +7861,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -8061,44 +8052,7 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" + } }, "node_modules/scslre": { "version": "0.3.0", @@ -8116,9 +8070,9 @@ } }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -8326,11 +8280,15 @@ "dev": true, "license": "MIT" }, - "node_modules/slow-redact": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/slow-redact/-/slow-redact-0.3.2.tgz", - "integrity": "sha512-MseHyi2+E/hBRqdOi5COy6wZ7j7DxXRz9NkseavNYSvvWC06D8a5cidVZX3tcG5eCW3NIyVU4zT63hw0Q486jw==", - "license": "MIT" + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, "node_modules/sonic-boom": { "version": "4.2.0", @@ -8342,13 +8300,13 @@ } }, "node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { - "node": ">= 12" + "node": ">=0.10.0" } }, "node_modules/source-map-js": { @@ -8372,16 +8330,6 @@ "source-map": "^0.6.0" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/spark-md5": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz", @@ -8405,6 +8353,29 @@ "dev": true, "license": "MIT" }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/stdin-discarder": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", @@ -8486,6 +8457,16 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -8493,33 +8474,17 @@ "dev": true, "license": "MIT" }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/string.prototype.trim": { @@ -8597,16 +8562,19 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-ansi-cjs": { @@ -8623,6 +8591,16 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -8792,6 +8770,24 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, "node_modules/thread-stream": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", @@ -8818,37 +8814,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8929,6 +8894,16 @@ "webpack": "^5.0.0" } }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, "node_modules/ts-morph": { "version": "27.0.2", "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-27.0.2.tgz", @@ -8984,16 +8959,6 @@ } } }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -9235,9 +9200,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", "dev": true, "funding": [ { @@ -9645,13 +9610,6 @@ "node": ">=0.10.0" } }, - "node_modules/workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -9689,6 +9647,16 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -9711,17 +9679,17 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { @@ -9737,22 +9705,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -9760,83 +9712,6 @@ "dev": true, "license": "ISC" }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", From aada2a2546d82c6811a52f1f36d229dd598a208c Mon Sep 17 00:00:00 2001 From: coderrob Date: Sat, 25 Oct 2025 15:19:09 -0500 Subject: [PATCH 19/20] fix: update test script to use wildcard for test file matching --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 711cc96..3bf5e56 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "package": "webpack --mode production --devtool hidden-source-map", "pretest": "npm run compile-tests && npm run compile && npm run lint", "quality": "npm run lint && npm run duplication && npm run madge", - "test": "node --test \"out/core/barrel/**/*.test.js\" \"out/core/parser/**/*.test.js\" \"out/utils/**/*.test.js\"", + "test": "node --test out/core/barrel/*.test.js out/core/parser/*.test.js out/utils/*.test.js", "test:vscode": "node ./out/test/runTest.js", "typecheck": "tsc --noEmit", "vscode:prepublish": "npm run package", From 504746db729607c198946fd0b70e548b96087e3c Mon Sep 17 00:00:00 2001 From: coderrob Date: Sat, 25 Oct 2025 16:47:35 -0500 Subject: [PATCH 20/20] feat: implement cross-platform test runner script to handle glob patterns --- package.json | 2 +- scripts/run-tests.js | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 scripts/run-tests.js diff --git a/package.json b/package.json index 3bf5e56..d79a2e0 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "package": "webpack --mode production --devtool hidden-source-map", "pretest": "npm run compile-tests && npm run compile && npm run lint", "quality": "npm run lint && npm run duplication && npm run madge", - "test": "node --test out/core/barrel/*.test.js out/core/parser/*.test.js out/utils/*.test.js", + "test": "node scripts/run-tests.js", "test:vscode": "node ./out/test/runTest.js", "typecheck": "tsc --noEmit", "vscode:prepublish": "npm run package", diff --git a/scripts/run-tests.js b/scripts/run-tests.js new file mode 100644 index 0000000..5098890 --- /dev/null +++ b/scripts/run-tests.js @@ -0,0 +1,30 @@ +#!/usr/bin/env node + +/** + * Cross-platform test runner that expands glob patterns before passing to node --test + * This is needed because Windows doesn't expand globs in the same way as Unix shells + */ + +const { spawn } = require('node:child_process'); +const { globSync } = require('glob'); + +// Define test file patterns +const patterns = ['out/core/barrel/*.test.js', 'out/core/parser/*.test.js', 'out/utils/*.test.js']; + +// Expand all glob patterns to actual file paths +const testFiles = patterns.flatMap((pattern) => globSync(pattern, { cwd: process.cwd() })); + +if (testFiles.length === 0) { + console.error('No test files found matching patterns:', patterns); + process.exit(1); +} + +// Run node --test with the expanded file list +const nodeTest = spawn('node', ['--test', ...testFiles], { + stdio: 'inherit', + shell: false, +}); + +nodeTest.on('close', (code) => { + process.exit(code); +});