From 2288711009d9bbc104e0d3fcc592953d7b6cc6bf Mon Sep 17 00:00:00 2001 From: Daniel Christian Schroeter <2836188+danielchristianschroeter@users.noreply.github.com> Date: Fri, 4 Oct 2024 19:47:48 +0200 Subject: [PATCH] - Added: Automatic detection of CI/CD system (GitHub Actions or GitLab CI) - Removed: Manual CI type selection from settings - Improved: Error handling and user feedback for tag creation and pushing - Fixed: Issue with tag creation and pushing synchronization --- .github/workflows/release.yml | 11 + CHANGELOG.md | 7 + README.md | 49 +- ...-workflow-gitlab-pipeline-build-status.png | Bin 0 -> 14513 bytes package-lock.json | 1525 ++++++++++++----- package.json | 32 +- src/commands/createInitialTag.ts | 16 +- src/commands/createTag.ts | 37 +- src/extension.ts | 130 +- src/services/ciService.ts | 167 ++ src/services/gitService.ts | 185 +- src/services/statusBarService.ts | 110 +- src/utils/ciUtils.ts | 41 + src/utils/debounce.ts | 13 + src/utils/errorHandler.ts | 13 +- src/utils/statusBarUpdater.ts | 115 +- tsconfig.json | 30 +- 17 files changed, 1893 insertions(+), 588 deletions(-) create mode 100644 images/status-bar-show-github-workflow-gitlab-pipeline-build-status.png create mode 100644 src/services/ciService.ts create mode 100644 src/utils/ciUtils.ts create mode 100644 src/utils/debounce.ts diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3415832..f3a9fd5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -51,3 +51,14 @@ jobs: ./*.vsix env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Publish to Open VSX Registry + uses: HaaLeo/publish-vscode-extension@v1 + with: + pat: ${{ secrets.OPEN_VSX_TOKEN }} + + - name: Publish to Visual Studio Marketplace + uses: HaaLeo/publish-vscode-extension@v1 + with: + pat: ${{ secrets.VS_MARKETPLACE_TOKEN }} + registryUrl: https://marketplace.visualstudio.com diff --git a/CHANGELOG.md b/CHANGELOG.md index 026c7f3..20acc55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [1.2.0] + +- Added: Automatic detection of CI/CD system (GitHub Actions or GitLab CI) +- Removed: Manual CI type selection from settings +- Improved: Error handling and user feedback for tag creation and pushing +- Fixed: Issue with tag creation and pushing synchronization + ## [1.1.0] - Changed: Restructure and optimize code for better maintainability diff --git a/README.md b/README.md index 3236483..3f81b7b 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ # Git Tag Release Tracker -The **Git Tag Release Tracker** extension for Visual Studio Code allows you to manage and track your Git tags and releases directly within Visual Studio Code. Easily increment your Major, Minor, or Patch semantic versioning with a single click in the status bar. +The **Git Tag Release Tracker** extension for Visual Studio Code allows you to manage and track your Git tags and releases directly within Visual Studio Code. Easily increment your Major, Minor, or Patch semantic versioning with a single click in the status bar. This extension now supports both GitHub Actions and GitLab CI/CD pipelines with automatic detection. ## Features -- **Automatic Detection**: Automatically detects your Git repository, branch, and the latest tags. -- **Status Bar Integration**: Displays the number of unreleased commits and the latest tag version in the VS Code status bar. +- **Automatic Detection**: Automatically detects your Git repository, branch, the latest tags, and CI/CD system (GitHub Actions or GitLab CI). +- **Status Bar Integration**: Displays the number of unreleased commits, the latest tag version, and CI/CD status in the VS Code status bar. - **Tag Management**: Provides buttons to create major, minor, and patch tags directly from the status bar. - **Initial Tag Creation**: Easily create an initial version tag (1.0.0) if no tags are present. - **Compare Commits**: Open a compare link to view changes between the latest tag and the current branch on GitHub/GitLab. -- **CI/CD Integration**: Ideal for CI/CD workflows triggered by tag pushes. +- **CI/CD Integration**: Shows the build status of the latest tag directly in the status bar for both GitHub Actions and GitLab CI/CD. ### Screenshots @@ -31,12 +31,51 @@ The **Git Tag Release Tracker** extension for Visual Studio Code allows you to m Maintain existing prefixes and suffixes in the version tag structure.

+

+Preserve Prefix and Suffix +
+Get current build status for Github Action Workflows or GitLab Pipelines. +

+ ## Requirements -Ensure your current directory contains a Git repository with a configured remote (e.g., GitHub or GitLab). +- Ensure your current directory contains a Git repository with a configured remote (GitHub or GitLab). +- For CI/CD status checks: + - GitHub: A Personal Access Token with `repo:status` scope (or `repo` for private repositories). + - GitLab: A Personal Access Token with `read_api` scope. ## Extension Settings This extension contributes the following settings: - `gitTagReleaseTracker.defaultBranch`: Specifies the default branch used for release versioning (e.g., main, master, production). Default is `main`. +- `gitTagReleaseTracker.ciToken`: Your GitHub or GitLab Personal Access Token for CI/CD status checks. +- `gitTagReleaseTracker.ciApiUrl`: The API URL for your CI/CD service. + - For GitHub: `https://api.github.com` + - For GitLab: Your GitLab instance URL (e.g., `https://gitlab.com` for GitLab.com) + +## Setting up CI/CD Status Checks + +To enable CI/CD status checks for your tags: + +1. Generate a Personal Access Token: + + - For GitHub: + - Go to Settings > Developer settings > Personal access tokens > Generate new token. + - Select the `repo:status` scope (or `repo` for private repositories). + - For GitLab: + - Go to User Settings > Access Tokens. + - Create a new token with the `read_api` scope. + +2. Open your VS Code settings (File > Preferences > Settings). + +3. Search for "Git Tag Release Tracker" and fill in the following settings: + + - `gitTagReleaseTracker.ciToken`: Paste your Personal Access Token here. + - `gitTagReleaseTracker.ciApiUrl`: + - For GitHub: Use `https://api.github.com` + - For GitLab: Enter your GitLab instance URL (e.g., `https://gitlab.com` for GitLab.com) + +4. Save your settings. + +The extension will automatically detect whether you're using GitHub Actions or GitLab CI based on your repository configuration. It will then check and display the CI/CD status for your tags in the status bar. diff --git a/images/status-bar-show-github-workflow-gitlab-pipeline-build-status.png b/images/status-bar-show-github-workflow-gitlab-pipeline-build-status.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf86279510d11d037b672c7d3993a72b04a31e9 GIT binary patch literal 14513 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 aBIDOdnNqBbE#PrO$QvmI$r5pcfd3B|`sUsM literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index e3af77f..e3b05df 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,23 +8,25 @@ "name": "git-tag-release-tracker", "version": "0.0.1", "dependencies": { + "axios": "^1.7.7", "semver": "^7.6.3", - "simple-git": "^3.27.0" + "simple-git": "^3.27.0", + "vscode": "^1.1.37" }, "devDependencies": { - "@types/mocha": "^10.0.7", - "@types/node": "22.5.5", + "@types/mocha": "^10.0.8", + "@types/node": "22.7.4", "@types/semver": "^7.5.8", "@types/sinon": "^17.0.3", - "@types/vscode": "^1.91.0", - "@typescript-eslint/eslint-plugin": "^8.6.0", - "@typescript-eslint/parser": "^8.6.0", + "@types/vscode": "^1.94.0", + "@typescript-eslint/eslint-plugin": "^8.8.0", + "@typescript-eslint/parser": "^8.8.0", "@vscode/test-cli": "^0.0.10", "@vscode/test-electron": "^2.4.1", - "@vscode/vsce": "^3.1.0", + "@vscode/vsce": "^3.1.1", "chai": "^5.1.1", - "esbuild": "^0.23.1", - "eslint": "^9.10.0", + "esbuild": "^0.24.0", + "eslint": "^9.11.1", "mocha": "^10.7.3", "npm-run-all": "^4.1.5", "sinon": "^19.0.2", @@ -141,9 +143,9 @@ } }, "node_modules/@azure/core-tracing": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.1.2.tgz", - "integrity": "sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz", + "integrity": "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==", "dev": true, "license": "MIT", "dependencies": { @@ -220,9 +222,9 @@ } }, "node_modules/@azure/msal-browser": { - "version": "3.24.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.24.0.tgz", - "integrity": "sha512-JGNV9hTYAa7lsum9IMIibn2kKczAojNihGo1hi7pG0kNrcKej530Fl6jxwM05A44/6I079CSn6WxYxbVhKUmWg==", + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.25.0.tgz", + "integrity": "sha512-a0Y7pmSy8SC1s9bvwr+REvyAA1nQcITlZvkElM2gNUPYFTTNUTEdcpg73TmawNucyMdZ9xb/GFcuhrLOqYAzwg==", "dev": true, "license": "MIT", "dependencies": { @@ -243,9 +245,9 @@ } }, "node_modules/@azure/msal-node": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.14.0.tgz", - "integrity": "sha512-rrfzIpG3Q1rHjVYZmHAEDidWAZZ2cgkxlIcMQ8dHebRISaZ2KCV33Q8Vs+uaV6lxweROabNxKFlR2lIKagZqYg==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.15.0.tgz", + "integrity": "sha512-gVPW8YLz92ZeCibQH2QUw96odJoiM3k/ZPH3f2HxptozmH6+OnyyvKXo/Egg39HAM230akarQKHf0W74UHlh0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -265,9 +267,9 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", "cpu": [ "ppc64" ], @@ -282,9 +284,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", "cpu": [ "arm" ], @@ -299,9 +301,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", "cpu": [ "arm64" ], @@ -316,9 +318,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", "cpu": [ "x64" ], @@ -333,9 +335,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", "cpu": [ "arm64" ], @@ -350,9 +352,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", "cpu": [ "x64" ], @@ -367,9 +369,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", "cpu": [ "arm64" ], @@ -384,9 +386,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", "cpu": [ "x64" ], @@ -401,9 +403,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", "cpu": [ "arm" ], @@ -418,9 +420,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", "cpu": [ "arm64" ], @@ -435,9 +437,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", "cpu": [ "ia32" ], @@ -452,9 +454,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", "cpu": [ "loong64" ], @@ -469,9 +471,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", "cpu": [ "mips64el" ], @@ -486,9 +488,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", "cpu": [ "ppc64" ], @@ -503,9 +505,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", "cpu": [ "riscv64" ], @@ -520,9 +522,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", "cpu": [ "s390x" ], @@ -537,9 +539,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", "cpu": [ "x64" ], @@ -554,9 +556,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", "cpu": [ "x64" ], @@ -571,9 +573,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", - "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", "cpu": [ "arm64" ], @@ -588,9 +590,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", "cpu": [ "x64" ], @@ -605,9 +607,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", "cpu": [ "x64" ], @@ -622,9 +624,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", "cpu": [ "arm64" ], @@ -639,9 +641,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", "cpu": [ "ia32" ], @@ -656,9 +658,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", - "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", "cpu": [ "x64" ], @@ -737,6 +739,16 @@ "node": "*" } }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", @@ -786,9 +798,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.11.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.0.tgz", - "integrity": "sha512-LPkkenkDqyzTFauZLLAPhIb48fj6drrfMvRGSL9tS3AcZBSVTllemLSNyCvHNNL2t797S/6DJNSIwRwXgMO/eQ==", + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.1.tgz", + "integrity": "sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==", "dev": true, "license": "MIT", "engines": { @@ -1044,6 +1056,22 @@ "dev": true, "license": "(Unlicense OR Apache-2.0)" }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, "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", @@ -1051,6 +1079,13 @@ "dev": true, "license": "MIT" }, + "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/mocha": { "version": "10.0.8", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.8.tgz", @@ -1059,9 +1094,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.5.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", - "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "version": "22.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", + "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", "dev": true, "license": "MIT", "dependencies": { @@ -1093,24 +1128,24 @@ "license": "MIT" }, "node_modules/@types/vscode": { - "version": "1.93.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.93.0.tgz", - "integrity": "sha512-kUK6jAHSR5zY8ps42xuW89NLcBpw1kOabah7yv38J8MyiYuOHxLQBi0e7zeXbQgVefDy/mZZetqEFC+Fl5eIEQ==", + "version": "1.94.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.94.0.tgz", + "integrity": "sha512-UyQOIUT0pb14XSqJskYnRwD2aG0QrPVefIfrW1djR+/J4KeFQ0i1+hjZoaAmeNf3Z2jleK+R2hv+EboG/m8ruw==", "dev": true, "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.6.0.tgz", - "integrity": "sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.0.tgz", + "integrity": "sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.6.0", - "@typescript-eslint/type-utils": "8.6.0", - "@typescript-eslint/utils": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0", + "@typescript-eslint/scope-manager": "8.8.0", + "@typescript-eslint/type-utils": "8.8.0", + "@typescript-eslint/utils": "8.8.0", + "@typescript-eslint/visitor-keys": "8.8.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -1134,16 +1169,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.6.0.tgz", - "integrity": "sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.0.tgz", + "integrity": "sha512-uEFUsgR+tl8GmzmLjRqz+VrDv4eoaMqMXW7ruXfgThaAShO9JTciKpEsB+TvnfFfbg5IpujgMXVV36gOJRLtZg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.6.0", - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/typescript-estree": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0", + "@typescript-eslint/scope-manager": "8.8.0", + "@typescript-eslint/types": "8.8.0", + "@typescript-eslint/typescript-estree": "8.8.0", + "@typescript-eslint/visitor-keys": "8.8.0", "debug": "^4.3.4" }, "engines": { @@ -1163,14 +1198,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.6.0.tgz", - "integrity": "sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.0.tgz", + "integrity": "sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0" + "@typescript-eslint/types": "8.8.0", + "@typescript-eslint/visitor-keys": "8.8.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1181,14 +1216,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.6.0.tgz", - "integrity": "sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.0.tgz", + "integrity": "sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.6.0", - "@typescript-eslint/utils": "8.6.0", + "@typescript-eslint/typescript-estree": "8.8.0", + "@typescript-eslint/utils": "8.8.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -1206,9 +1241,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.6.0.tgz", - "integrity": "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", + "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", "dev": true, "license": "MIT", "engines": { @@ -1220,14 +1255,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.6.0.tgz", - "integrity": "sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz", + "integrity": "sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/visitor-keys": "8.6.0", + "@typescript-eslint/types": "8.8.0", + "@typescript-eslint/visitor-keys": "8.8.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -1249,16 +1284,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.6.0.tgz", - "integrity": "sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.0.tgz", + "integrity": "sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.6.0", - "@typescript-eslint/types": "8.6.0", - "@typescript-eslint/typescript-estree": "8.6.0" + "@typescript-eslint/scope-manager": "8.8.0", + "@typescript-eslint/types": "8.8.0", + "@typescript-eslint/typescript-estree": "8.8.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1272,13 +1307,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.6.0.tgz", - "integrity": "sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.0.tgz", + "integrity": "sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/types": "8.8.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -1331,9 +1366,9 @@ } }, "node_modules/@vscode/vsce": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.1.0.tgz", - "integrity": "sha512-fwdfp1Ol+bZtlSGkpcd/nztfo6+SVsTOMWjZ/+a88lVtUn7gXNbSu7dbniecl5mz4vINl+oaVDVtVdGbJDApmw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-3.1.1.tgz", + "integrity": "sha512-N62Ca9ElRPLUUzf7l9CeEBlLrYzFPRQq7huKk4pVW+LjIOSXfFIPudixn5QvZcz+yXDOh15IopI3K2o3y9666Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1517,61 +1552,6 @@ "win32" ] }, - "node_modules/@vscode/vsce/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@vscode/vsce/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@vscode/vsce/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@vscode/vsce/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vscode/vsce/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/@vscode/vsce/node_modules/glob": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", @@ -1612,33 +1592,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@vscode/vsce/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@vscode/vsce/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@vscode/vsce/node_modules/jackspeak": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", - "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -1649,22 +1606,16 @@ }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/@vscode/vsce/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz", + "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==", "dev": true, "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": "20 || >=22" } }, "node_modules/@vscode/vsce/node_modules/minimatch": { @@ -1708,29 +1659,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@vscode/vsce/node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz", - "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@vscode/vsce/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/acorn": { "version": "8.12.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", @@ -1805,19 +1733,16 @@ } }, "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==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, "node_modules/anymatch": { @@ -1895,7 +1820,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, "license": "MIT" }, "node_modules/available-typed-arrays": { @@ -1914,6 +1838,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/azure-devops-node-api": { "version": "12.5.0", "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", @@ -1929,7 +1864,6 @@ "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": { @@ -2027,7 +1961,6 @@ "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/buffer": { @@ -2072,6 +2005,12 @@ "dev": true, "license": "BSD-3-Clause" }, + "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==", + "license": "MIT" + }, "node_modules/c8": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/c8/-/c8-9.1.0.tgz", @@ -2159,33 +2098,31 @@ } }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=4" } }, "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/check-error": { @@ -2319,6 +2256,42 @@ "node": ">=12" } }, + "node_modules/cliui/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/cliui/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/cliui/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/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -2370,22 +2343,19 @@ } }, "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==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, "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==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, "license": "MIT" }, @@ -2393,7 +2363,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -2416,7 +2385,6 @@ "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/convert-source-map": { @@ -2657,7 +2625,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" @@ -2959,10 +2926,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "license": "MIT" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "license": "MIT", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, "node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2973,30 +2955,30 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" } }, "node_modules/escalade": { @@ -3010,34 +2992,33 @@ } }, "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, + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, "node_modules/eslint": { - "version": "9.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.0.tgz", - "integrity": "sha512-yVS6XODx+tMFMDFcG4+Hlh+qG7RM6cCJXtQhCKLSsr3XkLvWggHjCqjfh0XsPPnt1c56oaT6PMgW9XWQQjdHXA==", + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.1.tgz", + "integrity": "sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.11.0", + "@eslint/js": "9.11.1", "@eslint/plugin-kit": "^0.2.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -3083,9 +3064,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", - "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3112,7 +3093,23 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/brace-expansion": { + "node_modules/eslint/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/eslint/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", @@ -3123,10 +3120,60 @@ "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { + "node_modules/eslint/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/eslint/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/eslint/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/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "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/eslint/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3149,6 +3196,16 @@ "node": ">=10.13.0" } }, + "node_modules/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3162,16 +3219,29 @@ "node": "*" } }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" + "eslint-visitor-keys": "^4.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3181,9 +3251,9 @@ } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3392,6 +3462,26 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -3423,7 +3513,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -3446,7 +3535,6 @@ "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": { @@ -3660,6 +3748,15 @@ "dev": true, "license": "MIT" }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "license": "MIT", + "engines": { + "node": ">=4.x" + } + }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -3671,13 +3768,12 @@ } }, "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, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/has-property-descriptors": { @@ -3759,11 +3855,17 @@ } }, "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "license": "ISC" + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } }, "node_modules/html-escaper": { "version": "2.0.2", @@ -3903,7 +4005,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": { "once": "^1.3.0", @@ -3914,7 +4015,6 @@ "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": { @@ -4348,6 +4448,16 @@ "node": ">=10" } }, + "node_modules/istanbul-lib-report/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/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4707,6 +4817,82 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-symbols/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/log-symbols/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/log-symbols/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/log-symbols/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/log-symbols/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/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/loupe": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", @@ -4718,11 +4904,17 @@ } }, "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==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC" + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } }, "node_modules/make-dir": { "version": "4.0.0", @@ -4815,7 +5007,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -4825,7 +5016,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -4895,6 +5085,19 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "license": "MIT", + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -4903,6 +5106,12 @@ "license": "MIT", "optional": true }, + "node_modules/mkdirp/node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", + "license": "MIT" + }, "node_modules/mocha": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", @@ -4939,6 +5148,22 @@ "node": ">= 14.0.0" } }, + "node_modules/mocha/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/mocha/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -4951,12 +5176,45 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/mocha/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/mocha/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/mocha/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/mocha/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/mocha/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/mocha/node_modules/glob": { "version": "8.1.0", @@ -4979,6 +5237,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/mocha/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/mocha/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -5154,6 +5422,13 @@ "validate-npm-package-license": "^3.0.1" } }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, "node_modules/normalize-package-data/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -5200,19 +5475,6 @@ "node": ">= 4" } }, - "node_modules/npm-run-all/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/npm-run-all/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5224,38 +5486,6 @@ "concat-map": "0.0.1" } }, - "node_modules/npm-run-all/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-all/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/npm-run-all/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, "node_modules/npm-run-all/node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -5273,26 +5503,6 @@ "node": ">=4.8" } }, - "node_modules/npm-run-all/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/npm-run-all/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/npm-run-all/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -5349,19 +5559,6 @@ "node": ">=0.10.0" } }, - "node_modules/npm-run-all/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/npm-run-all/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -5434,7 +5631,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -5646,9 +5842,9 @@ } }, "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, "license": "BlueOak-1.0.0" }, @@ -5760,7 +5956,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5800,10 +5995,17 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-scurry/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/path-to-regexp": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.1.0.tgz", - "integrity": "sha512-Bqn3vc8CMHty6zuD+tG23s6v2kwxslHEhTj4eYaVKGIEB+YX/2wd0/rgXLFD9G9id9KCtbVy/3ZgmvZjpa0UdQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", "dev": true, "license": "MIT", "engines": { @@ -5931,6 +6133,12 @@ "dev": true, "license": "MIT" }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/pump": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", @@ -6082,6 +6290,13 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/readable-stream/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/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -6096,16 +6311,16 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -6238,10 +6453,24 @@ "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==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "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/safe-regex-test": { @@ -6497,6 +6726,16 @@ "node": ">=0.3.1" } }, + "node_modules/sinon/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/sinon/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6510,6 +6749,25 @@ "node": ">=8" } }, + "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==", + "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", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -6583,6 +6841,13 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string_decoder/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/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -7265,6 +7530,293 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/vscode": { + "version": "1.1.37", + "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.37.tgz", + "integrity": "sha512-vJNj6IlN7IJPdMavlQa1KoFB3Ihn06q1AiN3ZFI/HfzPNzbKZWPPuiU+XkpNOfGU5k15m4r80nxNPlM7wcc0wg==", + "deprecated": "This package is deprecated in favor of @types/vscode and vscode-test. For more information please read: https://code.visualstudio.com/updates/v1_36#_splitting-vscode-package-into-typesvscode-and-vscodetest", + "license": "MIT", + "dependencies": { + "glob": "^7.1.2", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "mocha": "^5.2.0", + "semver": "^5.4.1", + "source-map-support": "^0.5.0", + "vscode-test": "^0.4.1" + }, + "bin": { + "vscode-install": "bin/install" + }, + "engines": { + "node": ">=8.9.3" + } + }, + "node_modules/vscode-test": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.3.tgz", + "integrity": "sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==", + "deprecated": "This package has been renamed to @vscode/test-electron, please update to the new name", + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1" + }, + "engines": { + "node": ">=8.9.3" + } + }, + "node_modules/vscode-test/node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "license": "MIT", + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/vscode-test/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/vscode-test/node_modules/http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "license": "MIT", + "dependencies": { + "agent-base": "4", + "debug": "3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/vscode-test/node_modules/https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "license": "MIT", + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/vscode-test/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/vscode/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/vscode/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/vscode/node_modules/commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "license": "MIT" + }, + "node_modules/vscode/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/vscode/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", + "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/vscode/node_modules/he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/vscode/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/vscode/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/vscode/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/vscode/node_modules/mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "license": "MIT", + "dependencies": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/vscode/node_modules/mocha/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/vscode/node_modules/mocha/node_modules/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/vscode/node_modules/mocha/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/vscode/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/vscode/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/vscode/node_modules/supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -7395,6 +7947,42 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7463,7 +8051,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, "license": "ISC" }, "node_modules/xml2js": { diff --git a/package.json b/package.json index 426e162..2f0e450 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "author": { "name": "Daniel Christian Schroeter" }, + "publisher ": "DanielChristianSchroeter", "version": "0.0.1", "engines": { "vscode": "^1.91.1" @@ -63,11 +64,22 @@ ], "configuration": { "type": "object", + "title": "Git Tag Release Tracker", "properties": { "gitTagReleaseTracker.defaultBranch": { "type": "string", "default": "main", "description": "The default branch used for release versioning (e.g., main, master, production)" + }, + "gitTagReleaseTracker.ciToken": { + "type": "string", + "default": "", + "description": "Authentication token for the CI/CD system" + }, + "gitTagReleaseTracker.ciApiUrl": { + "type": "string", + "default": "https://api.github.com", + "description": "API URL for the CI/CD system (use GitLab instance URL for GitLab)" } } } @@ -90,26 +102,28 @@ "test": "vscode-test" }, "devDependencies": { - "@types/mocha": "^10.0.7", - "@types/node": "22.5.5", + "@types/mocha": "^10.0.8", + "@types/node": "22.7.4", "@types/semver": "^7.5.8", "@types/sinon": "^17.0.3", - "@types/vscode": "^1.91.0", - "@vscode/vsce": "^3.1.0", - "@typescript-eslint/eslint-plugin": "^8.6.0", - "@typescript-eslint/parser": "^8.6.0", + "@types/vscode": "^1.94.0", + "@typescript-eslint/eslint-plugin": "^8.8.0", + "@typescript-eslint/parser": "^8.8.0", "@vscode/test-cli": "^0.0.10", "@vscode/test-electron": "^2.4.1", + "@vscode/vsce": "^3.1.1", "chai": "^5.1.1", - "esbuild": "^0.23.1", - "eslint": "^9.10.0", + "esbuild": "^0.24.0", + "eslint": "^9.11.1", "mocha": "^10.7.3", "npm-run-all": "^4.1.5", "sinon": "^19.0.2", "typescript": "^5.6.2" }, "dependencies": { + "axios": "^1.7.7", "semver": "^7.6.3", - "simple-git": "^3.27.0" + "simple-git": "^3.27.0", + "vscode": "^1.1.37" } } diff --git a/src/commands/createInitialTag.ts b/src/commands/createInitialTag.ts index af8674a..75a4eac 100644 --- a/src/commands/createInitialTag.ts +++ b/src/commands/createInitialTag.ts @@ -3,18 +3,30 @@ import { GitService } from "../services/gitService"; import { StatusBarService } from "../services/statusBarService"; import { showError } from "../utils/errorHandler"; import { updateStatusBar } from "../utils/statusBarUpdater"; +import { CIService } from "../services/ciService"; +import { checkBuildStatus } from "../utils/ciUtils"; export async function createInitialTag( gitService: GitService, statusBarService: StatusBarService, - defaultBranch: string + defaultBranch: string, + ciService: CIService ) { try { await gitService.createTagInternal("1.0.0"); + await gitService.pushTag("1.0.0"); vscode.window.showInformationMessage( "Created and pushed initial tag: 1.0.0" ); - await updateStatusBar(gitService, statusBarService, defaultBranch); + await updateStatusBar(gitService, statusBarService, defaultBranch, ciService); + + // Get owner and repo here + const { owner, repo } = await gitService.getOwnerAndRepo(); + if (!owner || !repo) { + throw new Error('Unable to determine owner and repo'); + } + + checkBuildStatus("1.0.0", owner, repo, ciService, statusBarService, gitService); } catch (error) { showError(error, "Error creating initial tag"); } diff --git a/src/commands/createTag.ts b/src/commands/createTag.ts index b99e220..fa808f4 100644 --- a/src/commands/createTag.ts +++ b/src/commands/createTag.ts @@ -4,12 +4,15 @@ import { GitService } from "../services/gitService"; import { StatusBarService } from "../services/statusBarService"; import { showError } from "../utils/errorHandler"; import { updateStatusBar } from "../utils/statusBarUpdater"; +import { CIService } from "../services/ciService"; +import { checkBuildStatus } from "../utils/ciUtils"; export async function createTag( - versionPart: "major" | "minor" | "patch", + type: "major" | "minor" | "patch", gitService: GitService, statusBarService: StatusBarService, - defaultBranch: string + defaultBranch: string, + ciService: CIService ) { try { const tags = await gitService.fetchAndTags(); @@ -20,18 +23,30 @@ export async function createTag( throw new Error("Invalid tag format."); } const [, prefix, version, suffix] = tagMatch; - const newVersion = semver.inc(version, versionPart); + const newVersion = semver.inc(version, type); if (newVersion) { - await gitService.createTagInternal( - `${prefix || ""}${newVersion}${suffix || ""}` - ); - gitService.clearCachedTags(); + const newTag = `${prefix || ""}${newVersion}${suffix || ""}`; + await gitService.createTagInternal(newTag); + + // Add a small delay to ensure the tag is created locally + await new Promise(resolve => setTimeout(resolve, 1000)); + + await gitService.pushTag(newTag); vscode.window.showInformationMessage( - `Created and pushed new tag: ${prefix || ""}${newVersion}${ - suffix || "" - }` + `Created and pushed new tag: ${newTag}` ); - await updateStatusBar(gitService, statusBarService, defaultBranch); + + // Get owner and repo here + const { owner, repo } = await gitService.getOwnerAndRepo(); + if (!owner || !repo) { + throw new Error('Unable to determine owner and repo'); + } + + // Update status bar immediately with the new tag + await updateStatusBar(gitService, statusBarService, defaultBranch, ciService); + + // Start checking build status + checkBuildStatus(newTag, owner, repo, ciService, statusBarService, gitService); } } } catch (error) { diff --git a/src/extension.ts b/src/extension.ts index 495343c..8ffba21 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -6,6 +6,8 @@ import { createTag } from "./commands/createTag"; import { createInitialTag } from "./commands/createInitialTag"; import { openCompareLink } from "./commands/openCompareLink"; import { updateStatusBar } from "./utils/statusBarUpdater"; +import { CIService } from "./services/ciService"; +import { debounce } from "./utils/debounce"; export function activate(context: vscode.ExtensionContext) { const gitService = new GitService(); @@ -18,6 +20,7 @@ export function activate(context: vscode.ExtensionContext) { ], context ); + const ciService = new CIService(); const config = vscode.workspace.getConfiguration("git-tag-release-tracker"); const defaultBranch = config.get("defaultBranch", "main"); @@ -25,46 +28,117 @@ export function activate(context: vscode.ExtensionContext) { const updateStatusBarCallback = async () => { console.log("Updating status bar..."); try { - await updateStatusBar(gitService, statusBarService, defaultBranch); + await updateStatusBar(gitService, statusBarService, defaultBranch, ciService); } catch (error) { console.log("Error updating status bar:", error); } }; - registerCommands(context, gitService, statusBarService, defaultBranch); + // Debounce the update function + const debouncedUpdateStatusBar = debounce(updateStatusBarCallback, 300); + + // Run immediately on activation + updateStatusBarCallback(); + + // Run when the active editor changes + context.subscriptions.push( + vscode.window.onDidChangeActiveTextEditor(() => { + debouncedUpdateStatusBar(); + }) + ); + + // Run when the document is saved + context.subscriptions.push( + vscode.workspace.onDidSaveTextDocument(() => { + debouncedUpdateStatusBar(); + }) + ); + + // Then run every 30 seconds + const intervalId = setInterval(updateStatusBarCallback, 30000); + + let buildStatusUrl = ''; + + registerCommands(context, gitService, statusBarService, defaultBranch, ciService); gitService.initializeGit().then(updateStatusBarCallback); - vscode.workspace.onDidSaveTextDocument(() => updateStatusBarCallback()); vscode.workspace.onDidChangeWorkspaceFolders(() => { gitService.initializeGit().then(updateStatusBarCallback); }); - vscode.window.onDidChangeActiveTextEditor(() => { - gitService.initializeGit().then(updateStatusBarCallback); - }); const intervalDisposable = createInterval(updateStatusBarCallback, 35000); context.subscriptions.push(intervalDisposable); + + context.subscriptions.push( + vscode.commands.registerCommand('extension.openBuildStatus', () => { + if (buildStatusUrl) { + vscode.env.openExternal(vscode.Uri.parse(buildStatusUrl)); + } else { + vscode.window.showErrorMessage('No build status URL available.'); + } + }) + ); + + context.subscriptions.push( + vscode.commands.registerCommand('gitTagReleaseTracker._buildStatusUrl', (url: string) => { + buildStatusUrl = url; + }) + ); + + context.subscriptions.push( + vscode.commands.registerCommand('gitTagReleaseTracker.getBuildStatusUrl', () => { + return vscode.commands.executeCommand('gitTagReleaseTracker._buildStatusUrl'); + }) + ); + + context.subscriptions.push( + vscode.commands.registerCommand('extension.createAndPushVersionTag', async (version: string) => { + try { + const { owner, repo } = await gitService.getOwnerAndRepo(); + if (!owner || !repo) { + throw new Error('Unable to determine owner and repo'); + } + + await gitService.createTagInternal(version); + + // Update status bar after pushing the tag + await updateStatusBar(gitService, statusBarService, defaultBranch, ciService); + + vscode.window.showInformationMessage(`Version ${version} tag created and pushed successfully.`); + + // Start polling for build status + pollBuildStatus(version, gitService, statusBarService, ciService); + } catch (error) { + vscode.window.showErrorMessage(`Failed to create and push version tag: ${error.message}`); + } + }) + ); + + context.subscriptions.push({ + dispose: () => clearInterval(intervalId) + }); } function registerCommands( context: vscode.ExtensionContext, gitService: GitService, statusBarService: StatusBarService, - defaultBranch: string + defaultBranch: string, + ciService: CIService ) { context.subscriptions.push( vscode.commands.registerCommand("extension.createMajorTag", () => - createTag("major", gitService, statusBarService, defaultBranch) + createTag("major", gitService, statusBarService, defaultBranch, ciService) ), vscode.commands.registerCommand("extension.createMinorTag", () => - createTag("minor", gitService, statusBarService, defaultBranch) + createTag("minor", gitService, statusBarService, defaultBranch, ciService) ), vscode.commands.registerCommand("extension.createPatchTag", () => - createTag("patch", gitService, statusBarService, defaultBranch) + createTag("patch", gitService, statusBarService, defaultBranch, ciService) ), vscode.commands.registerCommand("extension.createInitialTag", () => - createInitialTag(gitService, statusBarService, defaultBranch) + createInitialTag(gitService, statusBarService, defaultBranch, ciService) ), vscode.commands.registerCommand("extension.openCompareLink", () => openCompareLink(gitService, statusBarService) @@ -73,3 +147,37 @@ function registerCommands( } export function deactivate() {} + +async function pollBuildStatus(tag: string, gitService: GitService, statusBarService: StatusBarService, ciService: CIService, maxAttempts = 30) { + const ciType = gitService.detectCIType(); + if (!ciType) { + console.log('No CI configuration detected, skipping build status check'); + return; + } + + let attempts = 0; + const pollInterval = setInterval(async () => { + attempts++; + try { + const { owner, repo } = await gitService.getOwnerAndRepo(); + if (!owner || !repo) { + throw new Error('Unable to determine owner and repo'); + } + + const { status, url } = await ciService.getBuildStatus(tag, owner, repo, ciType); + console.log(`pollBuildStatus received status: ${status} for tag: ${tag}`); + statusBarService.updateBuildStatus(status, tag, url); + vscode.commands.executeCommand('gitTagReleaseTracker._buildStatusUrl', url); + + if (['completed', 'success', 'failure', 'cancelled', 'action_required', 'neutral', 'skipped', 'stale', 'timed_out'].includes(status) || attempts >= maxAttempts) { + console.log(`Stopping poll for tag ${tag} with final status: ${status}`); + clearInterval(pollInterval); + } + } catch (error) { + console.error('Error polling build status:', error); + if (attempts >= maxAttempts) { + clearInterval(pollInterval); + } + } + }, 10000); // Poll every 10 seconds +} \ No newline at end of file diff --git a/src/services/ciService.ts b/src/services/ciService.ts new file mode 100644 index 0000000..b17f7ff --- /dev/null +++ b/src/services/ciService.ts @@ -0,0 +1,167 @@ +import * as vscode from 'vscode'; +import axios, { AxiosError } from 'axios'; + +export class CIService { + private token: string; + private apiUrl: string; + + constructor() { + const config = vscode.workspace.getConfiguration('gitTagReleaseTracker'); + this.token = config.get('ciToken', ''); + this.apiUrl = config.get('ciApiUrl', ''); + + console.log('CIService initialized:'); + console.log('API URL:', this.apiUrl); + console.log('Token set:', !!this.token); + } + + async getBuildStatus(tag: string, owner: string, repo: string, ciType?: 'github' | 'gitlab'): Promise<{ status: string, url: string, message?: string }> { + console.log('getBuildStatus called with:', { tag, owner, repo, ciType }); + + if (!this.token || !this.apiUrl) { + console.error('CI Token or API URL is not set. Please check your settings.'); + return { status: 'unknown', url: '', message: 'CI Token or API URL is not set. Please check your settings.' }; + } + + if (!owner || !repo) { + console.error('Owner or repo is not provided:', { owner, repo }); + return { status: 'unknown', url: '', message: 'Unable to determine owner and repo.' }; + } + + if (!ciType) { + console.log('CI type not provided, build status check disabled'); + return { status: 'unknown', url: '', message: 'CI type not detected, build status check disabled' }; + } + + try { + if (ciType === 'github') { + return await this.getGitHubBuildStatus(tag, owner, repo); + } else if (ciType === 'gitlab') { + return await this.getGitLabBuildStatus(tag, owner, repo); + } else { + throw new Error('Unsupported CI type'); + } + } catch (error) { + console.error('Error fetching build status:', error); + let message = 'An error occurred while fetching the build status.'; + if (error instanceof AxiosError && error.response?.status === 401) { + message = 'Authentication failed. Please check your CI token in the settings.'; + } + return { + status: 'error', + url: ciType === 'github' + ? `https://github.com/${owner}/${repo}/actions` + : `${this.apiUrl}/${owner}/${repo}/-/pipelines`, + message + }; + } + } + + private async getGitHubBuildStatus(tag: string, owner: string, repo: string): Promise<{ status: string, url: string, message?: string }> { + const workflowsUrl = `${this.apiUrl}/repos/${owner}/${repo}/actions/workflows`; + console.log('Fetching workflows from:', workflowsUrl); + + const workflowsResponse = await axios.get(workflowsUrl, { + headers: { + Authorization: `Bearer ${this.token}`, + Accept: 'application/vnd.github+json', + 'X-GitHub-Api-Version': '2022-11-28' + } + }); + + console.log('Workflows response:', workflowsResponse.data); + + if (workflowsResponse.data.total_count === 0) { + console.log('No workflows found in the repository.'); + return { status: 'unknown', url: `https://github.com/${owner}/${repo}/actions` }; + } + + const workflowId = workflowsResponse.data.workflows[0].id; + const runsUrl = `${this.apiUrl}/repos/${owner}/${repo}/actions/workflows/${workflowId}/runs`; + console.log('Fetching runs from:', runsUrl); + + const runsResponse = await axios.get(runsUrl, { + headers: { + Authorization: `Bearer ${this.token}`, + Accept: 'application/vnd.github+json', + 'X-GitHub-Api-Version': '2022-11-28' + }, + params: { + branch: tag, + per_page: 1 + } + }); + + console.log('Runs response:', runsResponse.data); + + if (runsResponse.data.total_count === 0) { + console.log(`No runs found for tag: ${tag}`); + return { + status: 'pending', + url: `https://github.com/${owner}/${repo}/actions`, + message: `No runs found for tag: ${tag}` + }; + } + + const latestRun = runsResponse.data.workflow_runs[0]; + const status = latestRun.status === 'completed' ? latestRun.conclusion : latestRun.status; + console.log(`GitHub CI returning status: ${status} for tag: ${tag}`); + return { + status: status, + url: latestRun.html_url, + message: `GitHub CI returning status: ${status} for tag: ${tag}` + }; + } + + private async getGitLabBuildStatus(tag: string, owner: string, repo: string): Promise<{ status: string, url: string, message?: string }> { + const projectId = encodeURIComponent(`${owner}/${repo}`); + const pipelinesUrl = `${this.apiUrl}/api/v4/projects/${projectId}/pipelines`; + console.log('Fetching pipelines from:', pipelinesUrl); + + const pipelinesResponse = await axios.get(pipelinesUrl, { + headers: { + 'PRIVATE-TOKEN': this.token + }, + params: { + ref: tag, + order_by: 'id', + sort: 'desc', + per_page: 1 + } + }); + + console.log('Pipelines response:', pipelinesResponse.data); + + if (pipelinesResponse.data.length === 0) { + console.log(`No pipelines found for tag: ${tag}`); + return { + status: 'pending', + url: `${this.apiUrl}/${owner}/${repo}/-/pipelines`, + message: `No pipelines found for tag: ${tag}` + }; + } + + const latestPipeline = pipelinesResponse.data[0]; + const status = this.mapGitLabStatus(latestPipeline.status); + console.log(`GitLab CI returning status: ${status} for tag: ${tag}`); + return { + status: status, + url: `${this.apiUrl}/${owner}/${repo}/-/pipelines/${latestPipeline.id}`, + message: `GitLab CI returning status: ${status} for tag: ${tag}` + }; + } + + private mapGitLabStatus(gitlabStatus: string): string { + switch (gitlabStatus) { + case 'success': return 'success'; + case 'failed': return 'failure'; + case 'canceled': return 'cancelled'; + case 'skipped': return 'skipped'; + case 'running': return 'in_progress'; + case 'pending': return 'pending'; + case 'created': return 'queued'; + case 'manual': return 'action_required'; + default: return 'unknown'; + } + } +} \ No newline at end of file diff --git a/src/services/gitService.ts b/src/services/gitService.ts index c35e58a..092fd4f 100644 --- a/src/services/gitService.ts +++ b/src/services/gitService.ts @@ -12,6 +12,7 @@ export class GitService { private git: SimpleGit | undefined; private currentBranch = ""; private currentRepo = ""; + private currentRepoPath = ""; private cachedTags: TagResult | null = null; constructor() { @@ -25,32 +26,59 @@ export class GitService { vscode.workspace.onDidSaveTextDocument(() => this.initializeGit()); } - public async initializeGit() { + public async initializeGit(): Promise { const activeEditor = vscode.window.activeTextEditor; - if (activeEditor) { - const filePath = activeEditor.document.uri.fsPath; - const workspaceFolder = vscode.workspace.getWorkspaceFolder( - activeEditor.document.uri - ); - if (workspaceFolder && isGitDirectory(workspaceFolder.uri.fsPath)) { - this.git = simpleGit({ baseDir: workspaceFolder.uri.fsPath }); - this.cachedTags = null; // Clear cached tags when initializing a new repository - console.log("Git initialized for:", workspaceFolder.uri.fsPath); - await this.getRemotes(); // Update currentRepo - } else { + if (!activeEditor) { + return false; + } + + const filePath = activeEditor.document.uri.fsPath; + const workspaceFolder = vscode.workspace.getWorkspaceFolder(activeEditor.document.uri); + + if (!workspaceFolder) { + return false; + } + + const newRepoPath = workspaceFolder.uri.fsPath; + if (this.currentRepoPath === newRepoPath && this.git) { + return false; // No change in repository + } + + this.currentRepoPath = newRepoPath; + this.git = simpleGit({ baseDir: this.currentRepoPath }); + + try { + const isRepo = await this.git.checkIsRepo(); + if (!isRepo) { this.git = undefined; - console.log("No Git repository found in the workspace."); + this.currentRepoPath = ""; + return false; } - } else { + } catch (error) { + console.error("Error checking if directory is a git repository:", error); this.git = undefined; - console.log("No active editor found."); + this.currentRepoPath = ""; + return false; } + + this.cachedTags = null; + this.currentBranch = ""; + this.currentRepo = path.basename(this.currentRepoPath); + console.log("Git initialized for:", this.currentRepoPath); + await this.getRemotes(); + return true; } - public async createTagInternal(tag: string) { - if (this.git) { + public async createTagInternal(tag: string): Promise { + if (!this.git) { + throw new Error("Git is not initialized"); + } + try { await this.git.addTag(tag); - await this.git.pushTags(); + console.log(`Tag ${tag} created locally`); + } catch (error) { + console.error(`Error creating tag ${tag}:`, error); + throw error; } } @@ -72,17 +100,15 @@ export class GitService { if (!this.git) { return null; } - if (!this.cachedTags) { - try { - await this.git.fetch(["--prune", "--prune-tags"]); - this.cachedTags = await this.git.tags(); - console.log("Tags fetched:", this.cachedTags); - } catch (error) { - console.log("Error fetching tags:", error); - return null; - } + try { + await this.git.fetch(["--prune", "--prune-tags"]); + this.cachedTags = await this.git.tags(); + console.log("Tags fetched:", this.cachedTags); + return this.cachedTags; + } catch (error) { + console.log("Error fetching tags:", error); + return null; } - return this.cachedTags; } public async getCommits( @@ -107,6 +133,19 @@ export class GitService { } } + public async getUnreleasedCommits(latestTag: string, currentBranch: string): Promise { + if (!this.git) { + return 0; + } + try { + const result = await this.git.raw(['rev-list', '--count', `${latestTag}..${currentBranch}`]); + return parseInt(result.trim(), 10); + } catch (error) { + console.error('Error getting unreleased commits:', error); + return 0; + } + } + public getCurrentBranch() { return this.currentBranch; } @@ -132,6 +171,94 @@ export class GitService { public clearCachedTags() { this.cachedTags = null; } + + public async pushTag(tag: string): Promise { + if (!this.git) { + throw new Error("Git is not initialized"); + } + try { + await this.git.push('origin', tag); + console.log(`Tag ${tag} pushed to remote`); + } catch (error) { + console.error(`Error pushing tag ${tag}:`, error); + throw error; + } + } + + async getRemoteUrl(): Promise { + try { + const remotes = await this.git.getRemotes(true); + console.log('All remotes:', remotes); + const originRemote = remotes.find(remote => remote.name === 'origin'); + if (originRemote) { + console.log('Origin remote:', originRemote); + return originRemote.refs.push || originRemote.refs.fetch || ''; + } + return ''; + } catch (error) { + console.error('Error getting remote URL:', error); + return ''; + } + } + + async getOwnerAndRepo(): Promise<{ owner: string, repo: string }> { + try { + const remoteUrl = await this.getRemoteUrl(); + console.log('Remote URL:', remoteUrl); + + // Use a regex that handles URLs with authentication tokens + const match = remoteUrl.match(/(?:https?:\/\/(?:[^@]+@)?github\.com\/|git@github\.com:)([^\/]+)\/([^\/\.]+)(?:\.git)?/); + + if (match) { + const [, owner, repo] = match; + console.log('Extracted owner and repo:', { owner, repo }); + return { owner, repo }; + } else { + throw new Error(`Unable to extract owner and repo from remote URL: ${remoteUrl}`); + } + } catch (error) { + console.error('Error getting owner and repo:', error); + throw error; + } + } + + public async hasCIConfiguration(): Promise<'github' | 'gitlab' | null> { + if (!this.currentRepoPath) { + return null; + } + + const githubWorkflowsPath = path.join(this.currentRepoPath, '.github', 'workflows'); + const gitlabCIPath = path.join(this.currentRepoPath, '.gitlab-ci.yml'); + + try { + if (fs.existsSync(githubWorkflowsPath) && fs.statSync(githubWorkflowsPath).isDirectory()) { + return 'github'; + } else if (fs.existsSync(gitlabCIPath) && fs.statSync(gitlabCIPath).isFile()) { + return 'gitlab'; + } + } catch (error) { + console.error('Error checking CI configuration:', error); + } + + return null; + } + + public detectCIType(): 'github' | 'gitlab' | null { + if (!this.currentRepoPath) { + return null; + } + + const githubWorkflowsPath = path.join(this.currentRepoPath, '.github', 'workflows'); + const gitlabCIPath = path.join(this.currentRepoPath, '.gitlab-ci.yml'); + + if (fs.existsSync(githubWorkflowsPath) && fs.statSync(githubWorkflowsPath).isDirectory()) { + return 'github'; + } else if (fs.existsSync(gitlabCIPath) && fs.statSync(gitlabCIPath).isFile()) { + return 'gitlab'; + } + + return null; + } } function isGitDirectory(dir: string): boolean { @@ -141,4 +268,4 @@ function isGitDirectory(dir: string): boolean { console.log("Error checking Git directory:", error); return false; } -} +} \ No newline at end of file diff --git a/src/services/statusBarService.ts b/src/services/statusBarService.ts index 8465906..057c23d 100644 --- a/src/services/statusBarService.ts +++ b/src/services/statusBarService.ts @@ -1,34 +1,87 @@ import * as vscode from "vscode"; export class StatusBarService { - private statusBar: vscode.StatusBarItem; + private statusBarItem: vscode.StatusBarItem; + private buildStatusItem: vscode.StatusBarItem; private buttons: vscode.StatusBarItem[]; + private lastCheckedBuildStatus: { tag: string, status: string } = { tag: '', status: '' }; + private lastBuildStatus: { tag: string; status: string; url: string } | null = null; - constructor(buttonCommands: string[], context: vscode.ExtensionContext) { - const priorities = [100, 99, 98, 97, 96]; - this.statusBar = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Left, - priorities[0] - ); - - this.buttons = buttonCommands.slice(0, 3).map((command, index) => { - const button = vscode.window.createStatusBarItem( - vscode.StatusBarAlignment.Left, - priorities[index + 1] - ); + constructor(buttonCommands: string[], private context: vscode.ExtensionContext) { + this.statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100); + this.buildStatusItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 99); + this.buildStatusItem.command = 'extension.openBuildStatus'; + this.buttons = buttonCommands.map((command, index) => { + const button = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 98 - index); button.command = command; - context.subscriptions.push(button); return button; }); - - context.subscriptions.push(this.statusBar, ...this.buttons); + this.context.subscriptions.push(this.statusBarItem, this.buildStatusItem, ...this.buttons); } updateStatusBar(text: string, tooltip: string, command?: string) { - this.statusBar.text = text; - this.statusBar.tooltip = tooltip; - this.statusBar.command = command; - this.statusBar.show(); + this.statusBarItem.text = text; + this.statusBarItem.tooltip = tooltip; + if (command) { + this.statusBarItem.command = command; + } + this.statusBarItem.show(); + } + + updateBuildStatus(status: string, tag: string, url: string) { + console.log(`StatusBarService received status: ${status} for tag: ${tag}`); + this.lastBuildStatus = { tag, status, url }; + this.renderBuildStatus(); + } + + private renderBuildStatus() { + if (!this.lastBuildStatus) { + this.buildStatusItem.hide(); + return; + } + + const { status, tag } = this.lastBuildStatus; + switch (status) { + case 'success': + this.buildStatusItem.text = '$(check)'; + this.buildStatusItem.tooltip = 'Build successful'; + break; + case 'failure': + case 'cancelled': + case 'timed_out': + this.buildStatusItem.text = '$(x)'; + this.buildStatusItem.tooltip = `Build ${status}`; + break; + case 'action_required': + this.buildStatusItem.text = '$(alert)'; + this.buildStatusItem.tooltip = 'Action required'; + break; + case 'neutral': + case 'skipped': + this.buildStatusItem.text = '$(dash)'; + this.buildStatusItem.tooltip = `Build ${status}`; + break; + case 'stale': + this.buildStatusItem.text = '$(clock)'; + this.buildStatusItem.tooltip = 'Build stale'; + break; + case 'in_progress': + case 'queued': + case 'requested': + case 'waiting': + case 'pending': + this.buildStatusItem.text = '$(sync~spin)'; + this.buildStatusItem.tooltip = 'Build in progress'; + break; + default: + this.buildStatusItem.text = '$(question)'; + this.buildStatusItem.tooltip = 'Build status unknown'; + } + this.buildStatusItem.show(); + } + + hideBuildStatus() { + this.buildStatusItem.hide(); } hideButtons() { @@ -45,4 +98,21 @@ export class StatusBarService { button.tooltip = tooltip; button.show(); } + + getLastCheckedBuildStatus() { + return this.lastCheckedBuildStatus; + } + + getLastBuildStatus() { + return this.lastBuildStatus; + } + + clearStatusBar() { + this.statusBarItem.text = ""; + this.statusBarItem.tooltip = ""; + this.statusBarItem.command = undefined; + this.buildStatusItem.hide(); + this.hideButtons(); + this.lastBuildStatus = null; + } } diff --git a/src/utils/ciUtils.ts b/src/utils/ciUtils.ts new file mode 100644 index 0000000..640986c --- /dev/null +++ b/src/utils/ciUtils.ts @@ -0,0 +1,41 @@ +import { CIService } from "../services/ciService"; +import { StatusBarService } from "../services/statusBarService"; +import * as vscode from "vscode"; + +export async function checkBuildStatus( + tag: string, + owner: string, + repo: string, + ciService: CIService, + statusBarService: StatusBarService, + gitService: GitService +) { + const ciType = gitService.detectCIType(); + if (!ciType) { + console.log('No CI configuration detected, skipping build status check'); + return; + } + + let status = 'pending'; + let attempts = 0; + const maxAttempts = 30; // Check for 5 minutes (30 * 10 seconds) + + while ((status === 'pending' || status === 'in_progress' || status === 'queued') && attempts < maxAttempts) { + try { + const result = await ciService.getBuildStatus(tag, owner, repo, ciType); + status = result.status; + statusBarService.updateBuildStatus(status, tag, result.url); + vscode.commands.executeCommand('gitTagReleaseTracker._buildStatusUrl', result.url); + } catch (error) { + console.error('Error checking build status:', error); + status = 'error'; + } + await new Promise(resolve => setTimeout(resolve, 10000)); // Wait for 10 seconds + attempts++; + } + + if (attempts >= maxAttempts) { + console.log(`Build status check timed out for tag ${tag}`); + statusBarService.updateBuildStatus('timeout', tag, ''); + } +} \ No newline at end of file diff --git a/src/utils/debounce.ts b/src/utils/debounce.ts new file mode 100644 index 0000000..6c3e87a --- /dev/null +++ b/src/utils/debounce.ts @@ -0,0 +1,13 @@ +export function debounce any>( + func: F, + waitFor: number + ): (...args: Parameters) => void { + let timeout: NodeJS.Timeout | null = null; + + return (...args: Parameters): void => { + if (timeout !== null) { + clearTimeout(timeout); + } + timeout = setTimeout(() => func(...args), waitFor); + }; + } \ No newline at end of file diff --git a/src/utils/errorHandler.ts b/src/utils/errorHandler.ts index 75b2d8e..9af7493 100644 --- a/src/utils/errorHandler.ts +++ b/src/utils/errorHandler.ts @@ -1,9 +1,12 @@ import * as vscode from "vscode"; -export function showError(error: unknown, message: string) { - if (error instanceof Error) { - vscode.window.showErrorMessage(`${message}: ${error.message}`); - } else { - vscode.window.showErrorMessage(`${message}: An unknown error occurred.`); +export function showError(error: any, context: string) { + console.error(`${context}:`, error); + let errorMessage = error.message || String(error); + + if (errorMessage.includes("src refspec") && errorMessage.includes("does not match any")) { + errorMessage = "Failed to push the tag. Please try again in a few seconds."; } + + vscode.window.showErrorMessage(`${context}: ${errorMessage}`); } diff --git a/src/utils/statusBarUpdater.ts b/src/utils/statusBarUpdater.ts index a4c30aa..91bc4de 100644 --- a/src/utils/statusBarUpdater.ts +++ b/src/utils/statusBarUpdater.ts @@ -3,23 +3,53 @@ import { GitService } from "../services/gitService"; import { StatusBarService } from "../services/statusBarService"; import { showError } from "./errorHandler"; import * as semver from "semver"; +import { CIService } from "../services/ciService"; + +interface BuildStatusCache { + [key: string]: { status: string; url: string; tag: string }; +} + +const buildStatusCache: BuildStatusCache = {}; + +const temporaryGitHubStatuses = ['action_required', 'in_progress', 'queued', 'requested', 'waiting', 'pending']; +const temporaryGitLabStatuses = ['waiting_for_resource', 'preparing', 'pending', 'running', 'scheduled']; + +function isTemporaryStatus(status: string): boolean { + return temporaryGitHubStatuses.includes(status) || temporaryGitLabStatuses.includes(status) || status === 'unknown'; +} export async function updateStatusBar( gitService: GitService, statusBarService: StatusBarService, - defaultBranch: string + defaultBranch: string, + ciService: CIService ) { if (!gitService) { return; } - console.log("Fetching and tags..."); try { + console.log("Initializing Git..."); + const repoChanged = await gitService.initializeGit(); + + if (repoChanged) { + // Clear the status bar when switching repositories + statusBarService.clearStatusBar(); + } + + if (!gitService.getCurrentRepo()) { + console.log("No Git repository detected."); + statusBarService.clearStatusBar(); + return; + } + + console.log("Fetching tags..."); const tagsResult = await gitService.fetchAndTags(); const branchDetected = await gitService.detectBranch(); if (!branchDetected) { console.log("No branch detected."); + statusBarService.clearStatusBar(); return; } @@ -48,6 +78,7 @@ export async function updateStatusBar( } else { console.log("No commits found for the entire branch"); } + statusBarService.updateBuildStatus('unknown', 'N/A', ''); return; } @@ -60,25 +91,28 @@ export async function updateStatusBar( const tooltip = "No version tag with semantic versioning found"; statusBarService.updateStatusBar(statusBarText, tooltip); statusBarService.hideButtons(); + statusBarService.updateBuildStatus('unknown', 'N/A', ''); return; } const [, prefix, major, minor, patch, suffix] = tagMatch; - const commits = await gitService.getCommits( - tagsResult.latest, - currentBranch - ); - if (!commits) { - return; - } + const latestTag = tagsResult.latest; + const unreleasedCommits = await gitService.getUnreleasedCommits(latestTag, currentBranch); const latestVersion = `${prefix}${major}.${minor}.${patch}${suffix}`; - const statusBarText = `${currentRepo}/${currentBranch} | ${commits.total} unreleased commits | ${latestVersion}`; - const tooltip = `${commits.total} unreleased commits for ${currentRepo}/${currentBranch} | Latest version: ${latestVersion}`; + const statusBarText = `${currentRepo}/${currentBranch} | ${unreleasedCommits} unreleased commits | ${latestVersion}`; + const tooltip = `${unreleasedCommits} unreleased commits for ${currentRepo}/${currentBranch} | Latest version: ${latestVersion}`; statusBarService.updateStatusBar(statusBarText, tooltip); - if (currentBranch === defaultBranch && commits.total > 0) { + if (currentBranch === defaultBranch && unreleasedCommits > 0) { + statusBarService.updateStatusBar( + statusBarText, + tooltip, + "extension.openCompareLink" + ); + + // Update version buttons statusBarService.updateButton( 0, `${semver.inc(`${major}.${minor}.${patch}`, "major")}`, @@ -108,7 +142,59 @@ export async function updateStatusBar( statusBarService.hideButtons(); } - if (commits.total > 0) { + // Check if CI configuration exists + const ciType = await gitService.hasCIConfiguration(); + + // Check build status only if CI configuration exists + if (ciType) { + const cachedStatus = buildStatusCache[currentRepo]; + if (repoChanged || !cachedStatus || cachedStatus.tag !== latestTag || isTemporaryStatus(cachedStatus.status)) { + try { + console.log('Fetching owner and repo...'); + const { owner, repo } = await gitService.getOwnerAndRepo(); + console.log('Owner and repo:', { owner, repo }); + + if (!owner || !repo) { + throw new Error('Unable to determine owner and repo'); + } + + console.log('Fetching build status...'); + const { status, url, message } = await ciService.getBuildStatus(latestTag, owner, repo, ciType); + console.log(`Build status received in updateStatusBar: ${status}`); + + if (message && status === 'error') { + vscode.window.showErrorMessage(message); + } + + if (!isTemporaryStatus(status)) { + buildStatusCache[currentRepo] = { status, url, tag: latestTag }; + } + statusBarService.updateBuildStatus(status, latestTag, url); + vscode.commands.executeCommand('gitTagReleaseTracker._buildStatusUrl', url); + } catch (error) { + console.error('Error updating build status:', error); + statusBarService.updateBuildStatus('error', latestTag, ''); + // Set a default URL even in case of an error + const { owner, repo } = await gitService.getOwnerAndRepo(); + const defaultUrl = ciType === 'github' + ? `https://github.com/${owner}/${repo}/actions` + : `https://gitlab.com/${owner}/${repo}/-/pipelines`; + vscode.commands.executeCommand('gitTagReleaseTracker._buildStatusUrl', defaultUrl); + vscode.window.showErrorMessage('Error fetching build status. Please check your CI configuration and token.'); + } + } else { + console.log('Using cached build status'); + const { status, url, tag } = cachedStatus; + statusBarService.updateBuildStatus(status, tag, url); + vscode.commands.executeCommand('gitTagReleaseTracker._buildStatusUrl', url); + } + } else { + // Clear build status if no CI configuration is found + statusBarService.updateBuildStatus('', '', ''); + vscode.commands.executeCommand('gitTagReleaseTracker._buildStatusUrl', ''); + } + + if (unreleasedCommits > 0) { statusBarService.updateStatusBar( statusBarText, tooltip, @@ -119,6 +205,7 @@ export async function updateStatusBar( } } catch (error) { console.log("Error updating status bar:", error); + statusBarService.clearStatusBar(); showError(error, "Error fetching git data"); } -} +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 8a79f20..0865347 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,16 +1,20 @@ { "compilerOptions": { - "module": "Node16", - "target": "ES2022", - "lib": [ - "ES2022" - ], - "sourceMap": true, - "rootDir": "src", - "strict": true /* enable all strict type-checking options */ - /* Additional Checks */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ + "module": "Node16", + "target": "ES2022", + "lib": [ + "ES2022" + ], + "sourceMap": true, + "rootDir": "src", + "outDir": "out", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true + /* Additional Checks */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ } -} + } + \ No newline at end of file